blob: 84e827ad8cd66c75b27ebc5df649733be5859b79 [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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00008
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000010/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000011
12static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000015 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
16 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000017}
18
Guido van Rossum052b7e11996-11-11 15:08:19 +000019static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000020null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 if (!PyErr_Occurred())
23 PyErr_SetString(PyExc_SystemError,
24 "null argument to internal routine");
25 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000026}
27
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000028/* Operations on any object */
29
Guido van Rossume15dee51995-07-18 14:12:02 +000030PyObject *
Fred Drake79912472000-07-09 04:06:11 +000031PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 if (o == NULL)
36 return null_error();
37 v = (PyObject *)o->ob_type;
38 Py_INCREF(v);
39 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000040}
41
Martin v. Löwis18e16552006-02-15 17:27:45 +000042Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000043PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 if (o == NULL) {
48 null_error();
49 return -1;
50 }
Guido van Rossume15dee51995-07-18 14:12:02 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 m = o->ob_type->tp_as_sequence;
53 if (m && m->sq_length)
54 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000057}
58
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000059#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000060Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000061PyObject_Length(PyObject *o)
62{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000064}
65#define PyObject_Length PyObject_Size
66
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020067int
68_PyObject_HasLen(PyObject *o) {
69 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
70 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
71}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000072
Christian Heimes255f53b2007-12-08 15:33:56 +000073/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020074 or o.__length_hint__(). If those methods aren't found. If one of the calls
75 fails this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000076*/
77
78Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020079PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000080{
Christian Heimesb70e8a12012-10-06 17:16:39 +020081 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020082 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050083 _Py_IDENTIFIER(__length_hint__);
Christian Heimes6314d162012-10-06 17:13:29 +020084 res = PyObject_Length(o);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020085 if (res < 0 && PyErr_Occurred()) {
86 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020088 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 PyErr_Clear();
90 }
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020091 else {
92 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 }
Christian Heimes6314d162012-10-06 17:13:29 +020094 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020095 if (hint == NULL) {
96 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020098 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 return defaultvalue;
100 }
Christian Heimesb70e8a12012-10-06 17:16:39 +0200101 result = PyObject_CallFunctionObjArgs(hint, NULL);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200102 Py_DECREF(hint);
103 if (result == NULL) {
104 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
105 PyErr_Clear();
106 return defaultvalue;
107 }
108 return -1;
109 }
110 else if (result == Py_NotImplemented) {
111 Py_DECREF(result);
112 return defaultvalue;
113 }
114 if (!PyLong_Check(result)) {
115 PyErr_Format(PyExc_TypeError, "Length hint must be an integer, not %s",
116 Py_TYPE(result)->tp_name);
117 Py_DECREF(result);
118 return -1;
119 }
120 defaultvalue = PyLong_AsSsize_t(result);
121 Py_DECREF(result);
122 if (defaultvalue < 0 && PyErr_Occurred()) {
123 return -1;
124 }
125 if (defaultvalue < 0) {
126 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
127 return -1;
128 }
129 return defaultvalue;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000130}
131
Guido van Rossume15dee51995-07-18 14:12:02 +0000132PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000133PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 if (o == NULL || key == NULL)
138 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 m = o->ob_type->tp_as_mapping;
141 if (m && m->mp_subscript)
142 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 if (o->ob_type->tp_as_sequence) {
145 if (PyIndex_Check(key)) {
146 Py_ssize_t key_value;
147 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
148 if (key_value == -1 && PyErr_Occurred())
149 return NULL;
150 return PySequence_GetItem(o, key_value);
151 }
152 else if (o->ob_type->tp_as_sequence->sq_item)
153 return type_error("sequence index must "
154 "be integer, not '%.200s'", key);
155 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000158}
159
160int
Fred Drake79912472000-07-09 04:06:11 +0000161PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 if (o == NULL || key == NULL || value == NULL) {
166 null_error();
167 return -1;
168 }
169 m = o->ob_type->tp_as_mapping;
170 if (m && m->mp_ass_subscript)
171 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 if (o->ob_type->tp_as_sequence) {
174 if (PyIndex_Check(key)) {
175 Py_ssize_t key_value;
176 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
177 if (key_value == -1 && PyErr_Occurred())
178 return -1;
179 return PySequence_SetItem(o, key_value, value);
180 }
181 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
182 type_error("sequence index must be "
183 "integer, not '%.200s'", key);
184 return -1;
185 }
186 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 type_error("'%.200s' object does not support item assignment", o);
189 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000190}
191
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000192int
Fred Drake79912472000-07-09 04:06:11 +0000193PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 if (o == NULL || key == NULL) {
198 null_error();
199 return -1;
200 }
201 m = o->ob_type->tp_as_mapping;
202 if (m && m->mp_ass_subscript)
203 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 if (o->ob_type->tp_as_sequence) {
206 if (PyIndex_Check(key)) {
207 Py_ssize_t key_value;
208 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
209 if (key_value == -1 && PyErr_Occurred())
210 return -1;
211 return PySequence_DelItem(o, key_value);
212 }
213 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
214 type_error("sequence index must be "
215 "integer, not '%.200s'", key);
216 return -1;
217 }
218 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 type_error("'%.200s' object does not support item deletion", o);
221 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000222}
223
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000224int
225PyObject_DelItemString(PyObject *o, char *key)
226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 PyObject *okey;
228 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 if (o == NULL || key == NULL) {
231 null_error();
232 return -1;
233 }
234 okey = PyUnicode_FromString(key);
235 if (okey == NULL)
236 return -1;
237 ret = PyObject_DelItem(o, okey);
238 Py_DECREF(okey);
239 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000240}
241
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000242/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000243 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000244 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000245int
246PyObject_AsCharBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 const char **buffer,
248 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 PyBufferProcs *pb;
251 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
254 null_error();
255 return -1;
256 }
257 pb = obj->ob_type->tp_as_buffer;
258 if (pb == NULL || pb->bf_getbuffer == NULL) {
259 PyErr_SetString(PyExc_TypeError,
Victor Stinnerf2a94212011-05-30 23:21:30 +0200260 "expected bytes, bytearray "
261 "or buffer compatible object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 return -1;
263 }
264 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 *buffer = view.buf;
267 *buffer_len = view.len;
268 if (pb->bf_releasebuffer != NULL)
269 (*pb->bf_releasebuffer)(obj, &view);
270 Py_XDECREF(view.obj);
271 return 0;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000272}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000273
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000274int
275PyObject_CheckReadBuffer(PyObject *obj)
276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
278 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 if (pb == NULL ||
281 pb->bf_getbuffer == NULL)
282 return 0;
283 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
284 PyErr_Clear();
285 return 0;
286 }
287 PyBuffer_Release(&view);
288 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289}
290
291int PyObject_AsReadBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 const void **buffer,
293 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 PyBufferProcs *pb;
296 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
299 null_error();
300 return -1;
301 }
302 pb = obj->ob_type->tp_as_buffer;
303 if (pb == NULL ||
304 pb->bf_getbuffer == NULL) {
305 PyErr_SetString(PyExc_TypeError,
306 "expected an object with a buffer interface");
307 return -1;
308 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE)) return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 *buffer = view.buf;
313 *buffer_len = view.len;
314 if (pb->bf_releasebuffer != NULL)
315 (*pb->bf_releasebuffer)(obj, &view);
316 Py_XDECREF(view.obj);
317 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000318}
319
320int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 void **buffer,
322 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 PyBufferProcs *pb;
325 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
328 null_error();
329 return -1;
330 }
331 pb = obj->ob_type->tp_as_buffer;
332 if (pb == NULL ||
333 pb->bf_getbuffer == NULL ||
334 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
335 PyErr_SetString(PyExc_TypeError,
336 "expected an object with a writable buffer interface");
337 return -1;
338 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 *buffer = view.buf;
341 *buffer_len = view.len;
342 if (pb->bf_releasebuffer != NULL)
343 (*pb->bf_releasebuffer)(obj, &view);
344 Py_XDECREF(view.obj);
345 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000346}
347
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000348/* Buffer C-API for Python 3.0 */
349
350int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000351PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 if (!PyObject_CheckBuffer(obj)) {
354 PyErr_Format(PyExc_TypeError,
Victor Stinner0a5f65a2011-03-22 01:09:21 +0100355 "'%.100s' does not support the buffer interface",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 Py_TYPE(obj)->tp_name);
357 return -1;
358 }
359 return (*(obj->ob_type->tp_as_buffer->bf_getbuffer))(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000360}
361
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000362static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100363_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 Py_ssize_t sd, dim;
366 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (view->ndim == 0) return 1;
369 if (view->strides == NULL) return (view->ndim == 1);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 sd = view->itemsize;
372 if (view->ndim == 1) return (view->shape[0] == 1 ||
373 sd == view->strides[0]);
374 for (i=0; i<view->ndim; i++) {
375 dim = view->shape[i];
376 if (dim == 0) return 1;
377 if (view->strides[i] != sd) return 0;
378 sd *= dim;
379 }
380 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000381}
382
383static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100384_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 Py_ssize_t sd, dim;
387 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 if (view->ndim == 0) return 1;
390 if (view->strides == NULL) return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 sd = view->itemsize;
393 if (view->ndim == 1) return (view->shape[0] == 1 ||
394 sd == view->strides[0]);
395 for (i=view->ndim-1; i>=0; i--) {
396 dim = view->shape[i];
397 if (dim == 0) return 1;
398 if (view->strides[i] != sd) return 0;
399 sd *= dim;
400 }
401 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000402}
403
404int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100405PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000406{
407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000409
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100410 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100412 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100414 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 return (_IsCContiguous(view) || _IsFortranContiguous(view));
416 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000417}
418
419
Guido van Rossum98297ee2007-11-06 21:34:58 +0000420void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000421PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 char* pointer;
424 int i;
425 pointer = (char *)view->buf;
426 for (i = 0; i < view->ndim; i++) {
427 pointer += view->strides[i]*indices[i];
428 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
429 pointer = *((char**)pointer) + view->suboffsets[i];
430 }
431 }
432 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000433}
434
435
Guido van Rossum98297ee2007-11-06 21:34:58 +0000436void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000437_Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 for (k=0; k<nd; k++) {
442 if (index[k] < shape[k]-1) {
443 index[k]++;
444 break;
445 }
446 else {
447 index[k] = 0;
448 }
449 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000450}
451
Guido van Rossum98297ee2007-11-06 21:34:58 +0000452void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000453_Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 for (k=nd-1; k>=0; k--) {
458 if (index[k] < shape[k]-1) {
459 index[k]++;
460 break;
461 }
462 else {
463 index[k] = 0;
464 }
465 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000466}
467
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000468int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000469PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000472 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 Py_ssize_t *indices, elements;
474 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (len > view->len) {
477 len = view->len;
478 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 if (PyBuffer_IsContiguous(view, fort)) {
481 /* simplest copy is all that is needed */
482 memcpy(view->buf, buf, len);
483 return 0;
484 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 /* XXX(nnorwitz): need to check for overflow! */
489 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
490 if (indices == NULL) {
491 PyErr_NoMemory();
492 return -1;
493 }
494 for (k=0; k<view->ndim;k++) {
495 indices[k] = 0;
496 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000499 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 }
501 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000502 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 }
504 src = buf;
505 /* XXX : This is not going to be the fastest code in the world
506 several optimizations are possible.
507 */
508 elements = len / view->itemsize;
509 while (elements--) {
510 addone(view->ndim, indices, view->shape);
511 ptr = PyBuffer_GetPointer(view, indices);
512 memcpy(ptr, src, view->itemsize);
513 src += view->itemsize;
514 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 PyMem_Free(indices);
517 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000518}
519
Guido van Rossum98297ee2007-11-06 21:34:58 +0000520int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000521{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 Py_buffer view_dest, view_src;
523 int k;
524 Py_ssize_t *indices, elements;
525 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (!PyObject_CheckBuffer(dest) ||
528 !PyObject_CheckBuffer(src)) {
529 PyErr_SetString(PyExc_TypeError,
530 "both destination and source must have the "\
531 "buffer interface");
532 return -1;
533 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
536 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
537 PyBuffer_Release(&view_dest);
538 return -1;
539 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 if (view_dest.len < view_src.len) {
542 PyErr_SetString(PyExc_BufferError,
543 "destination is too small to receive data from source");
544 PyBuffer_Release(&view_dest);
545 PyBuffer_Release(&view_src);
546 return -1;
547 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
550 PyBuffer_IsContiguous(&view_src, 'C')) ||
551 (PyBuffer_IsContiguous(&view_dest, 'F') &&
552 PyBuffer_IsContiguous(&view_src, 'F'))) {
553 /* simplest copy is all that is needed */
554 memcpy(view_dest.buf, view_src.buf, view_src.len);
555 PyBuffer_Release(&view_dest);
556 PyBuffer_Release(&view_src);
557 return 0;
558 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 /* XXX(nnorwitz): need to check for overflow! */
563 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
564 if (indices == NULL) {
565 PyErr_NoMemory();
566 PyBuffer_Release(&view_dest);
567 PyBuffer_Release(&view_src);
568 return -1;
569 }
570 for (k=0; k<view_src.ndim;k++) {
571 indices[k] = 0;
572 }
573 elements = 1;
574 for (k=0; k<view_src.ndim; k++) {
575 /* XXX(nnorwitz): can this overflow? */
576 elements *= view_src.shape[k];
577 }
578 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000579 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 dptr = PyBuffer_GetPointer(&view_dest, indices);
581 sptr = PyBuffer_GetPointer(&view_src, indices);
582 memcpy(dptr, sptr, view_src.itemsize);
583 }
584 PyMem_Free(indices);
585 PyBuffer_Release(&view_dest);
586 PyBuffer_Release(&view_src);
587 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000588}
589
590void
591PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 Py_ssize_t *strides, int itemsize,
593 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 int k;
596 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 sd = itemsize;
599 if (fort == 'F') {
600 for (k=0; k<nd; k++) {
601 strides[k] = sd;
602 sd *= shape[k];
603 }
604 }
605 else {
606 for (k=nd-1; k>=0; k--) {
607 strides[k] = sd;
608 sd *= shape[k];
609 }
610 }
611 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000612}
613
614int
Martin v. Löwis423be952008-08-13 15:53:07 +0000615PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100616 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000617{
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100618 if (view == NULL) return 0; /* XXX why not -1? */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
620 (readonly == 1)) {
621 PyErr_SetString(PyExc_BufferError,
622 "Object is not writable.");
623 return -1;
624 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 view->obj = obj;
627 if (obj)
628 Py_INCREF(obj);
629 view->buf = buf;
630 view->len = len;
631 view->readonly = readonly;
632 view->itemsize = 1;
633 view->format = NULL;
634 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
635 view->format = "B";
636 view->ndim = 1;
637 view->shape = NULL;
638 if ((flags & PyBUF_ND) == PyBUF_ND)
639 view->shape = &(view->len);
640 view->strides = NULL;
641 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
642 view->strides = &(view->itemsize);
643 view->suboffsets = NULL;
644 view->internal = NULL;
645 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000646}
647
Martin v. Löwis423be952008-08-13 15:53:07 +0000648void
649PyBuffer_Release(Py_buffer *view)
650{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 PyObject *obj = view->obj;
652 if (obj && Py_TYPE(obj)->tp_as_buffer && Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer)
653 Py_TYPE(obj)->tp_as_buffer->bf_releasebuffer(obj, view);
654 Py_XDECREF(obj);
655 view->obj = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000656}
657
Eric Smith8fd3eba2008-02-17 19:48:00 +0000658PyObject *
659PyObject_Format(PyObject *obj, PyObject *format_spec)
660{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000661 PyObject *meth;
662 PyObject *empty = NULL;
663 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500664 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000665
666 /* If no format_spec is provided, use an empty string */
667 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100668 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000669 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000670 }
671
Eric Smith8fd3eba2008-02-17 19:48:00 +0000672 /* Find the (unbound!) __format__ method (a borrowed reference) */
Benjamin Petersonce798522012-01-22 11:24:29 -0500673 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000674 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000675 if (!PyErr_Occurred())
676 PyErr_Format(PyExc_TypeError,
677 "Type %.100s doesn't define __format__",
678 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000680 }
681
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000682 /* And call it. */
683 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000684 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000685
686 if (result && !PyUnicode_Check(result)) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000687 PyErr_SetString(PyExc_TypeError,
688 "__format__ method did not return string");
689 Py_DECREF(result);
690 result = NULL;
691 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000692 }
693
694done:
695 Py_XDECREF(empty);
696 return result;
697}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000698/* Operations on numbers */
699
700int
Fred Drake79912472000-07-09 04:06:11 +0000701PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 return o && o->ob_type->tp_as_number &&
704 (o->ob_type->tp_as_number->nb_int ||
705 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000706}
707
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000708/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000709
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000710#define NB_SLOT(x) offsetof(PyNumberMethods, x)
711#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000713#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000715
716/*
717 Calling scheme used for binary operations:
718
Neal Norwitz4886cc32006-08-21 17:06:07 +0000719 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000721
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000722 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
723 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000724 */
725
726static PyObject *
727binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 PyObject *x;
730 binaryfunc slotv = NULL;
731 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 if (v->ob_type->tp_as_number != NULL)
734 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
735 if (w->ob_type != v->ob_type &&
736 w->ob_type->tp_as_number != NULL) {
737 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
738 if (slotw == slotv)
739 slotw = NULL;
740 }
741 if (slotv) {
742 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
743 x = slotw(v, w);
744 if (x != Py_NotImplemented)
745 return x;
746 Py_DECREF(x); /* can't do it */
747 slotw = NULL;
748 }
749 x = slotv(v, w);
750 if (x != Py_NotImplemented)
751 return x;
752 Py_DECREF(x); /* can't do it */
753 }
754 if (slotw) {
755 x = slotw(v, w);
756 if (x != Py_NotImplemented)
757 return x;
758 Py_DECREF(x); /* can't do it */
759 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500760 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761}
Guido van Rossum77660912002-04-16 16:32:50 +0000762
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000764binop_type_error(PyObject *v, PyObject *w, const char *op_name)
765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 PyErr_Format(PyExc_TypeError,
767 "unsupported operand type(s) for %.100s: "
768 "'%.100s' and '%.100s'",
769 op_name,
770 v->ob_type->tp_name,
771 w->ob_type->tp_name);
772 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000773}
774
775static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000776binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 PyObject *result = binary_op1(v, w, op_slot);
779 if (result == Py_NotImplemented) {
780 Py_DECREF(result);
781 return binop_type_error(v, w, op_name);
782 }
783 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000784}
785
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000786
787/*
788 Calling scheme used for ternary operations:
789
Neal Norwitz4886cc32006-08-21 17:06:07 +0000790 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000792 */
793
794static PyObject *
795ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyObject *w,
797 PyObject *z,
798 const int op_slot,
799 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 PyNumberMethods *mv, *mw, *mz;
802 PyObject *x = NULL;
803 ternaryfunc slotv = NULL;
804 ternaryfunc slotw = NULL;
805 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 mv = v->ob_type->tp_as_number;
808 mw = w->ob_type->tp_as_number;
809 if (mv != NULL)
810 slotv = NB_TERNOP(mv, op_slot);
811 if (w->ob_type != v->ob_type &&
812 mw != NULL) {
813 slotw = NB_TERNOP(mw, op_slot);
814 if (slotw == slotv)
815 slotw = NULL;
816 }
817 if (slotv) {
818 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
819 x = slotw(v, w, z);
820 if (x != Py_NotImplemented)
821 return x;
822 Py_DECREF(x); /* can't do it */
823 slotw = NULL;
824 }
825 x = slotv(v, w, z);
826 if (x != Py_NotImplemented)
827 return x;
828 Py_DECREF(x); /* can't do it */
829 }
830 if (slotw) {
831 x = slotw(v, w, z);
832 if (x != Py_NotImplemented)
833 return x;
834 Py_DECREF(x); /* can't do it */
835 }
836 mz = z->ob_type->tp_as_number;
837 if (mz != NULL) {
838 slotz = NB_TERNOP(mz, op_slot);
839 if (slotz == slotv || slotz == slotw)
840 slotz = NULL;
841 if (slotz) {
842 x = slotz(v, w, z);
843 if (x != Py_NotImplemented)
844 return x;
845 Py_DECREF(x); /* can't do it */
846 }
847 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 if (z == Py_None)
850 PyErr_Format(
851 PyExc_TypeError,
852 "unsupported operand type(s) for ** or pow(): "
853 "'%.100s' and '%.100s'",
854 v->ob_type->tp_name,
855 w->ob_type->tp_name);
856 else
857 PyErr_Format(
858 PyExc_TypeError,
859 "unsupported operand type(s) for pow(): "
860 "'%.100s', '%.100s', '%.100s'",
861 v->ob_type->tp_name,
862 w->ob_type->tp_name,
863 z->ob_type->tp_name);
864 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000865}
866
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000867#define BINARY_FUNC(func, op, op_name) \
868 PyObject * \
869 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000871 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000872
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873BINARY_FUNC(PyNumber_Or, nb_or, "|")
874BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
875BINARY_FUNC(PyNumber_And, nb_and, "&")
876BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
877BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
878BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000879BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000880
881PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000882PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
885 if (result == Py_NotImplemented) {
886 PySequenceMethods *m = v->ob_type->tp_as_sequence;
887 Py_DECREF(result);
888 if (m && m->sq_concat) {
889 return (*m->sq_concat)(v, w);
890 }
891 result = binop_type_error(v, w, "+");
892 }
893 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000894}
895
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000896static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000897sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 Py_ssize_t count;
900 if (PyIndex_Check(n)) {
901 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
902 if (count == -1 && PyErr_Occurred())
903 return NULL;
904 }
905 else {
906 return type_error("can't multiply sequence by "
907 "non-int of type '%.200s'", n);
908 }
909 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000910}
911
912PyObject *
913PyNumber_Multiply(PyObject *v, PyObject *w)
914{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
916 if (result == Py_NotImplemented) {
917 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
918 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
919 Py_DECREF(result);
920 if (mv && mv->sq_repeat) {
921 return sequence_repeat(mv->sq_repeat, v, w);
922 }
923 else if (mw && mw->sq_repeat) {
924 return sequence_repeat(mw->sq_repeat, w, v);
925 }
926 result = binop_type_error(v, w, "*");
927 }
928 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000929}
930
Guido van Rossume15dee51995-07-18 14:12:02 +0000931PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000932PyNumber_FloorDivide(PyObject *v, PyObject *w)
933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +0000935}
936
937PyObject *
938PyNumber_TrueDivide(PyObject *v, PyObject *w)
939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +0000941}
942
943PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000944PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000947}
948
949PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000950PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000953}
954
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000955/* Binary in-place operators */
956
957/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000958 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000959
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000960 - If the left hand object has the appropriate struct members, and
961 they are filled, call the appropriate function and return the
962 result. No coercion is done on the arguments; the left-hand object
963 is the one the operation is performed on, and it's up to the
964 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000965
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000966 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000967 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000968
969 */
970
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000971static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000972binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 PyNumberMethods *mv = v->ob_type->tp_as_number;
975 if (mv != NULL) {
976 binaryfunc slot = NB_BINOP(mv, iop_slot);
977 if (slot) {
978 PyObject *x = (slot)(v, w);
979 if (x != Py_NotImplemented) {
980 return x;
981 }
982 Py_DECREF(x);
983 }
984 }
985 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000986}
987
988static PyObject *
989binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
993 if (result == Py_NotImplemented) {
994 Py_DECREF(result);
995 return binop_type_error(v, w, op_name);
996 }
997 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000998}
999
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001000#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 PyObject * \
1002 func(PyObject *v, PyObject *w) { \
1003 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1004 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001005
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001006INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1007INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1008INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1009INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1010INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1011INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001012
1013PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001014PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1017 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001018}
1019
1020PyObject *
1021PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1024 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001025}
1026
1027PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001028PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1031 NB_SLOT(nb_add));
1032 if (result == Py_NotImplemented) {
1033 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1034 Py_DECREF(result);
1035 if (m != NULL) {
1036 binaryfunc f = NULL;
1037 f = m->sq_inplace_concat;
1038 if (f == NULL)
1039 f = m->sq_concat;
1040 if (f != NULL)
1041 return (*f)(v, w);
1042 }
1043 result = binop_type_error(v, w, "+=");
1044 }
1045 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001046}
1047
1048PyObject *
1049PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1052 NB_SLOT(nb_multiply));
1053 if (result == Py_NotImplemented) {
1054 ssizeargfunc f = NULL;
1055 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1056 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1057 Py_DECREF(result);
1058 if (mv != NULL) {
1059 f = mv->sq_inplace_repeat;
1060 if (f == NULL)
1061 f = mv->sq_repeat;
1062 if (f != NULL)
1063 return sequence_repeat(f, v, w);
1064 }
1065 else if (mw != NULL) {
1066 /* Note that the right hand operand should not be
1067 * mutated in this case so sq_inplace_repeat is not
1068 * used. */
1069 if (mw->sq_repeat)
1070 return sequence_repeat(mw->sq_repeat, w, v);
1071 }
1072 result = binop_type_error(v, w, "*=");
1073 }
1074 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001075}
1076
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001077PyObject *
1078PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1081 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001082}
1083
1084PyObject *
1085PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 if (v->ob_type->tp_as_number &&
1088 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1089 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1090 }
1091 else {
1092 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1093 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001094}
1095
1096
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001097/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001098
1099PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001100PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 if (o == NULL)
1105 return null_error();
1106 m = o->ob_type->tp_as_number;
1107 if (m && m->nb_negative)
1108 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001111}
1112
1113PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001114PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 if (o == NULL)
1119 return null_error();
1120 m = o->ob_type->tp_as_number;
1121 if (m && m->nb_positive)
1122 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001125}
1126
1127PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001128PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (o == NULL)
1133 return null_error();
1134 m = o->ob_type->tp_as_number;
1135 if (m && m->nb_invert)
1136 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001139}
1140
1141PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001142PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (o == NULL)
1147 return null_error();
1148 m = o->ob_type->tp_as_number;
1149 if (m && m->nb_absolute)
1150 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
Guido van Rossum98297ee2007-11-06 21:34:58 +00001155/* Return a Python Int or Long from the object item
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001156 Raise TypeError if the result is not an int-or-long
Guido van Rossum98297ee2007-11-06 21:34:58 +00001157 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001158*/
1159PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001160PyNumber_Index(PyObject *item)
1161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 PyObject *result = NULL;
1163 if (item == NULL)
1164 return null_error();
1165 if (PyLong_Check(item)) {
1166 Py_INCREF(item);
1167 return item;
1168 }
1169 if (PyIndex_Check(item)) {
1170 result = item->ob_type->tp_as_number->nb_index(item);
1171 if (result && !PyLong_Check(result)) {
1172 PyErr_Format(PyExc_TypeError,
1173 "__index__ returned non-int "
1174 "(type %.200s)",
1175 result->ob_type->tp_name);
1176 Py_DECREF(result);
1177 return NULL;
1178 }
1179 }
1180 else {
1181 PyErr_Format(PyExc_TypeError,
1182 "'%.200s' object cannot be interpreted "
1183 "as an integer", item->ob_type->tp_name);
1184 }
1185 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001186}
1187
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001188/* Return an error on Overflow only if err is not NULL*/
1189
1190Py_ssize_t
1191PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 Py_ssize_t result;
1194 PyObject *runerr;
1195 PyObject *value = PyNumber_Index(item);
1196 if (value == NULL)
1197 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 /* We're done if PyLong_AsSsize_t() returns without error. */
1200 result = PyLong_AsSsize_t(value);
1201 if (result != -1 || !(runerr = PyErr_Occurred()))
1202 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 /* Error handling code -- only manage OverflowError differently */
1205 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1206 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 PyErr_Clear();
1209 /* If no error-handling desired then the default clipping
1210 is sufficient.
1211 */
1212 if (!err) {
1213 assert(PyLong_Check(value));
1214 /* Whether or not it is less than or equal to
1215 zero is determined by the sign of ob_size
1216 */
1217 if (_PyLong_Sign(value) < 0)
1218 result = PY_SSIZE_T_MIN;
1219 else
1220 result = PY_SSIZE_T_MAX;
1221 }
1222 else {
1223 /* Otherwise replace the error with caller's error object. */
1224 PyErr_Format(err,
1225 "cannot fit '%.200s' into an index-sized integer",
1226 item->ob_type->tp_name);
1227 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001228
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001229 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 Py_DECREF(value);
1231 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001232}
1233
1234
Benjamin Petersonb7f1da52012-03-21 14:44:43 -04001235/*
1236 Returns the Integral instance converted to an int. The instance is expected
1237 to be an int or have an __int__ method. Steals integral's
1238 reference. error_format will be used to create the TypeError if integral
1239 isn't actually an Integral instance. error_format should be a format string
1240 that can accept a char* naming integral's type.
1241*/
1242static PyObject *
1243convert_integral_to_int(PyObject *integral, const char *error_format)
Christian Heimes15ebc882008-02-04 18:48:49 +00001244{
Benjamin Petersond614e702012-03-21 14:38:11 -04001245 PyNumberMethods *nb;
1246 if (PyLong_Check(integral))
1247 return integral;
1248 nb = Py_TYPE(integral)->tp_as_number;
1249 if (nb->nb_int) {
1250 PyObject *as_int = nb->nb_int(integral);
Mark Dickinson3d783852012-09-27 19:38:59 +01001251 if (!as_int || PyLong_Check(as_int)) {
1252 Py_DECREF(integral);
Benjamin Petersond614e702012-03-21 14:38:11 -04001253 return as_int;
Mark Dickinson3d783852012-09-27 19:38:59 +01001254 }
Benjamin Petersond614e702012-03-21 14:38:11 -04001255 Py_DECREF(as_int);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 PyErr_Format(PyExc_TypeError, error_format, Py_TYPE(integral)->tp_name);
1258 Py_DECREF(integral);
Benjamin Petersond614e702012-03-21 14:38:11 -04001259 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001260}
1261
1262
Guido van Rossum9e896b32000-04-05 20:11:21 +00001263/* Add a check for embedded NULL-bytes in the argument. */
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001265long_from_string(const char *s, Py_ssize_t len)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 char *end;
1268 PyObject *x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 x = PyLong_FromString((char*)s, &end, 10);
1271 if (x == NULL)
1272 return NULL;
1273 if (end != s + len) {
1274 PyErr_SetString(PyExc_ValueError,
1275 "null byte in argument for int()");
1276 Py_DECREF(x);
1277 return NULL;
1278 }
1279 return x;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001280}
1281
Guido van Rossume15dee51995-07-18 14:12:02 +00001282PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001283PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 PyObject *trunc_func;
1287 const char *buffer;
1288 Py_ssize_t buffer_len;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001289 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 if (o == NULL)
1292 return null_error();
1293 if (PyLong_CheckExact(o)) {
1294 Py_INCREF(o);
1295 return o;
1296 }
1297 m = o->ob_type->tp_as_number;
1298 if (m && m->nb_int) { /* This should include subclasses of int */
1299 PyObject *res = m->nb_int(o);
1300 if (res && !PyLong_Check(res)) {
1301 PyErr_Format(PyExc_TypeError,
1302 "__int__ returned non-int (type %.200s)",
1303 res->ob_type->tp_name);
1304 Py_DECREF(res);
1305 return NULL;
1306 }
1307 return res;
1308 }
1309 if (PyLong_Check(o)) /* An int subclass without nb_int */
1310 return _PyLong_Copy((PyLongObject *)o);
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001311 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 if (trunc_func) {
1313 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1314 PyObject *int_instance;
1315 Py_DECREF(trunc_func);
1316 /* __trunc__ is specified to return an Integral type,
Benjamin Peterson520e8502012-03-21 14:51:14 -04001317 but int() needs to return a int. */
Benjamin Petersonb7f1da52012-03-21 14:44:43 -04001318 int_instance = convert_integral_to_int(truncated,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 "__trunc__ returned non-Integral (type %.200s)");
1320 return int_instance;
1321 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001322 if (PyErr_Occurred())
1323 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (PyBytes_Check(o))
1326 /* need to do extra error checking that PyLong_FromString()
Benjamin Peterson520e8502012-03-21 14:51:14 -04001327 * doesn't do. In particular int('9.5') must raise an
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 * exception, not truncate the float.
1329 */
1330 return long_from_string(PyBytes_AS_STRING(o),
1331 PyBytes_GET_SIZE(o));
1332 if (PyUnicode_Check(o))
1333 /* The above check is done in PyLong_FromUnicode(). */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001334 return PyLong_FromUnicodeObject(o, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if (!PyObject_AsCharBuffer(o, &buffer, &buffer_len))
1336 return long_from_string(buffer, buffer_len);
Guido van Rossume15dee51995-07-18 14:12:02 +00001337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 return type_error("int() argument must be a string or a "
1339 "number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001340}
1341
1342PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001343PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001344{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 if (o == NULL)
1348 return null_error();
1349 m = o->ob_type->tp_as_number;
1350 if (m && m->nb_float) { /* This should include subclasses of float */
1351 PyObject *res = m->nb_float(o);
1352 if (res && !PyFloat_Check(res)) {
1353 PyErr_Format(PyExc_TypeError,
1354 "__float__ returned non-float (type %.200s)",
1355 res->ob_type->tp_name);
1356 Py_DECREF(res);
1357 return NULL;
1358 }
1359 return res;
1360 }
1361 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
1362 PyFloatObject *po = (PyFloatObject *)o;
1363 return PyFloat_FromDouble(po->ob_fval);
1364 }
1365 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001366}
1367
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001368
1369PyObject *
1370PyNumber_ToBase(PyObject *n, int base)
1371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 PyObject *res = NULL;
1373 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 if (!index)
1376 return NULL;
1377 if (PyLong_Check(index))
1378 res = _PyLong_Format(index, base);
1379 else
1380 /* It should not be possible to get here, as
1381 PyNumber_Index already has a check for the same
1382 condition */
1383 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not "
1384 "int or long");
1385 Py_DECREF(index);
1386 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001387}
1388
1389
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001390/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001391
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001392int
Fred Drake79912472000-07-09 04:06:11 +00001393PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 if (PyDict_Check(s))
1396 return 0;
1397 return s != NULL && s->ob_type->tp_as_sequence &&
1398 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001399}
1400
Martin v. Löwis18e16552006-02-15 17:27:45 +00001401Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001402PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 if (s == NULL) {
1407 null_error();
1408 return -1;
1409 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 m = s->ob_type->tp_as_sequence;
1412 if (m && m->sq_length)
1413 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 type_error("object of type '%.200s' has no len()", s);
1416 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001417}
1418
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001419#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001420Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001421PySequence_Length(PyObject *s)
1422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001424}
1425#define PySequence_Length PySequence_Size
1426
Guido van Rossume15dee51995-07-18 14:12:02 +00001427PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001428PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 if (s == NULL || o == NULL)
1433 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 m = s->ob_type->tp_as_sequence;
1436 if (m && m->sq_concat)
1437 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 /* Instances of user classes defining an __add__() method only
1440 have an nb_add slot, not an sq_concat slot. So we fall back
1441 to nb_add if both arguments appear to be sequences. */
1442 if (PySequence_Check(s) && PySequence_Check(o)) {
1443 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1444 if (result != Py_NotImplemented)
1445 return result;
1446 Py_DECREF(result);
1447 }
1448 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001449}
1450
1451PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001452PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 if (o == NULL)
1457 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 m = o->ob_type->tp_as_sequence;
1460 if (m && m->sq_repeat)
1461 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 /* Instances of user classes defining a __mul__() method only
1464 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1465 to nb_multiply if o appears to be a sequence. */
1466 if (PySequence_Check(o)) {
1467 PyObject *n, *result;
1468 n = PyLong_FromSsize_t(count);
1469 if (n == NULL)
1470 return NULL;
1471 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1472 Py_DECREF(n);
1473 if (result != Py_NotImplemented)
1474 return result;
1475 Py_DECREF(result);
1476 }
1477 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001478}
1479
1480PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001481PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (s == NULL || o == NULL)
1486 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001487
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 m = s->ob_type->tp_as_sequence;
1489 if (m && m->sq_inplace_concat)
1490 return m->sq_inplace_concat(s, o);
1491 if (m && m->sq_concat)
1492 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 if (PySequence_Check(s) && PySequence_Check(o)) {
1495 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1496 NB_SLOT(nb_add));
1497 if (result != Py_NotImplemented)
1498 return result;
1499 Py_DECREF(result);
1500 }
1501 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001502}
1503
1504PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001505PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 if (o == NULL)
1510 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 m = o->ob_type->tp_as_sequence;
1513 if (m && m->sq_inplace_repeat)
1514 return m->sq_inplace_repeat(o, count);
1515 if (m && m->sq_repeat)
1516 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 if (PySequence_Check(o)) {
1519 PyObject *n, *result;
1520 n = PyLong_FromSsize_t(count);
1521 if (n == NULL)
1522 return NULL;
1523 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1524 NB_SLOT(nb_multiply));
1525 Py_DECREF(n);
1526 if (result != Py_NotImplemented)
1527 return result;
1528 Py_DECREF(result);
1529 }
1530 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001531}
1532
1533PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001534PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 if (s == NULL)
1539 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 m = s->ob_type->tp_as_sequence;
1542 if (m && m->sq_item) {
1543 if (i < 0) {
1544 if (m->sq_length) {
1545 Py_ssize_t l = (*m->sq_length)(s);
1546 if (l < 0)
1547 return NULL;
1548 i += l;
1549 }
1550 }
1551 return m->sq_item(s, i);
1552 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001555}
1556
1557PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001558PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001565 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PyObject *res;
1567 PyObject *slice = _PySlice_FromIndices(i1, i2);
1568 if (!slice)
1569 return NULL;
1570 res = mp->mp_subscript(s, slice);
1571 Py_DECREF(slice);
1572 return res;
1573 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001576}
1577
1578int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001579PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (s == NULL) {
1584 null_error();
1585 return -1;
1586 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 m = s->ob_type->tp_as_sequence;
1589 if (m && m->sq_ass_item) {
1590 if (i < 0) {
1591 if (m->sq_length) {
1592 Py_ssize_t l = (*m->sq_length)(s);
1593 if (l < 0)
1594 return -1;
1595 i += l;
1596 }
1597 }
1598 return m->sq_ass_item(s, i, o);
1599 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 type_error("'%.200s' object does not support item assignment", s);
1602 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001603}
1604
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001605int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001606PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 if (s == NULL) {
1611 null_error();
1612 return -1;
1613 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 m = s->ob_type->tp_as_sequence;
1616 if (m && m->sq_ass_item) {
1617 if (i < 0) {
1618 if (m->sq_length) {
1619 Py_ssize_t l = (*m->sq_length)(s);
1620 if (l < 0)
1621 return -1;
1622 i += l;
1623 }
1624 }
1625 return m->sq_ass_item(s, i, (PyObject *)NULL);
1626 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 type_error("'%.200s' object doesn't support item deletion", s);
1629 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001630}
1631
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001632int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001633PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 if (s == NULL) {
1638 null_error();
1639 return -1;
1640 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001643 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 int res;
1645 PyObject *slice = _PySlice_FromIndices(i1, i2);
1646 if (!slice)
1647 return -1;
1648 res = mp->mp_ass_subscript(s, slice, o);
1649 Py_DECREF(slice);
1650 return res;
1651 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 type_error("'%.200s' object doesn't support slice assignment", s);
1654 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001655}
1656
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001657int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001658PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 if (s == NULL) {
1663 null_error();
1664 return -1;
1665 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001668 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 int res;
1670 PyObject *slice = _PySlice_FromIndices(i1, i2);
1671 if (!slice)
1672 return -1;
1673 res = mp->mp_ass_subscript(s, slice, NULL);
1674 Py_DECREF(slice);
1675 return res;
1676 }
1677 type_error("'%.200s' object doesn't support slice deletion", s);
1678 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001679}
1680
Guido van Rossume15dee51995-07-18 14:12:02 +00001681PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001682PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 PyObject *it; /* iter(v) */
1685 Py_ssize_t n; /* guess for result tuple size */
1686 PyObject *result = NULL;
1687 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 if (v == NULL)
1690 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 /* Special-case the common tuple and list cases, for efficiency. */
1693 if (PyTuple_CheckExact(v)) {
1694 /* Note that we can't know whether it's safe to return
1695 a tuple *subclass* instance as-is, hence the restriction
1696 to exact tuples here. In contrast, lists always make
1697 a copy, so there's no need for exactness below. */
1698 Py_INCREF(v);
1699 return v;
1700 }
1701 if (PyList_Check(v))
1702 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 /* Get iterator. */
1705 it = PyObject_GetIter(v);
1706 if (it == NULL)
1707 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001710 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (n == -1)
1712 goto Fail;
1713 result = PyTuple_New(n);
1714 if (result == NULL)
1715 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 /* Fill the tuple. */
1718 for (j = 0; ; ++j) {
1719 PyObject *item = PyIter_Next(it);
1720 if (item == NULL) {
1721 if (PyErr_Occurred())
1722 goto Fail;
1723 break;
1724 }
1725 if (j >= n) {
1726 Py_ssize_t oldn = n;
1727 /* The over-allocation strategy can grow a bit faster
1728 than for lists because unlike lists the
1729 over-allocation isn't permanent -- we reclaim
1730 the excess before the end of this routine.
1731 So, grow by ten and then add 25%.
1732 */
1733 n += 10;
1734 n += n >> 2;
1735 if (n < oldn) {
1736 /* Check for overflow */
1737 PyErr_NoMemory();
1738 Py_DECREF(item);
1739 goto Fail;
1740 }
1741 if (_PyTuple_Resize(&result, n) != 0) {
1742 Py_DECREF(item);
1743 goto Fail;
1744 }
1745 }
1746 PyTuple_SET_ITEM(result, j, item);
1747 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 /* Cut tuple back if guess was too large. */
1750 if (j < n &&
1751 _PyTuple_Resize(&result, j) != 0)
1752 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 Py_DECREF(it);
1755 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001756
1757Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 Py_XDECREF(result);
1759 Py_DECREF(it);
1760 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001761}
1762
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001763PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001764PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 PyObject *result; /* result list */
1767 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 if (v == NULL)
1770 return null_error();
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 result = PyList_New(0);
1773 if (result == NULL)
1774 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 rv = _PyList_Extend((PyListObject *)result, v);
1777 if (rv == NULL) {
1778 Py_DECREF(result);
1779 return NULL;
1780 }
1781 Py_DECREF(rv);
1782 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001783}
1784
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001785PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001786PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 if (v == NULL)
1791 return null_error();
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1794 Py_INCREF(v);
1795 return v;
1796 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 it = PyObject_GetIter(v);
1799 if (it == NULL) {
1800 if (PyErr_ExceptionMatches(PyExc_TypeError))
1801 PyErr_SetString(PyExc_TypeError, m);
1802 return NULL;
1803 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 v = PySequence_List(it);
1806 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001809}
1810
Tim Peters16a77ad2001-09-08 04:00:12 +00001811/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1813 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1814 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001815 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1816*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001817Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001818_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 Py_ssize_t n;
1821 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1822 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 if (seq == NULL || obj == NULL) {
1825 null_error();
1826 return -1;
1827 }
Tim Peters75f8e352001-05-05 11:33:43 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 it = PyObject_GetIter(seq);
1830 if (it == NULL) {
1831 type_error("argument of type '%.200s' is not iterable", seq);
1832 return -1;
1833 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 n = wrapped = 0;
1836 for (;;) {
1837 int cmp;
1838 PyObject *item = PyIter_Next(it);
1839 if (item == NULL) {
1840 if (PyErr_Occurred())
1841 goto Fail;
1842 break;
1843 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1846 Py_DECREF(item);
1847 if (cmp < 0)
1848 goto Fail;
1849 if (cmp > 0) {
1850 switch (operation) {
1851 case PY_ITERSEARCH_COUNT:
1852 if (n == PY_SSIZE_T_MAX) {
1853 PyErr_SetString(PyExc_OverflowError,
1854 "count exceeds C integer size");
1855 goto Fail;
1856 }
1857 ++n;
1858 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 case PY_ITERSEARCH_INDEX:
1861 if (wrapped) {
1862 PyErr_SetString(PyExc_OverflowError,
1863 "index exceeds C integer size");
1864 goto Fail;
1865 }
1866 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 case PY_ITERSEARCH_CONTAINS:
1869 n = 1;
1870 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 default:
1873 assert(!"unknown operation");
1874 }
1875 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 if (operation == PY_ITERSEARCH_INDEX) {
1878 if (n == PY_SSIZE_T_MAX)
1879 wrapped = 1;
1880 ++n;
1881 }
1882 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 if (operation != PY_ITERSEARCH_INDEX)
1885 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 PyErr_SetString(PyExc_ValueError,
1888 "sequence.index(x): x not in sequence");
1889 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00001890Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 n = -1;
1892 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00001893Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 Py_DECREF(it);
1895 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001896
Guido van Rossume15dee51995-07-18 14:12:02 +00001897}
1898
Tim Peters16a77ad2001-09-08 04:00:12 +00001899/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001900Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001901PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001904}
1905
Tim Peterscb8d3682001-05-05 21:05:01 +00001906/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001907 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001908 */
1909int
1910PySequence_Contains(PyObject *seq, PyObject *ob)
1911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 Py_ssize_t result;
1913 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1914 if (sqm != NULL && sqm->sq_contains != NULL)
1915 return (*sqm->sq_contains)(seq, ob);
1916 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1917 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001918}
1919
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001920/* Backwards compatibility */
1921#undef PySequence_In
1922int
Fred Drake79912472000-07-09 04:06:11 +00001923PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001926}
1927
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001928Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001929PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001932}
1933
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001934/* Operations on mappings */
1935
1936int
Fred Drake79912472000-07-09 04:06:11 +00001937PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001938{
Benjamin Peterson21992272011-12-28 12:01:31 -06001939 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001941}
1942
Martin v. Löwis18e16552006-02-15 17:27:45 +00001943Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001944PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 if (o == NULL) {
1949 null_error();
1950 return -1;
1951 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 m = o->ob_type->tp_as_mapping;
1954 if (m && m->mp_length)
1955 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 type_error("object of type '%.200s' has no len()", o);
1958 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001959}
1960
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001961#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001962Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001963PyMapping_Length(PyObject *o)
1964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001965 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001966}
1967#define PyMapping_Length PyMapping_Size
1968
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001969PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001970PyMapping_GetItemString(PyObject *o, char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 if (key == NULL)
1975 return null_error();
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 okey = PyUnicode_FromString(key);
1978 if (okey == NULL)
1979 return NULL;
1980 r = PyObject_GetItem(o, okey);
1981 Py_DECREF(okey);
1982 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001983}
1984
1985int
Fred Drake79912472000-07-09 04:06:11 +00001986PyMapping_SetItemString(PyObject *o, char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 PyObject *okey;
1989 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 if (key == NULL) {
1992 null_error();
1993 return -1;
1994 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 okey = PyUnicode_FromString(key);
1997 if (okey == NULL)
1998 return -1;
1999 r = PyObject_SetItem(o, okey, value);
2000 Py_DECREF(okey);
2001 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002002}
2003
2004int
Fred Drake79912472000-07-09 04:06:11 +00002005PyMapping_HasKeyString(PyObject *o, char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002007 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 v = PyMapping_GetItemString(o, key);
2010 if (v) {
2011 Py_DECREF(v);
2012 return 1;
2013 }
2014 PyErr_Clear();
2015 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002016}
2017
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002018int
Fred Drake79912472000-07-09 04:06:11 +00002019PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 v = PyObject_GetItem(o, key);
2024 if (v) {
2025 Py_DECREF(v);
2026 return 1;
2027 }
2028 PyErr_Clear();
2029 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002030}
2031
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002032PyObject *
2033PyMapping_Keys(PyObject *o)
2034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 PyObject *keys;
2036 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002037 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 if (PyDict_CheckExact(o))
2040 return PyDict_Keys(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002041 keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (keys == NULL)
2043 return NULL;
2044 fast = PySequence_Fast(keys, "o.keys() are not iterable");
2045 Py_DECREF(keys);
2046 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002047}
2048
2049PyObject *
2050PyMapping_Items(PyObject *o)
2051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 PyObject *items;
2053 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002054 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 if (PyDict_CheckExact(o))
2057 return PyDict_Items(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002058 items = _PyObject_CallMethodId(o, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 if (items == NULL)
2060 return NULL;
2061 fast = PySequence_Fast(items, "o.items() are not iterable");
2062 Py_DECREF(items);
2063 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002064}
2065
2066PyObject *
2067PyMapping_Values(PyObject *o)
2068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 PyObject *values;
2070 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002071 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 if (PyDict_CheckExact(o))
2074 return PyDict_Values(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002075 values = _PyObject_CallMethodId(o, &PyId_values, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 if (values == NULL)
2077 return NULL;
2078 fast = PySequence_Fast(values, "o.values() are not iterable");
2079 Py_DECREF(values);
2080 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002081}
2082
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002083/* Operations on callable objects */
2084
2085/* XXX PyCallable_Check() is in object.c */
2086
Guido van Rossume15dee51995-07-18 14:12:02 +00002087PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002088PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002091}
Guido van Rossume15dee51995-07-18 14:12:02 +00002092
2093PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002094PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 ternaryfunc call;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 if ((call = func->ob_type->tp_call) != NULL) {
2099 PyObject *result;
2100 if (Py_EnterRecursiveCall(" while calling a Python object"))
2101 return NULL;
2102 result = (*call)(func, arg, kw);
2103 Py_LeaveRecursiveCall();
2104 if (result == NULL && !PyErr_Occurred())
2105 PyErr_SetString(
2106 PyExc_SystemError,
2107 "NULL result without error in PyObject_Call");
2108 return result;
2109 }
2110 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2111 func->ob_type->tp_name);
2112 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002113}
2114
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002115static PyObject*
2116call_function_tail(PyObject *callable, PyObject *args)
2117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002120 if (args == NULL)
2121 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 if (!PyTuple_Check(args)) {
2124 PyObject *a;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 a = PyTuple_New(1);
2127 if (a == NULL) {
2128 Py_DECREF(args);
2129 return NULL;
2130 }
2131 PyTuple_SET_ITEM(a, 0, args);
2132 args = a;
2133 }
2134 retval = PyObject_Call(callable, args, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 Py_DECREF(args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002139}
2140
Tim Peters6d6c1a32001-08-02 04:15:00 +00002141PyObject *
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002142PyObject_CallFunction(PyObject *callable, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 va_list va;
2145 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 if (callable == NULL)
2148 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 if (format && *format) {
2151 va_start(va, format);
2152 args = Py_VaBuildValue(format, va);
2153 va_end(va);
2154 }
2155 else
2156 args = PyTuple_New(0);
Guido van Rossume15dee51995-07-18 14:12:02 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 return call_function_tail(callable, args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002159}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002160
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002161PyObject *
2162_PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...)
2163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 va_list va;
2165 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 if (callable == NULL)
2168 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 if (format && *format) {
2171 va_start(va, format);
2172 args = _Py_VaBuildValue_SizeT(format, va);
2173 va_end(va);
2174 }
2175 else
2176 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002179}
2180
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002181static PyObject*
2182callmethod(PyObject* func, char *format, va_list va, int is_size_t)
2183{
2184 PyObject *retval = NULL;
2185 PyObject *args;
2186
2187 if (!PyCallable_Check(func)) {
2188 type_error("attribute of type '%.200s' is not callable", func);
2189 goto exit;
2190 }
2191
2192 if (format && *format) {
2193 if (is_size_t)
2194 args = _Py_VaBuildValue_SizeT(format, va);
2195 else
2196 args = Py_VaBuildValue(format, va);
2197 }
2198 else
2199 args = PyTuple_New(0);
2200
2201 retval = call_function_tail(func, args);
2202
2203 exit:
2204 /* args gets consumed in call_function_tail */
2205 Py_XDECREF(func);
2206
2207 return retval;
2208}
2209
Guido van Rossume15dee51995-07-18 14:12:02 +00002210PyObject *
Guido van Rossume15dee51995-07-18 14:12:02 +00002211PyObject_CallMethod(PyObject *o, char *name, char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 PyObject *func = NULL;
2215 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 if (o == NULL || name == NULL)
2218 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002220 func = PyObject_GetAttrString(o, name);
2221 if (func == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 return 0;
2223 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002224
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002225 va_start(va, format);
2226 retval = callmethod(func, format, va, 0);
2227 va_end(va);
2228 return retval;
2229}
2230
2231PyObject *
2232_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name, char *format, ...)
2233{
2234 va_list va;
2235 PyObject *func = NULL;
2236 PyObject *retval = NULL;
2237
2238 if (o == NULL || name == NULL)
2239 return null_error();
2240
2241 func = _PyObject_GetAttrId(o, name);
2242 if (func == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002243 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002244 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002245
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002246 va_start(va, format);
2247 retval = callmethod(func, format, va, 0);
2248 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002250}
2251
2252PyObject *
2253_PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...)
2254{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 PyObject *func = NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002257 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (o == NULL || name == NULL)
2260 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 func = PyObject_GetAttrString(o, name);
2263 if (func == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002264 return 0;
2265 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002266 va_start(va, format);
2267 retval = callmethod(func, format, va, 1);
2268 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002270}
Guido van Rossum823649d2001-03-21 18:40:58 +00002271
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002272PyObject *
2273_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name, char *format, ...)
2274{
2275 va_list va;
2276 PyObject *func = NULL;
2277 PyObject *retval;
2278
2279 if (o == NULL || name == NULL)
2280 return null_error();
2281
2282 func = _PyObject_GetAttrId(o, name);
2283 if (func == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002284 return NULL;
2285 }
2286 va_start(va, format);
2287 retval = callmethod(func, format, va, 1);
2288 va_end(va);
2289 return retval;
2290}
Guido van Rossum823649d2001-03-21 18:40:58 +00002291
Fred Drakeb421b8c2001-10-26 16:21:32 +00002292static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002293objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 int i, n = 0;
2296 va_list countva;
2297 PyObject *result, *tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002298
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00002299 Py_VA_COPY(countva, va);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2302 ++n;
2303 result = PyTuple_New(n);
2304 if (result != NULL && n > 0) {
2305 for (i = 0; i < n; ++i) {
2306 tmp = (PyObject *)va_arg(va, PyObject *);
2307 PyTuple_SET_ITEM(result, i, tmp);
2308 Py_INCREF(tmp);
2309 }
2310 }
2311 return result;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002312}
2313
2314PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002315PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002317 PyObject *args, *tmp;
2318 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 if (callable == NULL || name == NULL)
2321 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002323 callable = PyObject_GetAttr(callable, name);
2324 if (callable == NULL)
2325 return NULL;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 /* count the args */
2328 va_start(vargs, name);
2329 args = objargs_mktuple(vargs);
2330 va_end(vargs);
2331 if (args == NULL) {
2332 Py_DECREF(callable);
2333 return NULL;
2334 }
2335 tmp = PyObject_Call(callable, args, NULL);
2336 Py_DECREF(args);
2337 Py_DECREF(callable);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002340}
2341
2342PyObject *
Brett Cannonfd074152012-04-14 14:10:13 -04002343_PyObject_CallMethodObjIdArgs(PyObject *callable,
2344 struct _Py_Identifier *name, ...)
2345{
2346 PyObject *args, *tmp;
2347 va_list vargs;
2348
2349 if (callable == NULL || name == NULL)
2350 return null_error();
2351
2352 callable = _PyObject_GetAttrId(callable, name);
2353 if (callable == NULL)
2354 return NULL;
2355
2356 /* count the args */
2357 va_start(vargs, name);
2358 args = objargs_mktuple(vargs);
2359 va_end(vargs);
2360 if (args == NULL) {
2361 Py_DECREF(callable);
2362 return NULL;
2363 }
2364 tmp = PyObject_Call(callable, args, NULL);
2365 Py_DECREF(args);
2366 Py_DECREF(callable);
2367
2368 return tmp;
2369}
2370
2371PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002372PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002373{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 PyObject *args, *tmp;
2375 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (callable == NULL)
2378 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 /* count the args */
2381 va_start(vargs, callable);
2382 args = objargs_mktuple(vargs);
2383 va_end(vargs);
2384 if (args == NULL)
2385 return NULL;
2386 tmp = PyObject_Call(callable, args, NULL);
2387 Py_DECREF(args);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002390}
2391
2392
Guido van Rossum823649d2001-03-21 18:40:58 +00002393/* isinstance(), issubclass() */
2394
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002395/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002396 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002397 * 1. getattr(cls, '__bases__') could raise an AttributeError
2398 * 2. getattr(cls, '__bases__') could raise some other exception
2399 * 3. getattr(cls, '__bases__') could return a tuple
2400 * 4. getattr(cls, '__bases__') could return something other than a tuple
2401 *
2402 * Only state #3 is a non-error state and only it returns a non-NULL object
2403 * (it returns the retrieved tuple).
2404 *
2405 * Any raised AttributeErrors are masked by clearing the exception and
2406 * returning NULL. If an object other than a tuple comes out of __bases__,
2407 * then again, the return value is NULL. So yes, these two situations
2408 * produce exactly the same results: NULL is returned and no error is set.
2409 *
2410 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002412 * exception to be propagated along.
2413 *
2414 * Callers are expected to test for PyErr_Occurred() when the return value
2415 * is NULL to decide whether a valid exception should be propagated or not.
2416 * When there's no exception to propagate, it's customary for the caller to
2417 * set a TypeError.
2418 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002419static PyObject *
2420abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002421{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002422 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002426 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 Py_END_ALLOW_RECURSION
2428 if (bases == NULL) {
2429 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2430 PyErr_Clear();
2431 return NULL;
2432 }
2433 if (!PyTuple_Check(bases)) {
2434 Py_DECREF(bases);
2435 return NULL;
2436 }
2437 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002438}
2439
2440
2441static int
2442abstract_issubclass(PyObject *derived, PyObject *cls)
2443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 PyObject *bases = NULL;
2445 Py_ssize_t i, n;
2446 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 while (1) {
2449 if (derived == cls)
2450 return 1;
2451 bases = abstract_get_bases(derived);
2452 if (bases == NULL) {
2453 if (PyErr_Occurred())
2454 return -1;
2455 return 0;
2456 }
2457 n = PyTuple_GET_SIZE(bases);
2458 if (n == 0) {
2459 Py_DECREF(bases);
2460 return 0;
2461 }
2462 /* Avoid recursivity in the single inheritance case */
2463 if (n == 1) {
2464 derived = PyTuple_GET_ITEM(bases, 0);
2465 Py_DECREF(bases);
2466 continue;
2467 }
2468 for (i = 0; i < n; i++) {
2469 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2470 if (r != 0)
2471 break;
2472 }
2473 Py_DECREF(bases);
2474 return r;
2475 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002476}
2477
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002478static int
2479check_class(PyObject *cls, const char *error)
2480{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 PyObject *bases = abstract_get_bases(cls);
2482 if (bases == NULL) {
2483 /* Do not mask errors. */
2484 if (!PyErr_Occurred())
2485 PyErr_SetString(PyExc_TypeError, error);
2486 return 0;
2487 }
2488 Py_DECREF(bases);
2489 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002490}
2491
Brett Cannon4f653312004-03-20 22:52:14 +00002492static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002493recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002497 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 if (PyType_Check(cls)) {
2500 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2501 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002502 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002504 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002505 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002506 else
R. David Murray6bb99892010-11-20 16:33:30 +00002507 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 }
2509 else {
2510 if (c != (PyObject *)(inst->ob_type) &&
2511 PyType_Check(c))
2512 retval = PyType_IsSubtype(
2513 (PyTypeObject *)c,
2514 (PyTypeObject *)cls);
2515 Py_DECREF(c);
2516 }
2517 }
2518 }
2519 else {
2520 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002521 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002523 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002525 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002526 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002527 else
R. David Murray6bb99892010-11-20 16:33:30 +00002528 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 }
2530 else {
2531 retval = abstract_issubclass(icls, cls);
2532 Py_DECREF(icls);
2533 }
2534 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002537}
2538
2539int
Brett Cannon4f653312004-03-20 22:52:14 +00002540PyObject_IsInstance(PyObject *inst, PyObject *cls)
2541{
Benjamin Petersonce798522012-01-22 11:24:29 -05002542 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 /* Quick test for an exact match */
2546 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2547 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if (PyTuple_Check(cls)) {
2550 Py_ssize_t i;
2551 Py_ssize_t n;
2552 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2555 return -1;
2556 n = PyTuple_GET_SIZE(cls);
2557 for (i = 0; i < n; ++i) {
2558 PyObject *item = PyTuple_GET_ITEM(cls, i);
2559 r = PyObject_IsInstance(inst, item);
2560 if (r != 0)
2561 /* either found it, or got an error */
2562 break;
2563 }
2564 Py_LeaveRecursiveCall();
2565 return r;
2566 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002567
Benjamin Petersonce798522012-01-22 11:24:29 -05002568 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 if (checker != NULL) {
2570 PyObject *res;
2571 int ok = -1;
2572 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2573 Py_DECREF(checker);
2574 return ok;
2575 }
2576 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2577 Py_LeaveRecursiveCall();
2578 Py_DECREF(checker);
2579 if (res != NULL) {
2580 ok = PyObject_IsTrue(res);
2581 Py_DECREF(res);
2582 }
2583 return ok;
2584 }
2585 else if (PyErr_Occurred())
2586 return -1;
2587 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002588}
2589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002591recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 if (PyType_Check(cls) && PyType_Check(derived)) {
2594 /* Fast path (non-recursive) */
2595 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2596 }
2597 if (!check_class(derived,
2598 "issubclass() arg 1 must be a class"))
2599 return -1;
2600 if (!check_class(cls,
2601 "issubclass() arg 2 must be a class"
2602 " or tuple of classes"))
2603 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002606}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002607
Brett Cannon4f653312004-03-20 22:52:14 +00002608int
2609PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2610{
Benjamin Petersonce798522012-01-22 11:24:29 -05002611 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 if (PyTuple_Check(cls)) {
2615 Py_ssize_t i;
2616 Py_ssize_t n;
2617 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2620 return -1;
2621 n = PyTuple_GET_SIZE(cls);
2622 for (i = 0; i < n; ++i) {
2623 PyObject *item = PyTuple_GET_ITEM(cls, i);
2624 r = PyObject_IsSubclass(derived, item);
2625 if (r != 0)
2626 /* either found it, or got an error */
2627 break;
2628 }
2629 Py_LeaveRecursiveCall();
2630 return r;
2631 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002632
Benjamin Petersonce798522012-01-22 11:24:29 -05002633 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 if (checker != NULL) {
2635 PyObject *res;
2636 int ok = -1;
2637 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2638 Py_DECREF(checker);
2639 return ok;
2640 }
2641 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2642 Py_LeaveRecursiveCall();
2643 Py_DECREF(checker);
2644 if (res != NULL) {
2645 ok = PyObject_IsTrue(res);
2646 Py_DECREF(res);
2647 }
2648 return ok;
2649 }
2650 else if (PyErr_Occurred())
2651 return -1;
2652 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002653}
2654
2655int
2656_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002659}
2660
2661int
2662_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002665}
2666
2667
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002668PyObject *
2669PyObject_GetIter(PyObject *o)
2670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 PyTypeObject *t = o->ob_type;
2672 getiterfunc f = NULL;
2673 f = t->tp_iter;
2674 if (f == NULL) {
2675 if (PySequence_Check(o))
2676 return PySeqIter_New(o);
2677 return type_error("'%.200s' object is not iterable", o);
2678 }
2679 else {
2680 PyObject *res = (*f)(o);
2681 if (res != NULL && !PyIter_Check(res)) {
2682 PyErr_Format(PyExc_TypeError,
2683 "iter() returned non-iterator "
2684 "of type '%.100s'",
2685 res->ob_type->tp_name);
2686 Py_DECREF(res);
2687 res = NULL;
2688 }
2689 return res;
2690 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002691}
2692
Tim Petersf4848da2001-05-05 00:14:56 +00002693/* Return next item.
2694 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2695 * If the iteration terminates normally, return NULL and clear the
2696 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2697 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002699 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002700PyObject *
2701PyIter_Next(PyObject *iter)
2702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 PyObject *result;
2704 result = (*iter->ob_type->tp_iternext)(iter);
2705 if (result == NULL &&
2706 PyErr_Occurred() &&
2707 PyErr_ExceptionMatches(PyExc_StopIteration))
2708 PyErr_Clear();
2709 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002710}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002711
2712
2713/*
2714 * Flatten a sequence of bytes() objects into a C array of
2715 * NULL terminated string pointers with a NULL char* terminating the array.
2716 * (ie: an argv or env list)
2717 *
2718 * Memory allocated for the returned list is allocated using malloc() and MUST
2719 * be freed by the caller using a free() loop or _Py_FreeCharPArray().
2720 */
2721char *const *
2722_PySequence_BytesToCharpArray(PyObject* self)
2723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 char **array;
2725 Py_ssize_t i, argc;
2726 PyObject *item = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 argc = PySequence_Size(self);
2729 if (argc == -1)
2730 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002731
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002732 assert(argc >= 0);
2733
2734 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2735 PyErr_NoMemory();
2736 return NULL;
2737 }
2738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 array = malloc((argc + 1) * sizeof(char *));
2740 if (array == NULL) {
2741 PyErr_NoMemory();
2742 return NULL;
2743 }
2744 for (i = 0; i < argc; ++i) {
2745 char *data;
2746 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002747 if (item == NULL) {
2748 /* NULL terminate before freeing. */
2749 array[i] = NULL;
2750 goto fail;
2751 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 data = PyBytes_AsString(item);
2753 if (data == NULL) {
2754 /* NULL terminate before freeing. */
2755 array[i] = NULL;
2756 goto fail;
2757 }
2758 array[i] = strdup(data);
2759 if (!array[i]) {
2760 PyErr_NoMemory();
2761 goto fail;
2762 }
2763 Py_DECREF(item);
2764 }
2765 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002768
2769fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 Py_XDECREF(item);
2771 _Py_FreeCharPArray(array);
2772 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002773}
2774
2775
2776/* Free's a NULL terminated char** array of C strings. */
2777void
2778_Py_FreeCharPArray(char *const array[])
2779{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 Py_ssize_t i;
2781 for (i = 0; array[i] != NULL; ++i) {
2782 free(array[i]);
2783 }
2784 free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002785}