blob: ab1347683e3cfb234324e6437da61076d0f32258 [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 Ronacher74b38b12012-10-07 10:29:32 +020074 or o.__length_hint__(). If those methods aren't found the defaultvalue is
75 returned. If one of the calls fails with an exception other than TypeError
76 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000077*/
78
79Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020080PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000081{
Christian Heimesb70e8a12012-10-06 17:16:39 +020082 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020083 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050084 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030085 if (_PyObject_HasLen(o)) {
86 res = PyObject_Length(o);
87 if (res < 0 && PyErr_Occurred()) {
88 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
89 return -1;
90 }
91 PyErr_Clear();
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020092 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +030093 else {
94 return res;
95 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000096 }
Christian Heimes6314d162012-10-06 17:13:29 +020097 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020098 if (hint == NULL) {
99 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200101 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 return defaultvalue;
103 }
Christian Heimesb70e8a12012-10-06 17:16:39 +0200104 result = PyObject_CallFunctionObjArgs(hint, NULL);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200105 Py_DECREF(hint);
106 if (result == NULL) {
107 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
108 PyErr_Clear();
109 return defaultvalue;
110 }
111 return -1;
112 }
113 else if (result == Py_NotImplemented) {
114 Py_DECREF(result);
115 return defaultvalue;
116 }
117 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200118 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200119 Py_TYPE(result)->tp_name);
120 Py_DECREF(result);
121 return -1;
122 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200123 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200124 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200125 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200126 return -1;
127 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200128 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200129 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
130 return -1;
131 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200132 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000133}
134
Guido van Rossume15dee51995-07-18 14:12:02 +0000135PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000136PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 if (o == NULL || key == NULL)
141 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 m = o->ob_type->tp_as_mapping;
144 if (m && m->mp_subscript)
145 return m->mp_subscript(o, key);
Guido van Rossume15dee51995-07-18 14:12:02 +0000146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 if (o->ob_type->tp_as_sequence) {
148 if (PyIndex_Check(key)) {
149 Py_ssize_t key_value;
150 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
151 if (key_value == -1 && PyErr_Occurred())
152 return NULL;
153 return PySequence_GetItem(o, key_value);
154 }
155 else if (o->ob_type->tp_as_sequence->sq_item)
156 return type_error("sequence index must "
157 "be integer, not '%.200s'", key);
158 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000161}
162
163int
Fred Drake79912472000-07-09 04:06:11 +0000164PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 if (o == NULL || key == NULL || value == NULL) {
169 null_error();
170 return -1;
171 }
172 m = o->ob_type->tp_as_mapping;
173 if (m && m->mp_ass_subscript)
174 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 if (o->ob_type->tp_as_sequence) {
177 if (PyIndex_Check(key)) {
178 Py_ssize_t key_value;
179 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
180 if (key_value == -1 && PyErr_Occurred())
181 return -1;
182 return PySequence_SetItem(o, key_value, value);
183 }
184 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
185 type_error("sequence index must be "
186 "integer, not '%.200s'", key);
187 return -1;
188 }
189 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 type_error("'%.200s' object does not support item assignment", o);
192 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000193}
194
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000195int
Fred Drake79912472000-07-09 04:06:11 +0000196PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 if (o == NULL || key == NULL) {
201 null_error();
202 return -1;
203 }
204 m = o->ob_type->tp_as_mapping;
205 if (m && m->mp_ass_subscript)
206 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 if (o->ob_type->tp_as_sequence) {
209 if (PyIndex_Check(key)) {
210 Py_ssize_t key_value;
211 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
212 if (key_value == -1 && PyErr_Occurred())
213 return -1;
214 return PySequence_DelItem(o, key_value);
215 }
216 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
217 type_error("sequence index must be "
218 "integer, not '%.200s'", key);
219 return -1;
220 }
221 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 type_error("'%.200s' object does not support item deletion", o);
224 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000225}
226
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000227int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300228PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000229{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 PyObject *okey;
231 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 if (o == NULL || key == NULL) {
234 null_error();
235 return -1;
236 }
237 okey = PyUnicode_FromString(key);
238 if (okey == NULL)
239 return -1;
240 ret = PyObject_DelItem(o, okey);
241 Py_DECREF(okey);
242 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000243}
244
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000245/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000246 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000247 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000248int
249PyObject_AsCharBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 const char **buffer,
251 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000252{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200253 return PyObject_AsReadBuffer(obj, (const void **)buffer, buffer_len);
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000254}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000255
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000256int
257PyObject_CheckReadBuffer(PyObject *obj)
258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
260 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 if (pb == NULL ||
263 pb->bf_getbuffer == NULL)
264 return 0;
265 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
266 PyErr_Clear();
267 return 0;
268 }
269 PyBuffer_Release(&view);
270 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000271}
272
273int PyObject_AsReadBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 const void **buffer,
275 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
280 null_error();
281 return -1;
282 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200283 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 *buffer = view.buf;
287 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200288 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000290}
291
292int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 void **buffer,
294 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 PyBufferProcs *pb;
297 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
300 null_error();
301 return -1;
302 }
303 pb = obj->ob_type->tp_as_buffer;
304 if (pb == NULL ||
305 pb->bf_getbuffer == NULL ||
306 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
307 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400308 "expected a writable bytes-like object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 return -1;
310 }
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;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200314 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000316}
317
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000318/* Buffer C-API for Python 3.0 */
319
320int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000321PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000322{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200323 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
324
325 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400327 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 Py_TYPE(obj)->tp_name);
329 return -1;
330 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200331 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000332}
333
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000334static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100335_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000336{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 Py_ssize_t sd, dim;
338 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000339
Stefan Krah363af442015-02-01 14:53:54 +0100340 /* 1) len = product(shape) * itemsize
341 2) itemsize > 0
342 3) len = 0 <==> exists i: shape[i] = 0 */
343 if (view->len == 0) return 1;
344 if (view->strides == NULL) { /* C-contiguous by definition */
345 /* Trivially F-contiguous */
346 if (view->ndim <= 1) return 1;
347
348 /* ndim > 1 implies shape != NULL */
349 assert(view->shape != NULL);
350
351 /* Effectively 1-d */
352 sd = 0;
353 for (i=0; i<view->ndim; i++) {
354 if (view->shape[i] > 1) sd += 1;
355 }
356 return sd <= 1;
357 }
358
359 /* strides != NULL implies both of these */
360 assert(view->ndim > 0);
361 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 for (i=0; i<view->ndim; i++) {
365 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100366 if (dim > 1 && view->strides[i] != sd) {
367 return 0;
368 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 sd *= dim;
370 }
371 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000372}
373
374static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100375_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 Py_ssize_t sd, dim;
378 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000379
Stefan Krah363af442015-02-01 14:53:54 +0100380 /* 1) len = product(shape) * itemsize
381 2) itemsize > 0
382 3) len = 0 <==> exists i: shape[i] = 0 */
383 if (view->len == 0) return 1;
384 if (view->strides == NULL) return 1; /* C-contiguous by definition */
385
386 /* strides != NULL implies both of these */
387 assert(view->ndim > 0);
388 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 for (i=view->ndim-1; i>=0; i--) {
392 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100393 if (dim > 1 && view->strides[i] != sd) {
394 return 0;
395 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 sd *= dim;
397 }
398 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000399}
400
401int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100402PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000403{
404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000406
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100407 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100409 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100411 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 return (_IsCContiguous(view) || _IsFortranContiguous(view));
413 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000414}
415
416
Guido van Rossum98297ee2007-11-06 21:34:58 +0000417void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000418PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 char* pointer;
421 int i;
422 pointer = (char *)view->buf;
423 for (i = 0; i < view->ndim; i++) {
424 pointer += view->strides[i]*indices[i];
425 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
426 pointer = *((char**)pointer) + view->suboffsets[i];
427 }
428 }
429 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000430}
431
432
Guido van Rossum98297ee2007-11-06 21:34:58 +0000433void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000434_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 +0000435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 for (k=0; k<nd; k++) {
439 if (index[k] < shape[k]-1) {
440 index[k]++;
441 break;
442 }
443 else {
444 index[k] = 0;
445 }
446 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000447}
448
Guido van Rossum98297ee2007-11-06 21:34:58 +0000449void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000450_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 +0000451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 for (k=nd-1; k>=0; k--) {
455 if (index[k] < shape[k]-1) {
456 index[k]++;
457 break;
458 }
459 else {
460 index[k] = 0;
461 }
462 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000463}
464
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000465int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000466PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000469 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 Py_ssize_t *indices, elements;
471 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 if (len > view->len) {
474 len = view->len;
475 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 if (PyBuffer_IsContiguous(view, fort)) {
478 /* simplest copy is all that is needed */
479 memcpy(view->buf, buf, len);
480 return 0;
481 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000484
Stefan Krah7213fcc2015-02-01 16:19:23 +0100485 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
487 if (indices == NULL) {
488 PyErr_NoMemory();
489 return -1;
490 }
491 for (k=0; k<view->ndim;k++) {
492 indices[k] = 0;
493 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000496 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 }
498 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000499 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 }
501 src = buf;
502 /* XXX : This is not going to be the fastest code in the world
503 several optimizations are possible.
504 */
505 elements = len / view->itemsize;
506 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 ptr = PyBuffer_GetPointer(view, indices);
508 memcpy(ptr, src, view->itemsize);
509 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100510 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 PyMem_Free(indices);
514 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000515}
516
Guido van Rossum98297ee2007-11-06 21:34:58 +0000517int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 Py_buffer view_dest, view_src;
520 int k;
521 Py_ssize_t *indices, elements;
522 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 if (!PyObject_CheckBuffer(dest) ||
525 !PyObject_CheckBuffer(src)) {
526 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400527 "both destination and source must be "\
528 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 return -1;
530 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
533 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
534 PyBuffer_Release(&view_dest);
535 return -1;
536 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (view_dest.len < view_src.len) {
539 PyErr_SetString(PyExc_BufferError,
540 "destination is too small to receive data from source");
541 PyBuffer_Release(&view_dest);
542 PyBuffer_Release(&view_src);
543 return -1;
544 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
547 PyBuffer_IsContiguous(&view_src, 'C')) ||
548 (PyBuffer_IsContiguous(&view_dest, 'F') &&
549 PyBuffer_IsContiguous(&view_src, 'F'))) {
550 /* simplest copy is all that is needed */
551 memcpy(view_dest.buf, view_src.buf, view_src.len);
552 PyBuffer_Release(&view_dest);
553 PyBuffer_Release(&view_src);
554 return 0;
555 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 /* XXX(nnorwitz): need to check for overflow! */
560 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
561 if (indices == NULL) {
562 PyErr_NoMemory();
563 PyBuffer_Release(&view_dest);
564 PyBuffer_Release(&view_src);
565 return -1;
566 }
567 for (k=0; k<view_src.ndim;k++) {
568 indices[k] = 0;
569 }
570 elements = 1;
571 for (k=0; k<view_src.ndim; k++) {
572 /* XXX(nnorwitz): can this overflow? */
573 elements *= view_src.shape[k];
574 }
575 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000576 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 dptr = PyBuffer_GetPointer(&view_dest, indices);
578 sptr = PyBuffer_GetPointer(&view_src, indices);
579 memcpy(dptr, sptr, view_src.itemsize);
580 }
581 PyMem_Free(indices);
582 PyBuffer_Release(&view_dest);
583 PyBuffer_Release(&view_src);
584 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000585}
586
587void
588PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 Py_ssize_t *strides, int itemsize,
590 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 int k;
593 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 sd = itemsize;
596 if (fort == 'F') {
597 for (k=0; k<nd; k++) {
598 strides[k] = sd;
599 sd *= shape[k];
600 }
601 }
602 else {
603 for (k=nd-1; k>=0; k--) {
604 strides[k] = sd;
605 sd *= shape[k];
606 }
607 }
608 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000609}
610
611int
Martin v. Löwis423be952008-08-13 15:53:07 +0000612PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100613 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000614{
Stefan Krah5178d912015-02-03 16:57:21 +0100615 if (view == NULL) {
616 PyErr_SetString(PyExc_BufferError,
617 "PyBuffer_FillInfo: view==NULL argument is obsolete");
618 return -1;
619 }
620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
622 (readonly == 1)) {
623 PyErr_SetString(PyExc_BufferError,
624 "Object is not writable.");
625 return -1;
626 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 view->obj = obj;
629 if (obj)
630 Py_INCREF(obj);
631 view->buf = buf;
632 view->len = len;
633 view->readonly = readonly;
634 view->itemsize = 1;
635 view->format = NULL;
636 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
637 view->format = "B";
638 view->ndim = 1;
639 view->shape = NULL;
640 if ((flags & PyBUF_ND) == PyBUF_ND)
641 view->shape = &(view->len);
642 view->strides = NULL;
643 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
644 view->strides = &(view->itemsize);
645 view->suboffsets = NULL;
646 view->internal = NULL;
647 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000648}
649
Martin v. Löwis423be952008-08-13 15:53:07 +0000650void
651PyBuffer_Release(Py_buffer *view)
652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200654 PyBufferProcs *pb;
655 if (obj == NULL)
656 return;
657 pb = Py_TYPE(obj)->tp_as_buffer;
658 if (pb && pb->bf_releasebuffer)
659 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200661 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000662}
663
Eric Smith8fd3eba2008-02-17 19:48:00 +0000664PyObject *
665PyObject_Format(PyObject *obj, PyObject *format_spec)
666{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000667 PyObject *meth;
668 PyObject *empty = NULL;
669 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500670 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000671
672 /* If no format_spec is provided, use an empty string */
673 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100674 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000675 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000676 }
677
Eric Smith8fd3eba2008-02-17 19:48:00 +0000678 /* Find the (unbound!) __format__ method (a borrowed reference) */
Benjamin Petersonce798522012-01-22 11:24:29 -0500679 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000680 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000681 if (!PyErr_Occurred())
682 PyErr_Format(PyExc_TypeError,
683 "Type %.100s doesn't define __format__",
684 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000686 }
687
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000688 /* And call it. */
689 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000690 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000691
692 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800693 PyErr_Format(PyExc_TypeError,
694 "__format__ must return a str, not %.200s",
695 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000696 Py_DECREF(result);
697 result = NULL;
698 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000699 }
700
701done:
702 Py_XDECREF(empty);
703 return result;
704}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000705/* Operations on numbers */
706
707int
Fred Drake79912472000-07-09 04:06:11 +0000708PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 return o && o->ob_type->tp_as_number &&
711 (o->ob_type->tp_as_number->nb_int ||
712 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000713}
714
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000715/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000716
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000717#define NB_SLOT(x) offsetof(PyNumberMethods, x)
718#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000720#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000722
723/*
724 Calling scheme used for binary operations:
725
Neal Norwitz4886cc32006-08-21 17:06:07 +0000726 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000729 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
730 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000731 */
732
733static PyObject *
734binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 PyObject *x;
737 binaryfunc slotv = NULL;
738 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 if (v->ob_type->tp_as_number != NULL)
741 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
742 if (w->ob_type != v->ob_type &&
743 w->ob_type->tp_as_number != NULL) {
744 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
745 if (slotw == slotv)
746 slotw = NULL;
747 }
748 if (slotv) {
749 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
750 x = slotw(v, w);
751 if (x != Py_NotImplemented)
752 return x;
753 Py_DECREF(x); /* can't do it */
754 slotw = NULL;
755 }
756 x = slotv(v, w);
757 if (x != Py_NotImplemented)
758 return x;
759 Py_DECREF(x); /* can't do it */
760 }
761 if (slotw) {
762 x = slotw(v, w);
763 if (x != Py_NotImplemented)
764 return x;
765 Py_DECREF(x); /* can't do it */
766 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500767 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768}
Guido van Rossum77660912002-04-16 16:32:50 +0000769
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000770static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000771binop_type_error(PyObject *v, PyObject *w, const char *op_name)
772{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 PyErr_Format(PyExc_TypeError,
774 "unsupported operand type(s) for %.100s: "
775 "'%.100s' and '%.100s'",
776 op_name,
777 v->ob_type->tp_name,
778 w->ob_type->tp_name);
779 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000780}
781
782static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000783binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 PyObject *result = binary_op1(v, w, op_slot);
786 if (result == Py_NotImplemented) {
787 Py_DECREF(result);
788 return binop_type_error(v, w, op_name);
789 }
790 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000791}
792
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000793
794/*
795 Calling scheme used for ternary operations:
796
Neal Norwitz4886cc32006-08-21 17:06:07 +0000797 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000799 */
800
801static PyObject *
802ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 PyObject *w,
804 PyObject *z,
805 const int op_slot,
806 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 PyNumberMethods *mv, *mw, *mz;
809 PyObject *x = NULL;
810 ternaryfunc slotv = NULL;
811 ternaryfunc slotw = NULL;
812 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 mv = v->ob_type->tp_as_number;
815 mw = w->ob_type->tp_as_number;
816 if (mv != NULL)
817 slotv = NB_TERNOP(mv, op_slot);
818 if (w->ob_type != v->ob_type &&
819 mw != NULL) {
820 slotw = NB_TERNOP(mw, op_slot);
821 if (slotw == slotv)
822 slotw = NULL;
823 }
824 if (slotv) {
825 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
826 x = slotw(v, w, z);
827 if (x != Py_NotImplemented)
828 return x;
829 Py_DECREF(x); /* can't do it */
830 slotw = NULL;
831 }
832 x = slotv(v, w, z);
833 if (x != Py_NotImplemented)
834 return x;
835 Py_DECREF(x); /* can't do it */
836 }
837 if (slotw) {
838 x = slotw(v, w, z);
839 if (x != Py_NotImplemented)
840 return x;
841 Py_DECREF(x); /* can't do it */
842 }
843 mz = z->ob_type->tp_as_number;
844 if (mz != NULL) {
845 slotz = NB_TERNOP(mz, op_slot);
846 if (slotz == slotv || slotz == slotw)
847 slotz = NULL;
848 if (slotz) {
849 x = slotz(v, w, z);
850 if (x != Py_NotImplemented)
851 return x;
852 Py_DECREF(x); /* can't do it */
853 }
854 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 if (z == Py_None)
857 PyErr_Format(
858 PyExc_TypeError,
859 "unsupported operand type(s) for ** or pow(): "
860 "'%.100s' and '%.100s'",
861 v->ob_type->tp_name,
862 w->ob_type->tp_name);
863 else
864 PyErr_Format(
865 PyExc_TypeError,
866 "unsupported operand type(s) for pow(): "
867 "'%.100s', '%.100s', '%.100s'",
868 v->ob_type->tp_name,
869 w->ob_type->tp_name,
870 z->ob_type->tp_name);
871 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000872}
873
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000874#define BINARY_FUNC(func, op, op_name) \
875 PyObject * \
876 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000878 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000879
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880BINARY_FUNC(PyNumber_Or, nb_or, "|")
881BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
882BINARY_FUNC(PyNumber_And, nb_and, "&")
883BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
884BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
885BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000886BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000887
888PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000889PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
892 if (result == Py_NotImplemented) {
893 PySequenceMethods *m = v->ob_type->tp_as_sequence;
894 Py_DECREF(result);
895 if (m && m->sq_concat) {
896 return (*m->sq_concat)(v, w);
897 }
898 result = binop_type_error(v, w, "+");
899 }
900 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000901}
902
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000903static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000904sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 Py_ssize_t count;
907 if (PyIndex_Check(n)) {
908 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
909 if (count == -1 && PyErr_Occurred())
910 return NULL;
911 }
912 else {
913 return type_error("can't multiply sequence by "
914 "non-int of type '%.200s'", n);
915 }
916 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000917}
918
919PyObject *
920PyNumber_Multiply(PyObject *v, PyObject *w)
921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
923 if (result == Py_NotImplemented) {
924 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
925 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
926 Py_DECREF(result);
927 if (mv && mv->sq_repeat) {
928 return sequence_repeat(mv->sq_repeat, v, w);
929 }
930 else if (mw && mw->sq_repeat) {
931 return sequence_repeat(mw->sq_repeat, w, v);
932 }
933 result = binop_type_error(v, w, "*");
934 }
935 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000936}
937
Guido van Rossume15dee51995-07-18 14:12:02 +0000938PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -0400939PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
940{
941 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
942}
943
944PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000945PyNumber_FloorDivide(PyObject *v, PyObject *w)
946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +0000948}
949
950PyObject *
951PyNumber_TrueDivide(PyObject *v, PyObject *w)
952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +0000954}
955
956PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000957PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000960}
961
962PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000963PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000966}
967
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000968/* Binary in-place operators */
969
970/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000971 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000972
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000973 - If the left hand object has the appropriate struct members, and
974 they are filled, call the appropriate function and return the
975 result. No coercion is done on the arguments; the left-hand object
976 is the one the operation is performed on, and it's up to the
977 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000978
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000979 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000980 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000981
982 */
983
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000984static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000985binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 PyNumberMethods *mv = v->ob_type->tp_as_number;
988 if (mv != NULL) {
989 binaryfunc slot = NB_BINOP(mv, iop_slot);
990 if (slot) {
991 PyObject *x = (slot)(v, w);
992 if (x != Py_NotImplemented) {
993 return x;
994 }
995 Py_DECREF(x);
996 }
997 }
998 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000999}
1000
1001static PyObject *
1002binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1006 if (result == Py_NotImplemented) {
1007 Py_DECREF(result);
1008 return binop_type_error(v, w, op_name);
1009 }
1010 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001011}
1012
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001013#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 PyObject * \
1015 func(PyObject *v, PyObject *w) { \
1016 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1017 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001018
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001019INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1020INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1021INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1022INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1023INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1024INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001025INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001026
1027PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001028PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1031 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001032}
1033
1034PyObject *
1035PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1038 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001039}
1040
1041PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001042PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1045 NB_SLOT(nb_add));
1046 if (result == Py_NotImplemented) {
1047 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1048 Py_DECREF(result);
1049 if (m != NULL) {
1050 binaryfunc f = NULL;
1051 f = m->sq_inplace_concat;
1052 if (f == NULL)
1053 f = m->sq_concat;
1054 if (f != NULL)
1055 return (*f)(v, w);
1056 }
1057 result = binop_type_error(v, w, "+=");
1058 }
1059 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001060}
1061
1062PyObject *
1063PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1066 NB_SLOT(nb_multiply));
1067 if (result == Py_NotImplemented) {
1068 ssizeargfunc f = NULL;
1069 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1070 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1071 Py_DECREF(result);
1072 if (mv != NULL) {
1073 f = mv->sq_inplace_repeat;
1074 if (f == NULL)
1075 f = mv->sq_repeat;
1076 if (f != NULL)
1077 return sequence_repeat(f, v, w);
1078 }
1079 else if (mw != NULL) {
1080 /* Note that the right hand operand should not be
1081 * mutated in this case so sq_inplace_repeat is not
1082 * used. */
1083 if (mw->sq_repeat)
1084 return sequence_repeat(mw->sq_repeat, w, v);
1085 }
1086 result = binop_type_error(v, w, "*=");
1087 }
1088 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001089}
1090
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001091PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001092PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1093{
1094 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1095 NB_SLOT(nb_matrix_multiply), "@=");
1096}
1097
1098PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001099PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1102 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001103}
1104
1105PyObject *
1106PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 if (v->ob_type->tp_as_number &&
1109 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1110 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1111 }
1112 else {
1113 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1114 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001115}
1116
1117
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001118/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001119
1120PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001121PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 if (o == NULL)
1126 return null_error();
1127 m = o->ob_type->tp_as_number;
1128 if (m && m->nb_negative)
1129 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001131 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001132}
1133
1134PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001135PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 if (o == NULL)
1140 return null_error();
1141 m = o->ob_type->tp_as_number;
1142 if (m && m->nb_positive)
1143 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001146}
1147
1148PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001149PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (o == NULL)
1154 return null_error();
1155 m = o->ob_type->tp_as_number;
1156 if (m && m->nb_invert)
1157 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001160}
1161
1162PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001163PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 if (o == NULL)
1168 return null_error();
1169 m = o->ob_type->tp_as_number;
1170 if (m && m->nb_absolute)
1171 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001174}
1175
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001176/* Return a Python int from the object item.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001177 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001178 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001179*/
1180PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001181PyNumber_Index(PyObject *item)
1182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 PyObject *result = NULL;
1184 if (item == NULL)
1185 return null_error();
1186 if (PyLong_Check(item)) {
1187 Py_INCREF(item);
1188 return item;
1189 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001190 if (!PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 PyErr_Format(PyExc_TypeError,
1192 "'%.200s' object cannot be interpreted "
1193 "as an integer", item->ob_type->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001194 return NULL;
1195 }
1196 result = item->ob_type->tp_as_number->nb_index(item);
1197 if (!result || PyLong_CheckExact(result))
1198 return result;
1199 if (!PyLong_Check(result)) {
1200 PyErr_Format(PyExc_TypeError,
1201 "__index__ returned non-int (type %.200s)",
1202 result->ob_type->tp_name);
1203 Py_DECREF(result);
1204 return NULL;
1205 }
1206 /* Issue #17576: warn if 'result' not of exact type int. */
1207 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1208 "__index__ returned non-int (type %.200s). "
1209 "The ability to return an instance of a strict subclass of int "
1210 "is deprecated, and may be removed in a future version of Python.",
1211 result->ob_type->tp_name)) {
1212 Py_DECREF(result);
1213 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 }
1215 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001216}
1217
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001218/* Return an error on Overflow only if err is not NULL*/
1219
1220Py_ssize_t
1221PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1222{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 Py_ssize_t result;
1224 PyObject *runerr;
1225 PyObject *value = PyNumber_Index(item);
1226 if (value == NULL)
1227 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 /* We're done if PyLong_AsSsize_t() returns without error. */
1230 result = PyLong_AsSsize_t(value);
1231 if (result != -1 || !(runerr = PyErr_Occurred()))
1232 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 /* Error handling code -- only manage OverflowError differently */
1235 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1236 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 PyErr_Clear();
1239 /* If no error-handling desired then the default clipping
1240 is sufficient.
1241 */
1242 if (!err) {
1243 assert(PyLong_Check(value));
1244 /* Whether or not it is less than or equal to
1245 zero is determined by the sign of ob_size
1246 */
1247 if (_PyLong_Sign(value) < 0)
1248 result = PY_SSIZE_T_MIN;
1249 else
1250 result = PY_SSIZE_T_MAX;
1251 }
1252 else {
1253 /* Otherwise replace the error with caller's error object. */
1254 PyErr_Format(err,
1255 "cannot fit '%.200s' into an index-sized integer",
1256 item->ob_type->tp_name);
1257 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001258
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001259 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 Py_DECREF(value);
1261 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001262}
1263
1264
Guido van Rossume15dee51995-07-18 14:12:02 +00001265PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001266PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001270 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001271 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 if (o == NULL)
1274 return null_error();
1275 if (PyLong_CheckExact(o)) {
1276 Py_INCREF(o);
1277 return o;
1278 }
1279 m = o->ob_type->tp_as_number;
1280 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001281 return (PyObject *)_PyLong_FromNbInt(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001283 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 if (trunc_func) {
1285 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1286 PyObject *int_instance;
1287 Py_DECREF(trunc_func);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001288 if (truncated == NULL || PyLong_Check(truncated))
1289 return truncated;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 /* __trunc__ is specified to return an Integral type,
Benjamin Peterson520e8502012-03-21 14:51:14 -04001291 but int() needs to return a int. */
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001292 m = truncated->ob_type->tp_as_number;
1293 if (m == NULL || m->nb_int == NULL) {
1294 PyErr_Format(
1295 PyExc_TypeError,
1296 "__trunc__ returned non-Integral (type %.200s)",
1297 truncated->ob_type->tp_name);
1298 Py_DECREF(truncated);
1299 return NULL;
1300 }
1301 int_instance = (PyObject *)_PyLong_FromNbInt(truncated);
1302 Py_DECREF(truncated);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001303 return int_instance;
1304 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001305 if (PyErr_Occurred())
1306 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001307
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001308 if (PyUnicode_Check(o))
1309 /* The below check is done in PyLong_FromUnicode(). */
1310 return PyLong_FromUnicodeObject(o, 10);
1311
1312 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001314 * doesn't do. In particular int('9\x005') must raise an
1315 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001317 PyObject *result = _PyLong_FromBytes(view.buf, view.len, 10);
1318 PyBuffer_Release(&view);
1319 return result;
1320 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001321
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001322 return type_error("int() argument must be a string, a bytes-like object "
1323 "or a number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001324}
1325
1326PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001327PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 if (o == NULL)
1332 return null_error();
1333 m = o->ob_type->tp_as_number;
1334 if (m && m->nb_float) { /* This should include subclasses of float */
1335 PyObject *res = m->nb_float(o);
1336 if (res && !PyFloat_Check(res)) {
1337 PyErr_Format(PyExc_TypeError,
1338 "__float__ returned non-float (type %.200s)",
1339 res->ob_type->tp_name);
1340 Py_DECREF(res);
1341 return NULL;
1342 }
1343 return res;
1344 }
1345 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
1346 PyFloatObject *po = (PyFloatObject *)o;
1347 return PyFloat_FromDouble(po->ob_fval);
1348 }
1349 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001350}
1351
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001352
1353PyObject *
1354PyNumber_ToBase(PyObject *n, int base)
1355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001356 PyObject *res = NULL;
1357 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 if (!index)
1360 return NULL;
1361 if (PyLong_Check(index))
1362 res = _PyLong_Format(index, base);
1363 else
1364 /* It should not be possible to get here, as
1365 PyNumber_Index already has a check for the same
1366 condition */
Serhiy Storchaka95949422013-08-27 19:40:23 +03001367 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 Py_DECREF(index);
1369 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001370}
1371
1372
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001373/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001374
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001375int
Fred Drake79912472000-07-09 04:06:11 +00001376PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 if (PyDict_Check(s))
1379 return 0;
1380 return s != NULL && s->ob_type->tp_as_sequence &&
1381 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001382}
1383
Martin v. Löwis18e16552006-02-15 17:27:45 +00001384Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001385PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 if (s == NULL) {
1390 null_error();
1391 return -1;
1392 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001394 m = s->ob_type->tp_as_sequence;
1395 if (m && m->sq_length)
1396 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 type_error("object of type '%.200s' has no len()", s);
1399 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001400}
1401
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001402#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001403Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001404PySequence_Length(PyObject *s)
1405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001407}
1408#define PySequence_Length PySequence_Size
1409
Guido van Rossume15dee51995-07-18 14:12:02 +00001410PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001411PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (s == NULL || o == NULL)
1416 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 m = s->ob_type->tp_as_sequence;
1419 if (m && m->sq_concat)
1420 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 /* Instances of user classes defining an __add__() method only
1423 have an nb_add slot, not an sq_concat slot. So we fall back
1424 to nb_add if both arguments appear to be sequences. */
1425 if (PySequence_Check(s) && PySequence_Check(o)) {
1426 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1427 if (result != Py_NotImplemented)
1428 return result;
1429 Py_DECREF(result);
1430 }
1431 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001432}
1433
1434PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001435PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (o == NULL)
1440 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 m = o->ob_type->tp_as_sequence;
1443 if (m && m->sq_repeat)
1444 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001446 /* Instances of user classes defining a __mul__() method only
1447 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1448 to nb_multiply if o appears to be a sequence. */
1449 if (PySequence_Check(o)) {
1450 PyObject *n, *result;
1451 n = PyLong_FromSsize_t(count);
1452 if (n == NULL)
1453 return NULL;
1454 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1455 Py_DECREF(n);
1456 if (result != Py_NotImplemented)
1457 return result;
1458 Py_DECREF(result);
1459 }
1460 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001461}
1462
1463PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001464PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 if (s == NULL || o == NULL)
1469 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 m = s->ob_type->tp_as_sequence;
1472 if (m && m->sq_inplace_concat)
1473 return m->sq_inplace_concat(s, o);
1474 if (m && m->sq_concat)
1475 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 if (PySequence_Check(s) && PySequence_Check(o)) {
1478 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1479 NB_SLOT(nb_add));
1480 if (result != Py_NotImplemented)
1481 return result;
1482 Py_DECREF(result);
1483 }
1484 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001485}
1486
1487PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001488PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 if (o == NULL)
1493 return null_error();
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 m = o->ob_type->tp_as_sequence;
1496 if (m && m->sq_inplace_repeat)
1497 return m->sq_inplace_repeat(o, count);
1498 if (m && m->sq_repeat)
1499 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 if (PySequence_Check(o)) {
1502 PyObject *n, *result;
1503 n = PyLong_FromSsize_t(count);
1504 if (n == NULL)
1505 return NULL;
1506 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1507 NB_SLOT(nb_multiply));
1508 Py_DECREF(n);
1509 if (result != Py_NotImplemented)
1510 return result;
1511 Py_DECREF(result);
1512 }
1513 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001514}
1515
1516PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001517PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 if (s == NULL)
1522 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 m = s->ob_type->tp_as_sequence;
1525 if (m && m->sq_item) {
1526 if (i < 0) {
1527 if (m->sq_length) {
1528 Py_ssize_t l = (*m->sq_length)(s);
1529 if (l < 0)
1530 return NULL;
1531 i += l;
1532 }
1533 }
1534 return m->sq_item(s, i);
1535 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001538}
1539
1540PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001541PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 if (!s) return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001548 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 PyObject *res;
1550 PyObject *slice = _PySlice_FromIndices(i1, i2);
1551 if (!slice)
1552 return NULL;
1553 res = mp->mp_subscript(s, slice);
1554 Py_DECREF(slice);
1555 return res;
1556 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001559}
1560
1561int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001562PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (s == NULL) {
1567 null_error();
1568 return -1;
1569 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 m = s->ob_type->tp_as_sequence;
1572 if (m && m->sq_ass_item) {
1573 if (i < 0) {
1574 if (m->sq_length) {
1575 Py_ssize_t l = (*m->sq_length)(s);
1576 if (l < 0)
1577 return -1;
1578 i += l;
1579 }
1580 }
1581 return m->sq_ass_item(s, i, o);
1582 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 type_error("'%.200s' object does not support item assignment", s);
1585 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001586}
1587
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001588int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001589PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 if (s == NULL) {
1594 null_error();
1595 return -1;
1596 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 m = s->ob_type->tp_as_sequence;
1599 if (m && m->sq_ass_item) {
1600 if (i < 0) {
1601 if (m->sq_length) {
1602 Py_ssize_t l = (*m->sq_length)(s);
1603 if (l < 0)
1604 return -1;
1605 i += l;
1606 }
1607 }
1608 return m->sq_ass_item(s, i, (PyObject *)NULL);
1609 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 type_error("'%.200s' object doesn't support item deletion", s);
1612 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001613}
1614
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001615int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001616PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 if (s == NULL) {
1621 null_error();
1622 return -1;
1623 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001626 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 int res;
1628 PyObject *slice = _PySlice_FromIndices(i1, i2);
1629 if (!slice)
1630 return -1;
1631 res = mp->mp_ass_subscript(s, slice, o);
1632 Py_DECREF(slice);
1633 return res;
1634 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 type_error("'%.200s' object doesn't support slice assignment", s);
1637 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001638}
1639
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001640int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001641PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 if (s == NULL) {
1646 null_error();
1647 return -1;
1648 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001651 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 int res;
1653 PyObject *slice = _PySlice_FromIndices(i1, i2);
1654 if (!slice)
1655 return -1;
1656 res = mp->mp_ass_subscript(s, slice, NULL);
1657 Py_DECREF(slice);
1658 return res;
1659 }
1660 type_error("'%.200s' object doesn't support slice deletion", s);
1661 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001662}
1663
Guido van Rossume15dee51995-07-18 14:12:02 +00001664PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001665PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 PyObject *it; /* iter(v) */
1668 Py_ssize_t n; /* guess for result tuple size */
1669 PyObject *result = NULL;
1670 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 if (v == NULL)
1673 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 /* Special-case the common tuple and list cases, for efficiency. */
1676 if (PyTuple_CheckExact(v)) {
1677 /* Note that we can't know whether it's safe to return
1678 a tuple *subclass* instance as-is, hence the restriction
1679 to exact tuples here. In contrast, lists always make
1680 a copy, so there's no need for exactness below. */
1681 Py_INCREF(v);
1682 return v;
1683 }
1684 if (PyList_Check(v))
1685 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 /* Get iterator. */
1688 it = PyObject_GetIter(v);
1689 if (it == NULL)
1690 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001693 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 if (n == -1)
1695 goto Fail;
1696 result = PyTuple_New(n);
1697 if (result == NULL)
1698 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 /* Fill the tuple. */
1701 for (j = 0; ; ++j) {
1702 PyObject *item = PyIter_Next(it);
1703 if (item == NULL) {
1704 if (PyErr_Occurred())
1705 goto Fail;
1706 break;
1707 }
1708 if (j >= n) {
1709 Py_ssize_t oldn = n;
1710 /* The over-allocation strategy can grow a bit faster
1711 than for lists because unlike lists the
1712 over-allocation isn't permanent -- we reclaim
1713 the excess before the end of this routine.
1714 So, grow by ten and then add 25%.
1715 */
1716 n += 10;
1717 n += n >> 2;
1718 if (n < oldn) {
1719 /* Check for overflow */
1720 PyErr_NoMemory();
1721 Py_DECREF(item);
1722 goto Fail;
1723 }
1724 if (_PyTuple_Resize(&result, n) != 0) {
1725 Py_DECREF(item);
1726 goto Fail;
1727 }
1728 }
1729 PyTuple_SET_ITEM(result, j, item);
1730 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 /* Cut tuple back if guess was too large. */
1733 if (j < n &&
1734 _PyTuple_Resize(&result, j) != 0)
1735 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 Py_DECREF(it);
1738 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001739
1740Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 Py_XDECREF(result);
1742 Py_DECREF(it);
1743 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001744}
1745
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001746PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001747PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 PyObject *result; /* result list */
1750 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 if (v == NULL)
1753 return null_error();
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 result = PyList_New(0);
1756 if (result == NULL)
1757 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 rv = _PyList_Extend((PyListObject *)result, v);
1760 if (rv == NULL) {
1761 Py_DECREF(result);
1762 return NULL;
1763 }
1764 Py_DECREF(rv);
1765 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001766}
1767
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001768PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001769PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 if (v == NULL)
1774 return null_error();
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1777 Py_INCREF(v);
1778 return v;
1779 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 it = PyObject_GetIter(v);
1782 if (it == NULL) {
1783 if (PyErr_ExceptionMatches(PyExc_TypeError))
1784 PyErr_SetString(PyExc_TypeError, m);
1785 return NULL;
1786 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 v = PySequence_List(it);
1789 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001792}
1793
Tim Peters16a77ad2001-09-08 04:00:12 +00001794/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1796 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1797 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001798 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1799*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001800Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001801_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 Py_ssize_t n;
1804 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1805 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 if (seq == NULL || obj == NULL) {
1808 null_error();
1809 return -1;
1810 }
Tim Peters75f8e352001-05-05 11:33:43 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 it = PyObject_GetIter(seq);
1813 if (it == NULL) {
1814 type_error("argument of type '%.200s' is not iterable", seq);
1815 return -1;
1816 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 n = wrapped = 0;
1819 for (;;) {
1820 int cmp;
1821 PyObject *item = PyIter_Next(it);
1822 if (item == NULL) {
1823 if (PyErr_Occurred())
1824 goto Fail;
1825 break;
1826 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1829 Py_DECREF(item);
1830 if (cmp < 0)
1831 goto Fail;
1832 if (cmp > 0) {
1833 switch (operation) {
1834 case PY_ITERSEARCH_COUNT:
1835 if (n == PY_SSIZE_T_MAX) {
1836 PyErr_SetString(PyExc_OverflowError,
1837 "count exceeds C integer size");
1838 goto Fail;
1839 }
1840 ++n;
1841 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 case PY_ITERSEARCH_INDEX:
1844 if (wrapped) {
1845 PyErr_SetString(PyExc_OverflowError,
1846 "index exceeds C integer size");
1847 goto Fail;
1848 }
1849 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 case PY_ITERSEARCH_CONTAINS:
1852 n = 1;
1853 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 default:
1856 assert(!"unknown operation");
1857 }
1858 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 if (operation == PY_ITERSEARCH_INDEX) {
1861 if (n == PY_SSIZE_T_MAX)
1862 wrapped = 1;
1863 ++n;
1864 }
1865 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (operation != PY_ITERSEARCH_INDEX)
1868 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 PyErr_SetString(PyExc_ValueError,
1871 "sequence.index(x): x not in sequence");
1872 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00001873Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 n = -1;
1875 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00001876Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 Py_DECREF(it);
1878 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001879
Guido van Rossume15dee51995-07-18 14:12:02 +00001880}
1881
Tim Peters16a77ad2001-09-08 04:00:12 +00001882/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001883Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001884PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001885{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001887}
1888
Tim Peterscb8d3682001-05-05 21:05:01 +00001889/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001890 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001891 */
1892int
1893PySequence_Contains(PyObject *seq, PyObject *ob)
1894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 Py_ssize_t result;
1896 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1897 if (sqm != NULL && sqm->sq_contains != NULL)
1898 return (*sqm->sq_contains)(seq, ob);
1899 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1900 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001901}
1902
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001903/* Backwards compatibility */
1904#undef PySequence_In
1905int
Fred Drake79912472000-07-09 04:06:11 +00001906PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001908 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001909}
1910
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001911Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001912PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001915}
1916
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001917/* Operations on mappings */
1918
1919int
Fred Drake79912472000-07-09 04:06:11 +00001920PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001921{
Benjamin Peterson21992272011-12-28 12:01:31 -06001922 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001924}
1925
Martin v. Löwis18e16552006-02-15 17:27:45 +00001926Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001927PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001928{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 if (o == NULL) {
1932 null_error();
1933 return -1;
1934 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 m = o->ob_type->tp_as_mapping;
1937 if (m && m->mp_length)
1938 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 type_error("object of type '%.200s' has no len()", o);
1941 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001942}
1943
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001944#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001945Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001946PyMapping_Length(PyObject *o)
1947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001949}
1950#define PyMapping_Length PyMapping_Size
1951
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001952PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03001953PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 if (key == NULL)
1958 return null_error();
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 okey = PyUnicode_FromString(key);
1961 if (okey == NULL)
1962 return NULL;
1963 r = PyObject_GetItem(o, okey);
1964 Py_DECREF(okey);
1965 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001966}
1967
1968int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001969PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 PyObject *okey;
1972 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 if (key == NULL) {
1975 null_error();
1976 return -1;
1977 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 okey = PyUnicode_FromString(key);
1980 if (okey == NULL)
1981 return -1;
1982 r = PyObject_SetItem(o, okey, value);
1983 Py_DECREF(okey);
1984 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001985}
1986
1987int
Serhiy Storchakac6792272013-10-19 21:03:34 +03001988PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00001989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 v = PyMapping_GetItemString(o, key);
1993 if (v) {
1994 Py_DECREF(v);
1995 return 1;
1996 }
1997 PyErr_Clear();
1998 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00001999}
2000
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002001int
Fred Drake79912472000-07-09 04:06:11 +00002002PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 v = PyObject_GetItem(o, key);
2007 if (v) {
2008 Py_DECREF(v);
2009 return 1;
2010 }
2011 PyErr_Clear();
2012 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002013}
2014
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002015PyObject *
2016PyMapping_Keys(PyObject *o)
2017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 PyObject *keys;
2019 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002020 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 if (PyDict_CheckExact(o))
2023 return PyDict_Keys(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002024 keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 if (keys == NULL)
2026 return NULL;
2027 fast = PySequence_Fast(keys, "o.keys() are not iterable");
2028 Py_DECREF(keys);
2029 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002030}
2031
2032PyObject *
2033PyMapping_Items(PyObject *o)
2034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 PyObject *items;
2036 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002037 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 if (PyDict_CheckExact(o))
2040 return PyDict_Items(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002041 items = _PyObject_CallMethodId(o, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (items == NULL)
2043 return NULL;
2044 fast = PySequence_Fast(items, "o.items() are not iterable");
2045 Py_DECREF(items);
2046 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002047}
2048
2049PyObject *
2050PyMapping_Values(PyObject *o)
2051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 PyObject *values;
2053 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002054 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 if (PyDict_CheckExact(o))
2057 return PyDict_Values(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002058 values = _PyObject_CallMethodId(o, &PyId_values, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 if (values == NULL)
2060 return NULL;
2061 fast = PySequence_Fast(values, "o.values() are not iterable");
2062 Py_DECREF(values);
2063 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002064}
2065
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002066/* Operations on callable objects */
2067
2068/* XXX PyCallable_Check() is in object.c */
2069
Guido van Rossume15dee51995-07-18 14:12:02 +00002070PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002071PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074}
Guido van Rossume15dee51995-07-18 14:12:02 +00002075
Victor Stinner4a7cc882015-03-06 23:35:27 +01002076PyObject*
2077_Py_CheckFunctionResult(PyObject *result, const char *func_name)
2078{
2079 int err_occurred = (PyErr_Occurred() != NULL);
2080
2081#ifdef NDEBUG
2082 /* In debug mode: abort() with an assertion error. Use two different
2083 assertions, so if an assertion fails, it's possible to know
2084 if result was set or not and if an exception was raised or not. */
2085 if (result != NULL)
2086 assert(!err_occurred);
2087 else
2088 assert(err_occurred);
2089#endif
2090
2091 if (result == NULL) {
2092 if (!err_occurred) {
2093 PyErr_Format(PyExc_SystemError,
2094 "NULL result without error in %s", func_name);
2095 return NULL;
2096 }
2097 }
2098 else {
2099 if (err_occurred) {
2100 PyObject *exc, *val, *tb;
2101 PyErr_Fetch(&exc, &val, &tb);
2102
2103 Py_DECREF(result);
2104
2105 PyErr_Format(PyExc_SystemError,
2106 "result with error in %s", func_name);
2107 _PyErr_ChainExceptions(exc, val, tb);
2108 return NULL;
2109 }
2110 }
2111 return result;
2112}
2113
Guido van Rossume15dee51995-07-18 14:12:02 +00002114PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002115PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 ternaryfunc call;
Victor Stinner4a7cc882015-03-06 23:35:27 +01002118 PyObject *result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002119
Victor Stinner8f4ec8d2014-09-05 01:10:29 +02002120 /* PyObject_Call() must not be called with an exception set,
2121 because it may clear it (directly or indirectly) and so the
2122 caller looses its exception */
2123 assert(!PyErr_Occurred());
2124
Victor Stinner4a7cc882015-03-06 23:35:27 +01002125 call = func->ob_type->tp_call;
2126 if (call == NULL) {
2127 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2128 func->ob_type->tp_name);
2129 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002130 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01002131
2132 if (Py_EnterRecursiveCall(" while calling a Python object"))
2133 return NULL;
2134
2135 result = (*call)(func, arg, kw);
2136
2137 Py_LeaveRecursiveCall();
2138
2139 return _Py_CheckFunctionResult(result, "PyObject_Call");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002140}
2141
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002142static PyObject*
2143call_function_tail(PyObject *callable, PyObject *args)
2144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 if (args == NULL)
2148 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 if (!PyTuple_Check(args)) {
2151 PyObject *a;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 a = PyTuple_New(1);
2154 if (a == NULL) {
2155 Py_DECREF(args);
2156 return NULL;
2157 }
2158 PyTuple_SET_ITEM(a, 0, args);
2159 args = a;
2160 }
2161 retval = PyObject_Call(callable, args, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 Py_DECREF(args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002166}
2167
Tim Peters6d6c1a32001-08-02 04:15:00 +00002168PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002169PyObject_CallFunction(PyObject *callable, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 va_list va;
2172 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 if (callable == NULL)
2175 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 if (format && *format) {
2178 va_start(va, format);
2179 args = Py_VaBuildValue(format, va);
2180 va_end(va);
2181 }
2182 else
2183 args = PyTuple_New(0);
Victor Stinner0b0c8672013-10-29 19:29:52 +01002184 if (args == NULL)
2185 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 return call_function_tail(callable, args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002188}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002189
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002190PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002191_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 va_list va;
2194 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 if (callable == NULL)
2197 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 if (format && *format) {
2200 va_start(va, format);
2201 args = _Py_VaBuildValue_SizeT(format, va);
2202 va_end(va);
2203 }
2204 else
2205 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002208}
2209
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002210static PyObject*
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002211callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002212{
2213 PyObject *retval = NULL;
2214 PyObject *args;
2215
2216 if (!PyCallable_Check(func)) {
2217 type_error("attribute of type '%.200s' is not callable", func);
2218 goto exit;
2219 }
2220
2221 if (format && *format) {
2222 if (is_size_t)
2223 args = _Py_VaBuildValue_SizeT(format, va);
2224 else
2225 args = Py_VaBuildValue(format, va);
2226 }
2227 else
2228 args = PyTuple_New(0);
2229
2230 retval = call_function_tail(func, args);
2231
2232 exit:
2233 /* args gets consumed in call_function_tail */
2234 Py_XDECREF(func);
2235
2236 return retval;
2237}
2238
Guido van Rossume15dee51995-07-18 14:12:02 +00002239PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002240PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 PyObject *func = NULL;
2244 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 if (o == NULL || name == NULL)
2247 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002250 if (func == NULL)
2251 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002252
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002253 va_start(va, format);
2254 retval = callmethod(func, format, va, 0);
2255 va_end(va);
2256 return retval;
2257}
2258
2259PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002260_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
2261 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002262{
2263 va_list va;
2264 PyObject *func = NULL;
2265 PyObject *retval = NULL;
2266
2267 if (o == NULL || name == NULL)
2268 return null_error();
2269
2270 func = _PyObject_GetAttrId(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002271 if (func == NULL)
2272 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002273
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002274 va_start(va, format);
2275 retval = callmethod(func, format, va, 0);
2276 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002278}
2279
2280PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002281_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
2282 const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002284 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 PyObject *func = NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002286 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 if (o == NULL || name == NULL)
2289 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002292 if (func == NULL)
2293 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002294 va_start(va, format);
2295 retval = callmethod(func, format, va, 1);
2296 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002298}
Guido van Rossum823649d2001-03-21 18:40:58 +00002299
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002300PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002301_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
2302 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002303{
2304 va_list va;
2305 PyObject *func = NULL;
2306 PyObject *retval;
2307
2308 if (o == NULL || name == NULL)
2309 return null_error();
2310
2311 func = _PyObject_GetAttrId(o, name);
2312 if (func == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002313 return NULL;
2314 }
2315 va_start(va, format);
2316 retval = callmethod(func, format, va, 1);
2317 va_end(va);
2318 return retval;
2319}
Guido van Rossum823649d2001-03-21 18:40:58 +00002320
Fred Drakeb421b8c2001-10-26 16:21:32 +00002321static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002322objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 int i, n = 0;
2325 va_list countva;
2326 PyObject *result, *tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002327
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00002328 Py_VA_COPY(countva, va);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2331 ++n;
2332 result = PyTuple_New(n);
2333 if (result != NULL && n > 0) {
2334 for (i = 0; i < n; ++i) {
2335 tmp = (PyObject *)va_arg(va, PyObject *);
2336 PyTuple_SET_ITEM(result, i, tmp);
2337 Py_INCREF(tmp);
2338 }
2339 }
2340 return result;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002341}
2342
2343PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002344PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 PyObject *args, *tmp;
2347 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 if (callable == NULL || name == NULL)
2350 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 callable = PyObject_GetAttr(callable, name);
2353 if (callable == NULL)
2354 return NULL;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 /* 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);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002369}
2370
2371PyObject *
Alexandre Vassalotti865eaa12013-05-02 10:44:04 -07002372_PyObject_CallMethodIdObjArgs(PyObject *callable,
Brett Cannonfd074152012-04-14 14:10:13 -04002373 struct _Py_Identifier *name, ...)
2374{
2375 PyObject *args, *tmp;
2376 va_list vargs;
2377
2378 if (callable == NULL || name == NULL)
2379 return null_error();
2380
2381 callable = _PyObject_GetAttrId(callable, name);
2382 if (callable == NULL)
2383 return NULL;
2384
2385 /* count the args */
2386 va_start(vargs, name);
2387 args = objargs_mktuple(vargs);
2388 va_end(vargs);
2389 if (args == NULL) {
2390 Py_DECREF(callable);
2391 return NULL;
2392 }
2393 tmp = PyObject_Call(callable, args, NULL);
2394 Py_DECREF(args);
2395 Py_DECREF(callable);
2396
2397 return tmp;
2398}
2399
2400PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002401PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 PyObject *args, *tmp;
2404 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 if (callable == NULL)
2407 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 /* count the args */
2410 va_start(vargs, callable);
2411 args = objargs_mktuple(vargs);
2412 va_end(vargs);
2413 if (args == NULL)
2414 return NULL;
2415 tmp = PyObject_Call(callable, args, NULL);
2416 Py_DECREF(args);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002419}
2420
2421
Guido van Rossum823649d2001-03-21 18:40:58 +00002422/* isinstance(), issubclass() */
2423
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002424/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002425 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002426 * 1. getattr(cls, '__bases__') could raise an AttributeError
2427 * 2. getattr(cls, '__bases__') could raise some other exception
2428 * 3. getattr(cls, '__bases__') could return a tuple
2429 * 4. getattr(cls, '__bases__') could return something other than a tuple
2430 *
2431 * Only state #3 is a non-error state and only it returns a non-NULL object
2432 * (it returns the retrieved tuple).
2433 *
2434 * Any raised AttributeErrors are masked by clearing the exception and
2435 * returning NULL. If an object other than a tuple comes out of __bases__,
2436 * then again, the return value is NULL. So yes, these two situations
2437 * produce exactly the same results: NULL is returned and no error is set.
2438 *
2439 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002441 * exception to be propagated along.
2442 *
2443 * Callers are expected to test for PyErr_Occurred() when the return value
2444 * is NULL to decide whether a valid exception should be propagated or not.
2445 * When there's no exception to propagate, it's customary for the caller to
2446 * set a TypeError.
2447 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002448static PyObject *
2449abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002450{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002451 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002455 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 Py_END_ALLOW_RECURSION
2457 if (bases == NULL) {
2458 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2459 PyErr_Clear();
2460 return NULL;
2461 }
2462 if (!PyTuple_Check(bases)) {
2463 Py_DECREF(bases);
2464 return NULL;
2465 }
2466 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002467}
2468
2469
2470static int
2471abstract_issubclass(PyObject *derived, PyObject *cls)
2472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 PyObject *bases = NULL;
2474 Py_ssize_t i, n;
2475 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 while (1) {
2478 if (derived == cls)
2479 return 1;
2480 bases = abstract_get_bases(derived);
2481 if (bases == NULL) {
2482 if (PyErr_Occurred())
2483 return -1;
2484 return 0;
2485 }
2486 n = PyTuple_GET_SIZE(bases);
2487 if (n == 0) {
2488 Py_DECREF(bases);
2489 return 0;
2490 }
2491 /* Avoid recursivity in the single inheritance case */
2492 if (n == 1) {
2493 derived = PyTuple_GET_ITEM(bases, 0);
2494 Py_DECREF(bases);
2495 continue;
2496 }
2497 for (i = 0; i < n; i++) {
2498 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2499 if (r != 0)
2500 break;
2501 }
2502 Py_DECREF(bases);
2503 return r;
2504 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002505}
2506
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002507static int
2508check_class(PyObject *cls, const char *error)
2509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 PyObject *bases = abstract_get_bases(cls);
2511 if (bases == NULL) {
2512 /* Do not mask errors. */
2513 if (!PyErr_Occurred())
2514 PyErr_SetString(PyExc_TypeError, error);
2515 return 0;
2516 }
2517 Py_DECREF(bases);
2518 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002519}
2520
Brett Cannon4f653312004-03-20 22:52:14 +00002521static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002522recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002526 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 if (PyType_Check(cls)) {
2529 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2530 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002531 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002533 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002534 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002535 else
R. David Murray6bb99892010-11-20 16:33:30 +00002536 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 }
2538 else {
2539 if (c != (PyObject *)(inst->ob_type) &&
2540 PyType_Check(c))
2541 retval = PyType_IsSubtype(
2542 (PyTypeObject *)c,
2543 (PyTypeObject *)cls);
2544 Py_DECREF(c);
2545 }
2546 }
2547 }
2548 else {
2549 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002550 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002552 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002554 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002555 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002556 else
R. David Murray6bb99892010-11-20 16:33:30 +00002557 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 }
2559 else {
2560 retval = abstract_issubclass(icls, cls);
2561 Py_DECREF(icls);
2562 }
2563 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002566}
2567
2568int
Brett Cannon4f653312004-03-20 22:52:14 +00002569PyObject_IsInstance(PyObject *inst, PyObject *cls)
2570{
Benjamin Petersonce798522012-01-22 11:24:29 -05002571 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 /* Quick test for an exact match */
2575 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2576 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002577
Georg Brandl72b8a802014-10-03 09:26:37 +02002578 /* We know what type's __instancecheck__ does. */
2579 if (PyType_CheckExact(cls)) {
2580 return recursive_isinstance(inst, cls);
2581 }
2582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (PyTuple_Check(cls)) {
2584 Py_ssize_t i;
2585 Py_ssize_t n;
2586 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2589 return -1;
2590 n = PyTuple_GET_SIZE(cls);
2591 for (i = 0; i < n; ++i) {
2592 PyObject *item = PyTuple_GET_ITEM(cls, i);
2593 r = PyObject_IsInstance(inst, item);
2594 if (r != 0)
2595 /* either found it, or got an error */
2596 break;
2597 }
2598 Py_LeaveRecursiveCall();
2599 return r;
2600 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002601
Benjamin Petersonce798522012-01-22 11:24:29 -05002602 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 if (checker != NULL) {
2604 PyObject *res;
2605 int ok = -1;
2606 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2607 Py_DECREF(checker);
2608 return ok;
2609 }
2610 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2611 Py_LeaveRecursiveCall();
2612 Py_DECREF(checker);
2613 if (res != NULL) {
2614 ok = PyObject_IsTrue(res);
2615 Py_DECREF(res);
2616 }
2617 return ok;
2618 }
2619 else if (PyErr_Occurred())
2620 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002621 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002623}
2624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002626recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 if (PyType_Check(cls) && PyType_Check(derived)) {
2629 /* Fast path (non-recursive) */
2630 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2631 }
2632 if (!check_class(derived,
2633 "issubclass() arg 1 must be a class"))
2634 return -1;
2635 if (!check_class(cls,
2636 "issubclass() arg 2 must be a class"
2637 " or tuple of classes"))
2638 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002641}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002642
Brett Cannon4f653312004-03-20 22:52:14 +00002643int
2644PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2645{
Benjamin Petersonce798522012-01-22 11:24:29 -05002646 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002648
Georg Brandl72b8a802014-10-03 09:26:37 +02002649 /* We know what type's __subclasscheck__ does. */
2650 if (PyType_CheckExact(cls)) {
2651 /* Quick test for an exact match */
2652 if (derived == cls)
2653 return 1;
2654 return recursive_issubclass(derived, cls);
2655 }
2656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 if (PyTuple_Check(cls)) {
2658 Py_ssize_t i;
2659 Py_ssize_t n;
2660 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2663 return -1;
2664 n = PyTuple_GET_SIZE(cls);
2665 for (i = 0; i < n; ++i) {
2666 PyObject *item = PyTuple_GET_ITEM(cls, i);
2667 r = PyObject_IsSubclass(derived, item);
2668 if (r != 0)
2669 /* either found it, or got an error */
2670 break;
2671 }
2672 Py_LeaveRecursiveCall();
2673 return r;
2674 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002675
Benjamin Petersonce798522012-01-22 11:24:29 -05002676 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (checker != NULL) {
2678 PyObject *res;
2679 int ok = -1;
2680 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2681 Py_DECREF(checker);
2682 return ok;
2683 }
2684 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2685 Py_LeaveRecursiveCall();
2686 Py_DECREF(checker);
2687 if (res != NULL) {
2688 ok = PyObject_IsTrue(res);
2689 Py_DECREF(res);
2690 }
2691 return ok;
2692 }
2693 else if (PyErr_Occurred())
2694 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002695 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002697}
2698
2699int
2700_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002703}
2704
2705int
2706_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002709}
2710
2711
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002712PyObject *
2713PyObject_GetIter(PyObject *o)
2714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 PyTypeObject *t = o->ob_type;
2716 getiterfunc f = NULL;
2717 f = t->tp_iter;
2718 if (f == NULL) {
2719 if (PySequence_Check(o))
2720 return PySeqIter_New(o);
2721 return type_error("'%.200s' object is not iterable", o);
2722 }
2723 else {
2724 PyObject *res = (*f)(o);
2725 if (res != NULL && !PyIter_Check(res)) {
2726 PyErr_Format(PyExc_TypeError,
2727 "iter() returned non-iterator "
2728 "of type '%.100s'",
2729 res->ob_type->tp_name);
2730 Py_DECREF(res);
2731 res = NULL;
2732 }
2733 return res;
2734 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002735}
2736
Tim Petersf4848da2001-05-05 00:14:56 +00002737/* Return next item.
2738 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2739 * If the iteration terminates normally, return NULL and clear the
2740 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2741 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002743 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002744PyObject *
2745PyIter_Next(PyObject *iter)
2746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 PyObject *result;
2748 result = (*iter->ob_type->tp_iternext)(iter);
2749 if (result == NULL &&
2750 PyErr_Occurred() &&
2751 PyErr_ExceptionMatches(PyExc_StopIteration))
2752 PyErr_Clear();
2753 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002754}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002755
2756
2757/*
2758 * Flatten a sequence of bytes() objects into a C array of
2759 * NULL terminated string pointers with a NULL char* terminating the array.
2760 * (ie: an argv or env list)
2761 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002762 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2763 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002764 */
2765char *const *
2766_PySequence_BytesToCharpArray(PyObject* self)
2767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 char **array;
2769 Py_ssize_t i, argc;
2770 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002771 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 argc = PySequence_Size(self);
2774 if (argc == -1)
2775 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002776
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002777 assert(argc >= 0);
2778
2779 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2780 PyErr_NoMemory();
2781 return NULL;
2782 }
2783
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002784 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 if (array == NULL) {
2786 PyErr_NoMemory();
2787 return NULL;
2788 }
2789 for (i = 0; i < argc; ++i) {
2790 char *data;
2791 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002792 if (item == NULL) {
2793 /* NULL terminate before freeing. */
2794 array[i] = NULL;
2795 goto fail;
2796 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 data = PyBytes_AsString(item);
2798 if (data == NULL) {
2799 /* NULL terminate before freeing. */
2800 array[i] = NULL;
2801 goto fail;
2802 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002803 size = PyBytes_GET_SIZE(item) + 1;
2804 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 if (!array[i]) {
2806 PyErr_NoMemory();
2807 goto fail;
2808 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002809 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 Py_DECREF(item);
2811 }
2812 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002815
2816fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 Py_XDECREF(item);
2818 _Py_FreeCharPArray(array);
2819 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002820}
2821
2822
2823/* Free's a NULL terminated char** array of C strings. */
2824void
2825_Py_FreeCharPArray(char *const array[])
2826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 Py_ssize_t i;
2828 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002829 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002831 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002832}