blob: a19d28c54919b838934c8f13fc75e9ea0e5fcf49 [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*
Victor Stinnerefde1462015-03-21 15:04:43 +01002077_Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
Victor Stinner4a7cc882015-03-06 23:35:27 +01002078{
2079 int err_occurred = (PyErr_Occurred() != NULL);
2080
Victor Stinnerefde1462015-03-21 15:04:43 +01002081 assert((func != NULL) ^ (where != NULL));
2082
Victor Stinner283f3f82015-03-09 15:55:37 +01002083#ifndef NDEBUG
Victor Stinner4a7cc882015-03-06 23:35:27 +01002084 /* In debug mode: abort() with an assertion error. Use two different
2085 assertions, so if an assertion fails, it's possible to know
2086 if result was set or not and if an exception was raised or not. */
2087 if (result != NULL)
2088 assert(!err_occurred);
2089 else
2090 assert(err_occurred);
2091#endif
2092
2093 if (result == NULL) {
2094 if (!err_occurred) {
Victor Stinnerefde1462015-03-21 15:04:43 +01002095 if (func)
2096 PyErr_Format(PyExc_SystemError,
2097 "%R returned NULL without setting an error",
2098 func);
2099 else
2100 PyErr_Format(PyExc_SystemError,
2101 "%s returned NULL without setting an error",
2102 where);
Victor Stinner4a7cc882015-03-06 23:35:27 +01002103 return NULL;
2104 }
2105 }
2106 else {
2107 if (err_occurred) {
2108 PyObject *exc, *val, *tb;
2109 PyErr_Fetch(&exc, &val, &tb);
2110
2111 Py_DECREF(result);
2112
Victor Stinnerefde1462015-03-21 15:04:43 +01002113 if (func)
2114 PyErr_Format(PyExc_SystemError,
2115 "%R returned a result with an error set",
2116 func);
2117 else
2118 PyErr_Format(PyExc_SystemError,
2119 "%s returned a result with an error set",
2120 where);
Victor Stinner4a7cc882015-03-06 23:35:27 +01002121 _PyErr_ChainExceptions(exc, val, tb);
2122 return NULL;
2123 }
2124 }
2125 return result;
2126}
2127
Guido van Rossume15dee51995-07-18 14:12:02 +00002128PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002129PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 ternaryfunc call;
Victor Stinner4a7cc882015-03-06 23:35:27 +01002132 PyObject *result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002133
Victor Stinner8f4ec8d2014-09-05 01:10:29 +02002134 /* PyObject_Call() must not be called with an exception set,
2135 because it may clear it (directly or indirectly) and so the
2136 caller looses its exception */
2137 assert(!PyErr_Occurred());
2138
Victor Stinner4a7cc882015-03-06 23:35:27 +01002139 call = func->ob_type->tp_call;
2140 if (call == NULL) {
2141 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2142 func->ob_type->tp_name);
2143 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01002145
2146 if (Py_EnterRecursiveCall(" while calling a Python object"))
2147 return NULL;
2148
2149 result = (*call)(func, arg, kw);
2150
2151 Py_LeaveRecursiveCall();
2152
Victor Stinnerefde1462015-03-21 15:04:43 +01002153 return _Py_CheckFunctionResult(func, result, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002154}
2155
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002156static PyObject*
2157call_function_tail(PyObject *callable, PyObject *args)
2158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (args == NULL)
2162 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 if (!PyTuple_Check(args)) {
2165 PyObject *a;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 a = PyTuple_New(1);
2168 if (a == NULL) {
2169 Py_DECREF(args);
2170 return NULL;
2171 }
2172 PyTuple_SET_ITEM(a, 0, args);
2173 args = a;
2174 }
2175 retval = PyObject_Call(callable, args, NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 Py_DECREF(args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002180}
2181
Tim Peters6d6c1a32001-08-02 04:15:00 +00002182PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002183PyObject_CallFunction(PyObject *callable, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 va_list va;
2186 PyObject *args;
Guido van Rossume15dee51995-07-18 14:12:02 +00002187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 if (callable == NULL)
2189 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 if (format && *format) {
2192 va_start(va, format);
2193 args = Py_VaBuildValue(format, va);
2194 va_end(va);
2195 }
2196 else
2197 args = PyTuple_New(0);
Victor Stinner0b0c8672013-10-29 19:29:52 +01002198 if (args == NULL)
2199 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002201 return call_function_tail(callable, args);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002202}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002203
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002204PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002205_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002207 va_list va;
2208 PyObject *args;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 if (callable == NULL)
2211 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (format && *format) {
2214 va_start(va, format);
2215 args = _Py_VaBuildValue_SizeT(format, va);
2216 va_end(va);
2217 }
2218 else
2219 args = PyTuple_New(0);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 return call_function_tail(callable, args);
Guido van Rossume15dee51995-07-18 14:12:02 +00002222}
2223
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002224static PyObject*
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002225callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002226{
2227 PyObject *retval = NULL;
2228 PyObject *args;
2229
2230 if (!PyCallable_Check(func)) {
2231 type_error("attribute of type '%.200s' is not callable", func);
2232 goto exit;
2233 }
2234
2235 if (format && *format) {
2236 if (is_size_t)
2237 args = _Py_VaBuildValue_SizeT(format, va);
2238 else
2239 args = Py_VaBuildValue(format, va);
2240 }
2241 else
2242 args = PyTuple_New(0);
2243
2244 retval = call_function_tail(func, args);
2245
2246 exit:
2247 /* args gets consumed in call_function_tail */
2248 Py_XDECREF(func);
2249
2250 return retval;
2251}
2252
Guido van Rossume15dee51995-07-18 14:12:02 +00002253PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002254PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 PyObject *func = NULL;
2258 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (o == NULL || name == NULL)
2261 return null_error();
Guido van Rossume15dee51995-07-18 14:12:02 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002264 if (func == NULL)
2265 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002266
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002267 va_start(va, format);
2268 retval = callmethod(func, format, va, 0);
2269 va_end(va);
2270 return retval;
2271}
2272
2273PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002274_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
2275 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002276{
2277 va_list va;
2278 PyObject *func = NULL;
2279 PyObject *retval = NULL;
2280
2281 if (o == NULL || name == NULL)
2282 return null_error();
2283
2284 func = _PyObject_GetAttrId(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002285 if (func == NULL)
2286 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002287
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002288 va_start(va, format);
2289 retval = callmethod(func, format, va, 0);
2290 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002292}
2293
2294PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002295_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
2296 const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 PyObject *func = NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002300 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 if (o == NULL || name == NULL)
2303 return null_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002306 if (func == NULL)
2307 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002308 va_start(va, format);
2309 retval = callmethod(func, format, va, 1);
2310 va_end(va);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002312}
Guido van Rossum823649d2001-03-21 18:40:58 +00002313
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002314PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002315_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
2316 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002317{
2318 va_list va;
2319 PyObject *func = NULL;
2320 PyObject *retval;
2321
2322 if (o == NULL || name == NULL)
2323 return null_error();
2324
2325 func = _PyObject_GetAttrId(o, name);
2326 if (func == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002327 return NULL;
2328 }
2329 va_start(va, format);
2330 retval = callmethod(func, format, va, 1);
2331 va_end(va);
2332 return retval;
2333}
Guido van Rossum823649d2001-03-21 18:40:58 +00002334
Fred Drakeb421b8c2001-10-26 16:21:32 +00002335static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002336objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002337{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 int i, n = 0;
2339 va_list countva;
2340 PyObject *result, *tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002341
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00002342 Py_VA_COPY(countva, va);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2345 ++n;
2346 result = PyTuple_New(n);
2347 if (result != NULL && n > 0) {
2348 for (i = 0; i < n; ++i) {
2349 tmp = (PyObject *)va_arg(va, PyObject *);
2350 PyTuple_SET_ITEM(result, i, tmp);
2351 Py_INCREF(tmp);
2352 }
2353 }
2354 return result;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002355}
2356
2357PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002358PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 PyObject *args, *tmp;
2361 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002363 if (callable == NULL || name == NULL)
2364 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 callable = PyObject_GetAttr(callable, name);
2367 if (callable == NULL)
2368 return NULL;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 /* count the args */
2371 va_start(vargs, name);
2372 args = objargs_mktuple(vargs);
2373 va_end(vargs);
2374 if (args == NULL) {
2375 Py_DECREF(callable);
2376 return NULL;
2377 }
2378 tmp = PyObject_Call(callable, args, NULL);
2379 Py_DECREF(args);
2380 Py_DECREF(callable);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002383}
2384
2385PyObject *
Alexandre Vassalotti865eaa12013-05-02 10:44:04 -07002386_PyObject_CallMethodIdObjArgs(PyObject *callable,
Brett Cannonfd074152012-04-14 14:10:13 -04002387 struct _Py_Identifier *name, ...)
2388{
2389 PyObject *args, *tmp;
2390 va_list vargs;
2391
2392 if (callable == NULL || name == NULL)
2393 return null_error();
2394
2395 callable = _PyObject_GetAttrId(callable, name);
2396 if (callable == NULL)
2397 return NULL;
2398
2399 /* count the args */
2400 va_start(vargs, name);
2401 args = objargs_mktuple(vargs);
2402 va_end(vargs);
2403 if (args == NULL) {
2404 Py_DECREF(callable);
2405 return NULL;
2406 }
2407 tmp = PyObject_Call(callable, args, NULL);
2408 Py_DECREF(args);
2409 Py_DECREF(callable);
2410
2411 return tmp;
2412}
2413
2414PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002415PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002417 PyObject *args, *tmp;
2418 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 if (callable == NULL)
2421 return null_error();
Fred Drakeb421b8c2001-10-26 16:21:32 +00002422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 /* count the args */
2424 va_start(vargs, callable);
2425 args = objargs_mktuple(vargs);
2426 va_end(vargs);
2427 if (args == NULL)
2428 return NULL;
2429 tmp = PyObject_Call(callable, args, NULL);
2430 Py_DECREF(args);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002433}
2434
2435
Guido van Rossum823649d2001-03-21 18:40:58 +00002436/* isinstance(), issubclass() */
2437
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002438/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002439 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002440 * 1. getattr(cls, '__bases__') could raise an AttributeError
2441 * 2. getattr(cls, '__bases__') could raise some other exception
2442 * 3. getattr(cls, '__bases__') could return a tuple
2443 * 4. getattr(cls, '__bases__') could return something other than a tuple
2444 *
2445 * Only state #3 is a non-error state and only it returns a non-NULL object
2446 * (it returns the retrieved tuple).
2447 *
2448 * Any raised AttributeErrors are masked by clearing the exception and
2449 * returning NULL. If an object other than a tuple comes out of __bases__,
2450 * then again, the return value is NULL. So yes, these two situations
2451 * produce exactly the same results: NULL is returned and no error is set.
2452 *
2453 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002455 * exception to be propagated along.
2456 *
2457 * Callers are expected to test for PyErr_Occurred() when the return value
2458 * is NULL to decide whether a valid exception should be propagated or not.
2459 * When there's no exception to propagate, it's customary for the caller to
2460 * set a TypeError.
2461 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002462static PyObject *
2463abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002464{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002465 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002469 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 Py_END_ALLOW_RECURSION
2471 if (bases == NULL) {
2472 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2473 PyErr_Clear();
2474 return NULL;
2475 }
2476 if (!PyTuple_Check(bases)) {
2477 Py_DECREF(bases);
2478 return NULL;
2479 }
2480 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002481}
2482
2483
2484static int
2485abstract_issubclass(PyObject *derived, PyObject *cls)
2486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 PyObject *bases = NULL;
2488 Py_ssize_t i, n;
2489 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 while (1) {
2492 if (derived == cls)
2493 return 1;
2494 bases = abstract_get_bases(derived);
2495 if (bases == NULL) {
2496 if (PyErr_Occurred())
2497 return -1;
2498 return 0;
2499 }
2500 n = PyTuple_GET_SIZE(bases);
2501 if (n == 0) {
2502 Py_DECREF(bases);
2503 return 0;
2504 }
2505 /* Avoid recursivity in the single inheritance case */
2506 if (n == 1) {
2507 derived = PyTuple_GET_ITEM(bases, 0);
2508 Py_DECREF(bases);
2509 continue;
2510 }
2511 for (i = 0; i < n; i++) {
2512 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2513 if (r != 0)
2514 break;
2515 }
2516 Py_DECREF(bases);
2517 return r;
2518 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002519}
2520
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002521static int
2522check_class(PyObject *cls, const char *error)
2523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 PyObject *bases = abstract_get_bases(cls);
2525 if (bases == NULL) {
2526 /* Do not mask errors. */
2527 if (!PyErr_Occurred())
2528 PyErr_SetString(PyExc_TypeError, error);
2529 return 0;
2530 }
2531 Py_DECREF(bases);
2532 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002533}
2534
Brett Cannon4f653312004-03-20 22:52:14 +00002535static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002536recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002540 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (PyType_Check(cls)) {
2543 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2544 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002545 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002547 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002548 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002549 else
R. David Murray6bb99892010-11-20 16:33:30 +00002550 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 }
2552 else {
2553 if (c != (PyObject *)(inst->ob_type) &&
2554 PyType_Check(c))
2555 retval = PyType_IsSubtype(
2556 (PyTypeObject *)c,
2557 (PyTypeObject *)cls);
2558 Py_DECREF(c);
2559 }
2560 }
2561 }
2562 else {
2563 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002564 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002566 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002568 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002569 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002570 else
R. David Murray6bb99892010-11-20 16:33:30 +00002571 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 }
2573 else {
2574 retval = abstract_issubclass(icls, cls);
2575 Py_DECREF(icls);
2576 }
2577 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002580}
2581
2582int
Brett Cannon4f653312004-03-20 22:52:14 +00002583PyObject_IsInstance(PyObject *inst, PyObject *cls)
2584{
Benjamin Petersonce798522012-01-22 11:24:29 -05002585 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 /* Quick test for an exact match */
2589 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2590 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002591
Georg Brandl72b8a802014-10-03 09:26:37 +02002592 /* We know what type's __instancecheck__ does. */
2593 if (PyType_CheckExact(cls)) {
2594 return recursive_isinstance(inst, cls);
2595 }
2596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 if (PyTuple_Check(cls)) {
2598 Py_ssize_t i;
2599 Py_ssize_t n;
2600 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2603 return -1;
2604 n = PyTuple_GET_SIZE(cls);
2605 for (i = 0; i < n; ++i) {
2606 PyObject *item = PyTuple_GET_ITEM(cls, i);
2607 r = PyObject_IsInstance(inst, item);
2608 if (r != 0)
2609 /* either found it, or got an error */
2610 break;
2611 }
2612 Py_LeaveRecursiveCall();
2613 return r;
2614 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002615
Benjamin Petersonce798522012-01-22 11:24:29 -05002616 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 if (checker != NULL) {
2618 PyObject *res;
2619 int ok = -1;
2620 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2621 Py_DECREF(checker);
2622 return ok;
2623 }
2624 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2625 Py_LeaveRecursiveCall();
2626 Py_DECREF(checker);
2627 if (res != NULL) {
2628 ok = PyObject_IsTrue(res);
2629 Py_DECREF(res);
2630 }
2631 return ok;
2632 }
2633 else if (PyErr_Occurred())
2634 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002635 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002637}
2638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002640recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 if (PyType_Check(cls) && PyType_Check(derived)) {
2643 /* Fast path (non-recursive) */
2644 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2645 }
2646 if (!check_class(derived,
2647 "issubclass() arg 1 must be a class"))
2648 return -1;
2649 if (!check_class(cls,
2650 "issubclass() arg 2 must be a class"
2651 " or tuple of classes"))
2652 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002655}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002656
Brett Cannon4f653312004-03-20 22:52:14 +00002657int
2658PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2659{
Benjamin Petersonce798522012-01-22 11:24:29 -05002660 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002662
Georg Brandl72b8a802014-10-03 09:26:37 +02002663 /* We know what type's __subclasscheck__ does. */
2664 if (PyType_CheckExact(cls)) {
2665 /* Quick test for an exact match */
2666 if (derived == cls)
2667 return 1;
2668 return recursive_issubclass(derived, cls);
2669 }
2670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 if (PyTuple_Check(cls)) {
2672 Py_ssize_t i;
2673 Py_ssize_t n;
2674 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2677 return -1;
2678 n = PyTuple_GET_SIZE(cls);
2679 for (i = 0; i < n; ++i) {
2680 PyObject *item = PyTuple_GET_ITEM(cls, i);
2681 r = PyObject_IsSubclass(derived, item);
2682 if (r != 0)
2683 /* either found it, or got an error */
2684 break;
2685 }
2686 Py_LeaveRecursiveCall();
2687 return r;
2688 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002689
Benjamin Petersonce798522012-01-22 11:24:29 -05002690 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 if (checker != NULL) {
2692 PyObject *res;
2693 int ok = -1;
2694 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2695 Py_DECREF(checker);
2696 return ok;
2697 }
2698 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2699 Py_LeaveRecursiveCall();
2700 Py_DECREF(checker);
2701 if (res != NULL) {
2702 ok = PyObject_IsTrue(res);
2703 Py_DECREF(res);
2704 }
2705 return ok;
2706 }
2707 else if (PyErr_Occurred())
2708 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002709 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002711}
2712
2713int
2714_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002717}
2718
2719int
2720_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002723}
2724
2725
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002726PyObject *
2727PyObject_GetIter(PyObject *o)
2728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 PyTypeObject *t = o->ob_type;
2730 getiterfunc f = NULL;
2731 f = t->tp_iter;
2732 if (f == NULL) {
2733 if (PySequence_Check(o))
2734 return PySeqIter_New(o);
2735 return type_error("'%.200s' object is not iterable", o);
2736 }
2737 else {
2738 PyObject *res = (*f)(o);
2739 if (res != NULL && !PyIter_Check(res)) {
2740 PyErr_Format(PyExc_TypeError,
2741 "iter() returned non-iterator "
2742 "of type '%.100s'",
2743 res->ob_type->tp_name);
2744 Py_DECREF(res);
2745 res = NULL;
2746 }
2747 return res;
2748 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002749}
2750
Tim Petersf4848da2001-05-05 00:14:56 +00002751/* Return next item.
2752 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2753 * If the iteration terminates normally, return NULL and clear the
2754 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2755 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002757 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002758PyObject *
2759PyIter_Next(PyObject *iter)
2760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002761 PyObject *result;
2762 result = (*iter->ob_type->tp_iternext)(iter);
2763 if (result == NULL &&
2764 PyErr_Occurred() &&
2765 PyErr_ExceptionMatches(PyExc_StopIteration))
2766 PyErr_Clear();
2767 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002768}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002769
2770
2771/*
2772 * Flatten a sequence of bytes() objects into a C array of
2773 * NULL terminated string pointers with a NULL char* terminating the array.
2774 * (ie: an argv or env list)
2775 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002776 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2777 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002778 */
2779char *const *
2780_PySequence_BytesToCharpArray(PyObject* self)
2781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 char **array;
2783 Py_ssize_t i, argc;
2784 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002785 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 argc = PySequence_Size(self);
2788 if (argc == -1)
2789 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002790
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002791 assert(argc >= 0);
2792
2793 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2794 PyErr_NoMemory();
2795 return NULL;
2796 }
2797
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002798 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 if (array == NULL) {
2800 PyErr_NoMemory();
2801 return NULL;
2802 }
2803 for (i = 0; i < argc; ++i) {
2804 char *data;
2805 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002806 if (item == NULL) {
2807 /* NULL terminate before freeing. */
2808 array[i] = NULL;
2809 goto fail;
2810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 data = PyBytes_AsString(item);
2812 if (data == NULL) {
2813 /* NULL terminate before freeing. */
2814 array[i] = NULL;
2815 goto fail;
2816 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002817 size = PyBytes_GET_SIZE(item) + 1;
2818 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 if (!array[i]) {
2820 PyErr_NoMemory();
2821 goto fail;
2822 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002823 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002824 Py_DECREF(item);
2825 }
2826 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002829
2830fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 Py_XDECREF(item);
2832 _Py_FreeCharPArray(array);
2833 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002834}
2835
2836
2837/* Free's a NULL terminated char** array of C strings. */
2838void
2839_Py_FreeCharPArray(char *const array[])
2840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 Py_ssize_t i;
2842 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002843 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002845 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002846}