blob: 3cb7a32b01ee5a13b61e70d182bac415583e17b5 [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"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06004#include "internal/pystate.h"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00005#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00006#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00007#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00008
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00009
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000010
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000011/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000012
13static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000014type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000016 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
17 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000018}
19
Guido van Rossum052b7e11996-11-11 15:08:19 +000020static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000021null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000023 if (!PyErr_Occurred())
24 PyErr_SetString(PyExc_SystemError,
25 "null argument to internal routine");
26 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000027}
28
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000029/* Operations on any object */
30
Guido van Rossume15dee51995-07-18 14:12:02 +000031PyObject *
Fred Drake79912472000-07-09 04:06:11 +000032PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000034 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000035
Victor Stinner71aea8e2016-08-19 16:59:55 +020036 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020038 }
39
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 v = (PyObject *)o->ob_type;
41 Py_INCREF(v);
42 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000043}
44
Martin v. Löwis18e16552006-02-15 17:27:45 +000045Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000046PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000047{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 if (o == NULL) {
51 null_error();
52 return -1;
53 }
Guido van Rossume15dee51995-07-18 14:12:02 +000054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 m = o->ob_type->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +030056 if (m && m->sq_length) {
57 Py_ssize_t len = m->sq_length(o);
58 assert(len >= 0 || PyErr_Occurred());
59 return len;
60 }
Guido van Rossume15dee51995-07-18 14:12:02 +000061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000063}
64
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000065#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000066Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000067PyObject_Length(PyObject *o)
68{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000070}
71#define PyObject_Length PyObject_Size
72
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020073int
74_PyObject_HasLen(PyObject *o) {
75 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
76 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
77}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000078
Christian Heimes255f53b2007-12-08 15:33:56 +000079/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020080 or o.__length_hint__(). If those methods aren't found the defaultvalue is
81 returned. If one of the calls fails with an exception other than TypeError
82 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000083*/
84
85Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020086PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000087{
Christian Heimesb70e8a12012-10-06 17:16:39 +020088 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020089 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050090 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030091 if (_PyObject_HasLen(o)) {
92 res = PyObject_Length(o);
Serhiy Storchaka813f9432017-04-16 09:21:44 +030093 if (res < 0) {
94 assert(PyErr_Occurred());
Serhiy Storchakaf740d462013-10-24 23:19:51 +030095 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
96 return -1;
97 }
98 PyErr_Clear();
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020099 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300100 else {
101 return res;
102 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 }
Christian Heimes6314d162012-10-06 17:13:29 +0200104 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200105 if (hint == NULL) {
106 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 return defaultvalue;
110 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100111 result = _PyObject_CallNoArg(hint);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200112 Py_DECREF(hint);
113 if (result == NULL) {
114 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
115 PyErr_Clear();
116 return defaultvalue;
117 }
118 return -1;
119 }
120 else if (result == Py_NotImplemented) {
121 Py_DECREF(result);
122 return defaultvalue;
123 }
124 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200125 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200126 Py_TYPE(result)->tp_name);
127 Py_DECREF(result);
128 return -1;
129 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200130 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200131 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200132 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200133 return -1;
134 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200135 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200136 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
137 return -1;
138 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200139 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000140}
141
Guido van Rossume15dee51995-07-18 14:12:02 +0000142PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000143PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000146
Victor Stinner71aea8e2016-08-19 16:59:55 +0200147 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200149 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 m = o->ob_type->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100152 if (m && m->mp_subscript) {
153 PyObject *item = m->mp_subscript(o, key);
154 assert((item != NULL) ^ (PyErr_Occurred() != NULL));
155 return item;
156 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 if (o->ob_type->tp_as_sequence) {
159 if (PyIndex_Check(key)) {
160 Py_ssize_t key_value;
161 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
162 if (key_value == -1 && PyErr_Occurred())
163 return NULL;
164 return PySequence_GetItem(o, key_value);
165 }
166 else if (o->ob_type->tp_as_sequence->sq_item)
167 return type_error("sequence index must "
168 "be integer, not '%.200s'", key);
169 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000172}
173
174int
Fred Drake79912472000-07-09 04:06:11 +0000175PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 if (o == NULL || key == NULL || value == NULL) {
180 null_error();
181 return -1;
182 }
183 m = o->ob_type->tp_as_mapping;
184 if (m && m->mp_ass_subscript)
185 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 if (o->ob_type->tp_as_sequence) {
188 if (PyIndex_Check(key)) {
189 Py_ssize_t key_value;
190 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
191 if (key_value == -1 && PyErr_Occurred())
192 return -1;
193 return PySequence_SetItem(o, key_value, value);
194 }
195 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
196 type_error("sequence index must be "
197 "integer, not '%.200s'", key);
198 return -1;
199 }
200 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 type_error("'%.200s' object does not support item assignment", o);
203 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000204}
205
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000206int
Fred Drake79912472000-07-09 04:06:11 +0000207PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000211 if (o == NULL || key == NULL) {
212 null_error();
213 return -1;
214 }
215 m = o->ob_type->tp_as_mapping;
216 if (m && m->mp_ass_subscript)
217 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 if (o->ob_type->tp_as_sequence) {
220 if (PyIndex_Check(key)) {
221 Py_ssize_t key_value;
222 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
223 if (key_value == -1 && PyErr_Occurred())
224 return -1;
225 return PySequence_DelItem(o, key_value);
226 }
227 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
228 type_error("sequence index must be "
229 "integer, not '%.200s'", key);
230 return -1;
231 }
232 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 type_error("'%.200s' object does not support item deletion", o);
235 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000236}
237
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000238int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300239PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 PyObject *okey;
242 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (o == NULL || key == NULL) {
245 null_error();
246 return -1;
247 }
248 okey = PyUnicode_FromString(key);
249 if (okey == NULL)
250 return -1;
251 ret = PyObject_DelItem(o, okey);
252 Py_DECREF(okey);
253 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000254}
255
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000256/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000257 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000258 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000259int
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260PyObject_CheckReadBuffer(PyObject *obj)
261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
263 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 if (pb == NULL ||
266 pb->bf_getbuffer == NULL)
267 return 0;
268 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
269 PyErr_Clear();
270 return 0;
271 }
272 PyBuffer_Release(&view);
273 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000274}
275
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200276static int
277as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000279 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
282 null_error();
283 return -1;
284 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200285 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 *buffer = view.buf;
289 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200290 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000292}
293
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200294int
295PyObject_AsCharBuffer(PyObject *obj,
296 const char **buffer,
297 Py_ssize_t *buffer_len)
298{
299 return as_read_buffer(obj, (const void **)buffer, buffer_len);
300}
301
302int PyObject_AsReadBuffer(PyObject *obj,
303 const void **buffer,
304 Py_ssize_t *buffer_len)
305{
306 return as_read_buffer(obj, buffer, buffer_len);
307}
308
Guido van Rossum4c08d552000-03-10 22:55:18 +0000309int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 void **buffer,
311 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 PyBufferProcs *pb;
314 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
317 null_error();
318 return -1;
319 }
320 pb = obj->ob_type->tp_as_buffer;
321 if (pb == NULL ||
322 pb->bf_getbuffer == NULL ||
323 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
324 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400325 "expected a writable bytes-like object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 return -1;
327 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 *buffer = view.buf;
330 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200331 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000333}
334
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000335/* Buffer C-API for Python 3.0 */
336
337int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000338PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000339{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200340 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
341
342 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400344 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 Py_TYPE(obj)->tp_name);
346 return -1;
347 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200348 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000349}
350
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000351static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100352_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_ssize_t sd, dim;
355 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000356
Stefan Krah363af442015-02-01 14:53:54 +0100357 /* 1) len = product(shape) * itemsize
358 2) itemsize > 0
359 3) len = 0 <==> exists i: shape[i] = 0 */
360 if (view->len == 0) return 1;
361 if (view->strides == NULL) { /* C-contiguous by definition */
362 /* Trivially F-contiguous */
363 if (view->ndim <= 1) return 1;
364
365 /* ndim > 1 implies shape != NULL */
366 assert(view->shape != NULL);
367
368 /* Effectively 1-d */
369 sd = 0;
370 for (i=0; i<view->ndim; i++) {
371 if (view->shape[i] > 1) sd += 1;
372 }
373 return sd <= 1;
374 }
375
376 /* strides != NULL implies both of these */
377 assert(view->ndim > 0);
378 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 for (i=0; i<view->ndim; i++) {
382 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100383 if (dim > 1 && view->strides[i] != sd) {
384 return 0;
385 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 sd *= dim;
387 }
388 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000389}
390
391static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100392_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 Py_ssize_t sd, dim;
395 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000396
Stefan Krah363af442015-02-01 14:53:54 +0100397 /* 1) len = product(shape) * itemsize
398 2) itemsize > 0
399 3) len = 0 <==> exists i: shape[i] = 0 */
400 if (view->len == 0) return 1;
401 if (view->strides == NULL) return 1; /* C-contiguous by definition */
402
403 /* strides != NULL implies both of these */
404 assert(view->ndim > 0);
405 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 for (i=view->ndim-1; i>=0; i--) {
409 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100410 if (dim > 1 && view->strides[i] != sd) {
411 return 0;
412 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 sd *= dim;
414 }
415 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000416}
417
418int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100419PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000420{
421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000423
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100424 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100426 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100428 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return (_IsCContiguous(view) || _IsFortranContiguous(view));
430 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431}
432
433
Guido van Rossum98297ee2007-11-06 21:34:58 +0000434void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000435PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 char* pointer;
438 int i;
439 pointer = (char *)view->buf;
440 for (i = 0; i < view->ndim; i++) {
441 pointer += view->strides[i]*indices[i];
442 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
443 pointer = *((char**)pointer) + view->suboffsets[i];
444 }
445 }
446 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000447}
448
449
Guido van Rossum98297ee2007-11-06 21:34:58 +0000450void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000451_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 +0000452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 for (k=0; k<nd; k++) {
456 if (index[k] < shape[k]-1) {
457 index[k]++;
458 break;
459 }
460 else {
461 index[k] = 0;
462 }
463 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000464}
465
Guido van Rossum98297ee2007-11-06 21:34:58 +0000466void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000467_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 +0000468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 for (k=nd-1; k>=0; k--) {
472 if (index[k] < shape[k]-1) {
473 index[k]++;
474 break;
475 }
476 else {
477 index[k] = 0;
478 }
479 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000480}
481
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000482int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000483PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000486 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 Py_ssize_t *indices, elements;
488 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 if (len > view->len) {
491 len = view->len;
492 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 if (PyBuffer_IsContiguous(view, fort)) {
495 /* simplest copy is all that is needed */
496 memcpy(view->buf, buf, len);
497 return 0;
498 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000501
Stefan Krah7213fcc2015-02-01 16:19:23 +0100502 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
504 if (indices == NULL) {
505 PyErr_NoMemory();
506 return -1;
507 }
508 for (k=0; k<view->ndim;k++) {
509 indices[k] = 0;
510 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000513 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 }
515 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000516 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
518 src = buf;
519 /* XXX : This is not going to be the fastest code in the world
520 several optimizations are possible.
521 */
522 elements = len / view->itemsize;
523 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 ptr = PyBuffer_GetPointer(view, indices);
525 memcpy(ptr, src, view->itemsize);
526 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100527 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyMem_Free(indices);
531 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000532}
533
Guido van Rossum98297ee2007-11-06 21:34:58 +0000534int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 Py_buffer view_dest, view_src;
537 int k;
538 Py_ssize_t *indices, elements;
539 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 if (!PyObject_CheckBuffer(dest) ||
542 !PyObject_CheckBuffer(src)) {
543 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400544 "both destination and source must be "\
545 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 return -1;
547 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
550 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
551 PyBuffer_Release(&view_dest);
552 return -1;
553 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 if (view_dest.len < view_src.len) {
556 PyErr_SetString(PyExc_BufferError,
557 "destination is too small to receive data from source");
558 PyBuffer_Release(&view_dest);
559 PyBuffer_Release(&view_src);
560 return -1;
561 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
564 PyBuffer_IsContiguous(&view_src, 'C')) ||
565 (PyBuffer_IsContiguous(&view_dest, 'F') &&
566 PyBuffer_IsContiguous(&view_src, 'F'))) {
567 /* simplest copy is all that is needed */
568 memcpy(view_dest.buf, view_src.buf, view_src.len);
569 PyBuffer_Release(&view_dest);
570 PyBuffer_Release(&view_src);
571 return 0;
572 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 /* XXX(nnorwitz): need to check for overflow! */
577 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
578 if (indices == NULL) {
579 PyErr_NoMemory();
580 PyBuffer_Release(&view_dest);
581 PyBuffer_Release(&view_src);
582 return -1;
583 }
584 for (k=0; k<view_src.ndim;k++) {
585 indices[k] = 0;
586 }
587 elements = 1;
588 for (k=0; k<view_src.ndim; k++) {
589 /* XXX(nnorwitz): can this overflow? */
590 elements *= view_src.shape[k];
591 }
592 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000593 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 dptr = PyBuffer_GetPointer(&view_dest, indices);
595 sptr = PyBuffer_GetPointer(&view_src, indices);
596 memcpy(dptr, sptr, view_src.itemsize);
597 }
598 PyMem_Free(indices);
599 PyBuffer_Release(&view_dest);
600 PyBuffer_Release(&view_src);
601 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000602}
603
604void
605PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 Py_ssize_t *strides, int itemsize,
607 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 int k;
610 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 sd = itemsize;
613 if (fort == 'F') {
614 for (k=0; k<nd; k++) {
615 strides[k] = sd;
616 sd *= shape[k];
617 }
618 }
619 else {
620 for (k=nd-1; k>=0; k--) {
621 strides[k] = sd;
622 sd *= shape[k];
623 }
624 }
625 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000626}
627
628int
Martin v. Löwis423be952008-08-13 15:53:07 +0000629PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100630 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000631{
Stefan Krah5178d912015-02-03 16:57:21 +0100632 if (view == NULL) {
633 PyErr_SetString(PyExc_BufferError,
634 "PyBuffer_FillInfo: view==NULL argument is obsolete");
635 return -1;
636 }
637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
639 (readonly == 1)) {
640 PyErr_SetString(PyExc_BufferError,
641 "Object is not writable.");
642 return -1;
643 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 view->obj = obj;
646 if (obj)
647 Py_INCREF(obj);
648 view->buf = buf;
649 view->len = len;
650 view->readonly = readonly;
651 view->itemsize = 1;
652 view->format = NULL;
653 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
654 view->format = "B";
655 view->ndim = 1;
656 view->shape = NULL;
657 if ((flags & PyBUF_ND) == PyBUF_ND)
658 view->shape = &(view->len);
659 view->strides = NULL;
660 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
661 view->strides = &(view->itemsize);
662 view->suboffsets = NULL;
663 view->internal = NULL;
664 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000665}
666
Martin v. Löwis423be952008-08-13 15:53:07 +0000667void
668PyBuffer_Release(Py_buffer *view)
669{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000670 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200671 PyBufferProcs *pb;
672 if (obj == NULL)
673 return;
674 pb = Py_TYPE(obj)->tp_as_buffer;
675 if (pb && pb->bf_releasebuffer)
676 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200678 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000679}
680
Eric Smith8fd3eba2008-02-17 19:48:00 +0000681PyObject *
682PyObject_Format(PyObject *obj, PyObject *format_spec)
683{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000684 PyObject *meth;
685 PyObject *empty = NULL;
686 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500687 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000688
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300689 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
690 PyErr_Format(PyExc_SystemError,
691 "Format specifier must be a string, not %.200s",
692 Py_TYPE(format_spec)->tp_name);
693 return NULL;
694 }
695
696 /* Fast path for common types. */
697 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
698 if (PyUnicode_CheckExact(obj)) {
699 Py_INCREF(obj);
700 return obj;
701 }
702 if (PyLong_CheckExact(obj)) {
703 return PyObject_Str(obj);
704 }
705 }
706
Eric Smith8fd3eba2008-02-17 19:48:00 +0000707 /* If no format_spec is provided, use an empty string */
708 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100709 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000710 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000711 }
712
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300713 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500714 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000715 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000716 if (!PyErr_Occurred())
717 PyErr_Format(PyExc_TypeError,
718 "Type %.100s doesn't define __format__",
719 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000721 }
722
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000723 /* And call it. */
Victor Stinnerde4ae3d2016-12-04 22:59:09 +0100724 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000725 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000726
727 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800728 PyErr_Format(PyExc_TypeError,
729 "__format__ must return a str, not %.200s",
730 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000731 Py_DECREF(result);
732 result = NULL;
733 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000734 }
735
736done:
737 Py_XDECREF(empty);
738 return result;
739}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000740/* Operations on numbers */
741
742int
Fred Drake79912472000-07-09 04:06:11 +0000743PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 return o && o->ob_type->tp_as_number &&
746 (o->ob_type->tp_as_number->nb_int ||
747 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000748}
749
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000750/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000751
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000752#define NB_SLOT(x) offsetof(PyNumberMethods, x)
753#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000755#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757
758/*
759 Calling scheme used for binary operations:
760
Neal Norwitz4886cc32006-08-21 17:06:07 +0000761 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000764 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
765 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766 */
767
768static PyObject *
769binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 PyObject *x;
772 binaryfunc slotv = NULL;
773 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 if (v->ob_type->tp_as_number != NULL)
776 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
777 if (w->ob_type != v->ob_type &&
778 w->ob_type->tp_as_number != NULL) {
779 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
780 if (slotw == slotv)
781 slotw = NULL;
782 }
783 if (slotv) {
784 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
785 x = slotw(v, w);
786 if (x != Py_NotImplemented)
787 return x;
788 Py_DECREF(x); /* can't do it */
789 slotw = NULL;
790 }
791 x = slotv(v, w);
792 if (x != Py_NotImplemented)
793 return x;
794 Py_DECREF(x); /* can't do it */
795 }
796 if (slotw) {
797 x = slotw(v, w);
798 if (x != Py_NotImplemented)
799 return x;
800 Py_DECREF(x); /* can't do it */
801 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500802 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000803}
Guido van Rossum77660912002-04-16 16:32:50 +0000804
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000805static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000806binop_type_error(PyObject *v, PyObject *w, const char *op_name)
807{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 PyErr_Format(PyExc_TypeError,
809 "unsupported operand type(s) for %.100s: "
810 "'%.100s' and '%.100s'",
811 op_name,
812 v->ob_type->tp_name,
813 w->ob_type->tp_name);
814 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000815}
816
817static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000818binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 PyObject *result = binary_op1(v, w, op_slot);
821 if (result == Py_NotImplemented) {
822 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530823
824 if (op_slot == NB_SLOT(nb_rshift) &&
825 PyCFunction_Check(v) &&
826 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
827 {
828 PyErr_Format(PyExc_TypeError,
829 "unsupported operand type(s) for %.100s: "
830 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530831 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530832 op_name,
833 v->ob_type->tp_name,
834 w->ob_type->tp_name);
835 return NULL;
836 }
837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 return binop_type_error(v, w, op_name);
839 }
840 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000841}
842
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000843
844/*
845 Calling scheme used for ternary operations:
846
Neal Norwitz4886cc32006-08-21 17:06:07 +0000847 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000849 */
850
851static PyObject *
852ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 PyObject *w,
854 PyObject *z,
855 const int op_slot,
856 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 PyNumberMethods *mv, *mw, *mz;
859 PyObject *x = NULL;
860 ternaryfunc slotv = NULL;
861 ternaryfunc slotw = NULL;
862 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 mv = v->ob_type->tp_as_number;
865 mw = w->ob_type->tp_as_number;
866 if (mv != NULL)
867 slotv = NB_TERNOP(mv, op_slot);
868 if (w->ob_type != v->ob_type &&
869 mw != NULL) {
870 slotw = NB_TERNOP(mw, op_slot);
871 if (slotw == slotv)
872 slotw = NULL;
873 }
874 if (slotv) {
875 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
876 x = slotw(v, w, z);
877 if (x != Py_NotImplemented)
878 return x;
879 Py_DECREF(x); /* can't do it */
880 slotw = NULL;
881 }
882 x = slotv(v, w, z);
883 if (x != Py_NotImplemented)
884 return x;
885 Py_DECREF(x); /* can't do it */
886 }
887 if (slotw) {
888 x = slotw(v, w, z);
889 if (x != Py_NotImplemented)
890 return x;
891 Py_DECREF(x); /* can't do it */
892 }
893 mz = z->ob_type->tp_as_number;
894 if (mz != NULL) {
895 slotz = NB_TERNOP(mz, op_slot);
896 if (slotz == slotv || slotz == slotw)
897 slotz = NULL;
898 if (slotz) {
899 x = slotz(v, w, z);
900 if (x != Py_NotImplemented)
901 return x;
902 Py_DECREF(x); /* can't do it */
903 }
904 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 if (z == Py_None)
907 PyErr_Format(
908 PyExc_TypeError,
909 "unsupported operand type(s) for ** or pow(): "
910 "'%.100s' and '%.100s'",
911 v->ob_type->tp_name,
912 w->ob_type->tp_name);
913 else
914 PyErr_Format(
915 PyExc_TypeError,
916 "unsupported operand type(s) for pow(): "
917 "'%.100s', '%.100s', '%.100s'",
918 v->ob_type->tp_name,
919 w->ob_type->tp_name,
920 z->ob_type->tp_name);
921 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000922}
923
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000924#define BINARY_FUNC(func, op, op_name) \
925 PyObject * \
926 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000928 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000929
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000930BINARY_FUNC(PyNumber_Or, nb_or, "|")
931BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
932BINARY_FUNC(PyNumber_And, nb_and, "&")
933BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
934BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
935BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000936BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000937
938PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000939PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
942 if (result == Py_NotImplemented) {
943 PySequenceMethods *m = v->ob_type->tp_as_sequence;
944 Py_DECREF(result);
945 if (m && m->sq_concat) {
946 return (*m->sq_concat)(v, w);
947 }
948 result = binop_type_error(v, w, "+");
949 }
950 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000951}
952
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000953static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000954sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 Py_ssize_t count;
957 if (PyIndex_Check(n)) {
958 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
959 if (count == -1 && PyErr_Occurred())
960 return NULL;
961 }
962 else {
963 return type_error("can't multiply sequence by "
964 "non-int of type '%.200s'", n);
965 }
966 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000967}
968
969PyObject *
970PyNumber_Multiply(PyObject *v, PyObject *w)
971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
973 if (result == Py_NotImplemented) {
974 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
975 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
976 Py_DECREF(result);
977 if (mv && mv->sq_repeat) {
978 return sequence_repeat(mv->sq_repeat, v, w);
979 }
980 else if (mw && mw->sq_repeat) {
981 return sequence_repeat(mw->sq_repeat, w, v);
982 }
983 result = binop_type_error(v, w, "*");
984 }
985 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000986}
987
Guido van Rossume15dee51995-07-18 14:12:02 +0000988PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -0400989PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
990{
991 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
992}
993
994PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000995PyNumber_FloorDivide(PyObject *v, PyObject *w)
996{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +0000998}
999
1000PyObject *
1001PyNumber_TrueDivide(PyObject *v, PyObject *w)
1002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001004}
1005
1006PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001007PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001010}
1011
1012PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001013PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001016}
1017
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001018/* Binary in-place operators */
1019
1020/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001021 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001022
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001023 - If the left hand object has the appropriate struct members, and
1024 they are filled, call the appropriate function and return the
1025 result. No coercion is done on the arguments; the left-hand object
1026 is the one the operation is performed on, and it's up to the
1027 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001028
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001029 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001030 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001031
1032 */
1033
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001034static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001035binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 PyNumberMethods *mv = v->ob_type->tp_as_number;
1038 if (mv != NULL) {
1039 binaryfunc slot = NB_BINOP(mv, iop_slot);
1040 if (slot) {
1041 PyObject *x = (slot)(v, w);
1042 if (x != Py_NotImplemented) {
1043 return x;
1044 }
1045 Py_DECREF(x);
1046 }
1047 }
1048 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001049}
1050
1051static PyObject *
1052binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1056 if (result == Py_NotImplemented) {
1057 Py_DECREF(result);
1058 return binop_type_error(v, w, op_name);
1059 }
1060 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001061}
1062
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001063#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 PyObject * \
1065 func(PyObject *v, PyObject *w) { \
1066 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1067 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001068
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001069INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1070INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1071INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1072INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1073INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1074INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001075INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001076
1077PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001078PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1081 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001082}
1083
1084PyObject *
1085PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1088 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001089}
1090
1091PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001092PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1095 NB_SLOT(nb_add));
1096 if (result == Py_NotImplemented) {
1097 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1098 Py_DECREF(result);
1099 if (m != NULL) {
1100 binaryfunc f = NULL;
1101 f = m->sq_inplace_concat;
1102 if (f == NULL)
1103 f = m->sq_concat;
1104 if (f != NULL)
1105 return (*f)(v, w);
1106 }
1107 result = binop_type_error(v, w, "+=");
1108 }
1109 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001110}
1111
1112PyObject *
1113PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1116 NB_SLOT(nb_multiply));
1117 if (result == Py_NotImplemented) {
1118 ssizeargfunc f = NULL;
1119 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1120 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1121 Py_DECREF(result);
1122 if (mv != NULL) {
1123 f = mv->sq_inplace_repeat;
1124 if (f == NULL)
1125 f = mv->sq_repeat;
1126 if (f != NULL)
1127 return sequence_repeat(f, v, w);
1128 }
1129 else if (mw != NULL) {
1130 /* Note that the right hand operand should not be
1131 * mutated in this case so sq_inplace_repeat is not
1132 * used. */
1133 if (mw->sq_repeat)
1134 return sequence_repeat(mw->sq_repeat, w, v);
1135 }
1136 result = binop_type_error(v, w, "*=");
1137 }
1138 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001139}
1140
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001141PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001142PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1143{
1144 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1145 NB_SLOT(nb_matrix_multiply), "@=");
1146}
1147
1148PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001149PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1152 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001153}
1154
1155PyObject *
1156PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (v->ob_type->tp_as_number &&
1159 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1160 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1161 }
1162 else {
1163 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1164 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001165}
1166
1167
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001168/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001169
1170PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001171PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174
Victor Stinner71aea8e2016-08-19 16:59:55 +02001175 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001177 }
1178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 m = o->ob_type->tp_as_number;
1180 if (m && m->nb_negative)
1181 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001184}
1185
1186PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001187PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190
Victor Stinner71aea8e2016-08-19 16:59:55 +02001191 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001193 }
1194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 m = o->ob_type->tp_as_number;
1196 if (m && m->nb_positive)
1197 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001200}
1201
1202PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001203PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001206
Victor Stinner71aea8e2016-08-19 16:59:55 +02001207 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001209 }
1210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 m = o->ob_type->tp_as_number;
1212 if (m && m->nb_invert)
1213 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001216}
1217
1218PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001219PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001222
Victor Stinner71aea8e2016-08-19 16:59:55 +02001223 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001225 }
1226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 m = o->ob_type->tp_as_number;
1228 if (m && m->nb_absolute)
1229 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001232}
1233
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001234/* Return a Python int from the object item.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001235 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001236 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001237*/
1238PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001239PyNumber_Index(PyObject *item)
1240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 PyObject *result = NULL;
Victor Stinner71aea8e2016-08-19 16:59:55 +02001242 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001244 }
1245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 if (PyLong_Check(item)) {
1247 Py_INCREF(item);
1248 return item;
1249 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001250 if (!PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 PyErr_Format(PyExc_TypeError,
1252 "'%.200s' object cannot be interpreted "
1253 "as an integer", item->ob_type->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001254 return NULL;
1255 }
1256 result = item->ob_type->tp_as_number->nb_index(item);
1257 if (!result || PyLong_CheckExact(result))
1258 return result;
1259 if (!PyLong_Check(result)) {
1260 PyErr_Format(PyExc_TypeError,
1261 "__index__ returned non-int (type %.200s)",
1262 result->ob_type->tp_name);
1263 Py_DECREF(result);
1264 return NULL;
1265 }
1266 /* Issue #17576: warn if 'result' not of exact type int. */
1267 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1268 "__index__ returned non-int (type %.200s). "
1269 "The ability to return an instance of a strict subclass of int "
1270 "is deprecated, and may be removed in a future version of Python.",
1271 result->ob_type->tp_name)) {
1272 Py_DECREF(result);
1273 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 }
1275 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001276}
1277
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001278/* Return an error on Overflow only if err is not NULL*/
1279
1280Py_ssize_t
1281PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 Py_ssize_t result;
1284 PyObject *runerr;
1285 PyObject *value = PyNumber_Index(item);
1286 if (value == NULL)
1287 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 /* We're done if PyLong_AsSsize_t() returns without error. */
1290 result = PyLong_AsSsize_t(value);
1291 if (result != -1 || !(runerr = PyErr_Occurred()))
1292 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 /* Error handling code -- only manage OverflowError differently */
1295 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1296 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 PyErr_Clear();
1299 /* If no error-handling desired then the default clipping
1300 is sufficient.
1301 */
1302 if (!err) {
1303 assert(PyLong_Check(value));
1304 /* Whether or not it is less than or equal to
1305 zero is determined by the sign of ob_size
1306 */
1307 if (_PyLong_Sign(value) < 0)
1308 result = PY_SSIZE_T_MIN;
1309 else
1310 result = PY_SSIZE_T_MAX;
1311 }
1312 else {
1313 /* Otherwise replace the error with caller's error object. */
1314 PyErr_Format(err,
1315 "cannot fit '%.200s' into an index-sized integer",
1316 item->ob_type->tp_name);
1317 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001318
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001319 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 Py_DECREF(value);
1321 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001322}
1323
1324
Guido van Rossume15dee51995-07-18 14:12:02 +00001325PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001326PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001327{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001328 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001331 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001332 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001333
Victor Stinner71aea8e2016-08-19 16:59:55 +02001334 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001336 }
1337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 if (PyLong_CheckExact(o)) {
1339 Py_INCREF(o);
1340 return o;
1341 }
1342 m = o->ob_type->tp_as_number;
1343 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001344 result = (PyObject *)_PyLong_FromNbInt(o);
1345 if (result != NULL && !PyLong_CheckExact(result)) {
1346 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1347 }
1348 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001350 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001352 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001354 if (result == NULL || PyLong_CheckExact(result)) {
1355 return result;
1356 }
1357 if (PyLong_Check(result)) {
1358 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1359 return result;
1360 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001362 but int() needs to return an int. */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001363 m = result->ob_type->tp_as_number;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001364 if (m == NULL || m->nb_int == NULL) {
1365 PyErr_Format(
1366 PyExc_TypeError,
1367 "__trunc__ returned non-Integral (type %.200s)",
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001368 result->ob_type->tp_name);
1369 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001370 return NULL;
1371 }
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001372 Py_SETREF(result, (PyObject *)_PyLong_FromNbInt(result));
1373 if (result != NULL && !PyLong_CheckExact(result)) {
1374 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1375 }
1376 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001378 if (PyErr_Occurred())
1379 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001380
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001381 if (PyUnicode_Check(o))
1382 /* The below check is done in PyLong_FromUnicode(). */
1383 return PyLong_FromUnicodeObject(o, 10);
1384
Martin Pantereeb896c2015-11-07 02:32:21 +00001385 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001387 * doesn't do. In particular int('9\x005') must raise an
1388 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001390 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1391 PyBytes_GET_SIZE(o), 10);
1392
1393 if (PyByteArray_Check(o))
1394 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1395 PyByteArray_GET_SIZE(o), 10);
1396
1397 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001398 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001399
1400 /* Copy to NUL-terminated buffer. */
1401 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1402 if (bytes == NULL) {
1403 PyBuffer_Release(&view);
1404 return NULL;
1405 }
1406 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1407 PyBytes_GET_SIZE(bytes), 10);
1408 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001409 PyBuffer_Release(&view);
1410 return result;
1411 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001412
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001413 return type_error("int() argument must be a string, a bytes-like object "
1414 "or a number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001415}
1416
1417PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001418PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001421
Victor Stinner71aea8e2016-08-19 16:59:55 +02001422 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001424 }
1425
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001426 if (PyFloat_CheckExact(o)) {
1427 Py_INCREF(o);
1428 return o;
1429 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 m = o->ob_type->tp_as_number;
1431 if (m && m->nb_float) { /* This should include subclasses of float */
1432 PyObject *res = m->nb_float(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001433 double val;
1434 if (!res || PyFloat_CheckExact(res)) {
1435 return res;
1436 }
1437 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001439 "%.50s.__float__ returned non-float (type %.50s)",
1440 o->ob_type->tp_name, res->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 Py_DECREF(res);
1442 return NULL;
1443 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001444 /* Issue #26983: warn if 'res' not of exact type float. */
1445 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1446 "%.50s.__float__ returned non-float (type %.50s). "
1447 "The ability to return an instance of a strict subclass of float "
1448 "is deprecated, and may be removed in a future version of Python.",
1449 o->ob_type->tp_name, res->ob_type->tp_name)) {
1450 Py_DECREF(res);
1451 return NULL;
1452 }
1453 val = PyFloat_AS_DOUBLE(res);
1454 Py_DECREF(res);
1455 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 }
1457 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001458 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 }
1460 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001461}
1462
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001463
1464PyObject *
1465PyNumber_ToBase(PyObject *n, int base)
1466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 PyObject *res = NULL;
1468 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 if (!index)
1471 return NULL;
1472 if (PyLong_Check(index))
1473 res = _PyLong_Format(index, base);
1474 else
1475 /* It should not be possible to get here, as
1476 PyNumber_Index already has a check for the same
1477 condition */
Serhiy Storchaka95949422013-08-27 19:40:23 +03001478 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 Py_DECREF(index);
1480 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001481}
1482
1483
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001484/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001485
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001486int
Fred Drake79912472000-07-09 04:06:11 +00001487PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 if (PyDict_Check(s))
1490 return 0;
1491 return s != NULL && s->ob_type->tp_as_sequence &&
1492 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001493}
1494
Martin v. Löwis18e16552006-02-15 17:27:45 +00001495Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001496PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 if (s == NULL) {
1501 null_error();
1502 return -1;
1503 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 m = s->ob_type->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001506 if (m && m->sq_length) {
1507 Py_ssize_t len = m->sq_length(s);
1508 assert(len >= 0 || PyErr_Occurred());
1509 return len;
1510 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 type_error("object of type '%.200s' has no len()", s);
1513 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001514}
1515
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001516#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001517Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001518PySequence_Length(PyObject *s)
1519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001521}
1522#define PySequence_Length PySequence_Size
1523
Guido van Rossume15dee51995-07-18 14:12:02 +00001524PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001525PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001528
Victor Stinner71aea8e2016-08-19 16:59:55 +02001529 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001531 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 m = s->ob_type->tp_as_sequence;
1534 if (m && m->sq_concat)
1535 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 /* Instances of user classes defining an __add__() method only
1538 have an nb_add slot, not an sq_concat slot. So we fall back
1539 to nb_add if both arguments appear to be sequences. */
1540 if (PySequence_Check(s) && PySequence_Check(o)) {
1541 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1542 if (result != Py_NotImplemented)
1543 return result;
1544 Py_DECREF(result);
1545 }
1546 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001547}
1548
1549PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001550PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001553
Victor Stinner71aea8e2016-08-19 16:59:55 +02001554 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001556 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 m = o->ob_type->tp_as_sequence;
1559 if (m && m->sq_repeat)
1560 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 /* Instances of user classes defining a __mul__() method only
1563 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1564 to nb_multiply if o appears to be a sequence. */
1565 if (PySequence_Check(o)) {
1566 PyObject *n, *result;
1567 n = PyLong_FromSsize_t(count);
1568 if (n == NULL)
1569 return NULL;
1570 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1571 Py_DECREF(n);
1572 if (result != Py_NotImplemented)
1573 return result;
1574 Py_DECREF(result);
1575 }
1576 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001577}
1578
1579PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001580PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001583
Victor Stinner71aea8e2016-08-19 16:59:55 +02001584 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001586 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 m = s->ob_type->tp_as_sequence;
1589 if (m && m->sq_inplace_concat)
1590 return m->sq_inplace_concat(s, o);
1591 if (m && m->sq_concat)
1592 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 if (PySequence_Check(s) && PySequence_Check(o)) {
1595 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1596 NB_SLOT(nb_add));
1597 if (result != Py_NotImplemented)
1598 return result;
1599 Py_DECREF(result);
1600 }
1601 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001602}
1603
1604PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001605PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001608
Victor Stinner71aea8e2016-08-19 16:59:55 +02001609 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001611 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 m = o->ob_type->tp_as_sequence;
1614 if (m && m->sq_inplace_repeat)
1615 return m->sq_inplace_repeat(o, count);
1616 if (m && m->sq_repeat)
1617 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 if (PySequence_Check(o)) {
1620 PyObject *n, *result;
1621 n = PyLong_FromSsize_t(count);
1622 if (n == NULL)
1623 return NULL;
1624 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1625 NB_SLOT(nb_multiply));
1626 Py_DECREF(n);
1627 if (result != Py_NotImplemented)
1628 return result;
1629 Py_DECREF(result);
1630 }
1631 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001632}
1633
1634PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001635PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001638
Victor Stinner71aea8e2016-08-19 16:59:55 +02001639 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001641 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 m = s->ob_type->tp_as_sequence;
1644 if (m && m->sq_item) {
1645 if (i < 0) {
1646 if (m->sq_length) {
1647 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnere20310f2015-11-05 13:56:58 +01001648 if (l < 0) {
1649 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001651 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 i += l;
1653 }
1654 }
1655 return m->sq_item(s, i);
1656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001659}
1660
1661PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001662PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665
Victor Stinner71aea8e2016-08-19 16:59:55 +02001666 if (!s) {
1667 return null_error();
1668 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001671 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 PyObject *res;
1673 PyObject *slice = _PySlice_FromIndices(i1, i2);
1674 if (!slice)
1675 return NULL;
1676 res = mp->mp_subscript(s, slice);
1677 Py_DECREF(slice);
1678 return res;
1679 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001682}
1683
1684int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001685PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 if (s == NULL) {
1690 null_error();
1691 return -1;
1692 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 m = s->ob_type->tp_as_sequence;
1695 if (m && m->sq_ass_item) {
1696 if (i < 0) {
1697 if (m->sq_length) {
1698 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001699 if (l < 0) {
1700 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001702 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 i += l;
1704 }
1705 }
1706 return m->sq_ass_item(s, i, o);
1707 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 type_error("'%.200s' object does not support item assignment", s);
1710 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001711}
1712
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001713int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001714PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (s == NULL) {
1719 null_error();
1720 return -1;
1721 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 m = s->ob_type->tp_as_sequence;
1724 if (m && m->sq_ass_item) {
1725 if (i < 0) {
1726 if (m->sq_length) {
1727 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001728 if (l < 0) {
1729 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001731 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 i += l;
1733 }
1734 }
1735 return m->sq_ass_item(s, i, (PyObject *)NULL);
1736 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 type_error("'%.200s' object doesn't support item deletion", s);
1739 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001740}
1741
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001742int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001743PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 if (s == NULL) {
1748 null_error();
1749 return -1;
1750 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001753 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 int res;
1755 PyObject *slice = _PySlice_FromIndices(i1, i2);
1756 if (!slice)
1757 return -1;
1758 res = mp->mp_ass_subscript(s, slice, o);
1759 Py_DECREF(slice);
1760 return res;
1761 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 type_error("'%.200s' object doesn't support slice assignment", s);
1764 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001765}
1766
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001767int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001768PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 if (s == NULL) {
1773 null_error();
1774 return -1;
1775 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001778 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 int res;
1780 PyObject *slice = _PySlice_FromIndices(i1, i2);
1781 if (!slice)
1782 return -1;
1783 res = mp->mp_ass_subscript(s, slice, NULL);
1784 Py_DECREF(slice);
1785 return res;
1786 }
1787 type_error("'%.200s' object doesn't support slice deletion", s);
1788 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001789}
1790
Guido van Rossume15dee51995-07-18 14:12:02 +00001791PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001792PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 PyObject *it; /* iter(v) */
1795 Py_ssize_t n; /* guess for result tuple size */
1796 PyObject *result = NULL;
1797 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001798
Victor Stinner71aea8e2016-08-19 16:59:55 +02001799 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001801 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 /* Special-case the common tuple and list cases, for efficiency. */
1804 if (PyTuple_CheckExact(v)) {
1805 /* Note that we can't know whether it's safe to return
1806 a tuple *subclass* instance as-is, hence the restriction
1807 to exact tuples here. In contrast, lists always make
1808 a copy, so there's no need for exactness below. */
1809 Py_INCREF(v);
1810 return v;
1811 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001812 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 /* Get iterator. */
1816 it = PyObject_GetIter(v);
1817 if (it == NULL)
1818 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001821 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (n == -1)
1823 goto Fail;
1824 result = PyTuple_New(n);
1825 if (result == NULL)
1826 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 /* Fill the tuple. */
1829 for (j = 0; ; ++j) {
1830 PyObject *item = PyIter_Next(it);
1831 if (item == NULL) {
1832 if (PyErr_Occurred())
1833 goto Fail;
1834 break;
1835 }
1836 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00001837 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 /* The over-allocation strategy can grow a bit faster
1839 than for lists because unlike lists the
1840 over-allocation isn't permanent -- we reclaim
1841 the excess before the end of this routine.
1842 So, grow by ten and then add 25%.
1843 */
Martin Pantere8db8612016-07-25 02:30:05 +00001844 newn += 10u;
1845 newn += newn >> 2;
1846 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 /* Check for overflow */
1848 PyErr_NoMemory();
1849 Py_DECREF(item);
1850 goto Fail;
1851 }
Martin Pantere8db8612016-07-25 02:30:05 +00001852 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 if (_PyTuple_Resize(&result, n) != 0) {
1854 Py_DECREF(item);
1855 goto Fail;
1856 }
1857 }
1858 PyTuple_SET_ITEM(result, j, item);
1859 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 /* Cut tuple back if guess was too large. */
1862 if (j < n &&
1863 _PyTuple_Resize(&result, j) != 0)
1864 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 Py_DECREF(it);
1867 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001868
1869Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 Py_XDECREF(result);
1871 Py_DECREF(it);
1872 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001873}
1874
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001875PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001876PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 PyObject *result; /* result list */
1879 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001880
Victor Stinner71aea8e2016-08-19 16:59:55 +02001881 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001883 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 result = PyList_New(0);
1886 if (result == NULL)
1887 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 rv = _PyList_Extend((PyListObject *)result, v);
1890 if (rv == NULL) {
1891 Py_DECREF(result);
1892 return NULL;
1893 }
1894 Py_DECREF(rv);
1895 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001896}
1897
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001898PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001899PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001902
Victor Stinner71aea8e2016-08-19 16:59:55 +02001903 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001905 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1908 Py_INCREF(v);
1909 return v;
1910 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 it = PyObject_GetIter(v);
1913 if (it == NULL) {
1914 if (PyErr_ExceptionMatches(PyExc_TypeError))
1915 PyErr_SetString(PyExc_TypeError, m);
1916 return NULL;
1917 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 v = PySequence_List(it);
1920 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001923}
1924
Tim Peters16a77ad2001-09-08 04:00:12 +00001925/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1927 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1928 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001929 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1930*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001931Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001932_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 Py_ssize_t n;
1935 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1936 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 if (seq == NULL || obj == NULL) {
1939 null_error();
1940 return -1;
1941 }
Tim Peters75f8e352001-05-05 11:33:43 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 it = PyObject_GetIter(seq);
1944 if (it == NULL) {
1945 type_error("argument of type '%.200s' is not iterable", seq);
1946 return -1;
1947 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 n = wrapped = 0;
1950 for (;;) {
1951 int cmp;
1952 PyObject *item = PyIter_Next(it);
1953 if (item == NULL) {
1954 if (PyErr_Occurred())
1955 goto Fail;
1956 break;
1957 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1960 Py_DECREF(item);
1961 if (cmp < 0)
1962 goto Fail;
1963 if (cmp > 0) {
1964 switch (operation) {
1965 case PY_ITERSEARCH_COUNT:
1966 if (n == PY_SSIZE_T_MAX) {
1967 PyErr_SetString(PyExc_OverflowError,
1968 "count exceeds C integer size");
1969 goto Fail;
1970 }
1971 ++n;
1972 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 case PY_ITERSEARCH_INDEX:
1975 if (wrapped) {
1976 PyErr_SetString(PyExc_OverflowError,
1977 "index exceeds C integer size");
1978 goto Fail;
1979 }
1980 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 case PY_ITERSEARCH_CONTAINS:
1983 n = 1;
1984 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07001987 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 }
1989 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 if (operation == PY_ITERSEARCH_INDEX) {
1992 if (n == PY_SSIZE_T_MAX)
1993 wrapped = 1;
1994 ++n;
1995 }
1996 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 if (operation != PY_ITERSEARCH_INDEX)
1999 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 PyErr_SetString(PyExc_ValueError,
2002 "sequence.index(x): x not in sequence");
2003 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002004Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 n = -1;
2006 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002007Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 Py_DECREF(it);
2009 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002010
Guido van Rossume15dee51995-07-18 14:12:02 +00002011}
2012
Tim Peters16a77ad2001-09-08 04:00:12 +00002013/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002014Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002015PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002018}
2019
Tim Peterscb8d3682001-05-05 21:05:01 +00002020/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002021 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002022 */
2023int
2024PySequence_Contains(PyObject *seq, PyObject *ob)
2025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002026 Py_ssize_t result;
2027 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2028 if (sqm != NULL && sqm->sq_contains != NULL)
2029 return (*sqm->sq_contains)(seq, ob);
2030 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2031 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002032}
2033
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034/* Backwards compatibility */
2035#undef PySequence_In
2036int
Fred Drake79912472000-07-09 04:06:11 +00002037PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002040}
2041
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002042Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002043PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002044{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002046}
2047
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002048/* Operations on mappings */
2049
2050int
Fred Drake79912472000-07-09 04:06:11 +00002051PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002052{
Benjamin Peterson21992272011-12-28 12:01:31 -06002053 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002055}
2056
Martin v. Löwis18e16552006-02-15 17:27:45 +00002057Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002058PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 if (o == NULL) {
2063 null_error();
2064 return -1;
2065 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 m = o->ob_type->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002068 if (m && m->mp_length) {
2069 Py_ssize_t len = m->mp_length(o);
2070 assert(len >= 0 || PyErr_Occurred());
2071 return len;
2072 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 type_error("object of type '%.200s' has no len()", o);
2075 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002076}
2077
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002078#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002079Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002080PyMapping_Length(PyObject *o)
2081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002083}
2084#define PyMapping_Length PyMapping_Size
2085
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002086PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002087PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002090
Victor Stinner71aea8e2016-08-19 16:59:55 +02002091 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002093 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 okey = PyUnicode_FromString(key);
2096 if (okey == NULL)
2097 return NULL;
2098 r = PyObject_GetItem(o, okey);
2099 Py_DECREF(okey);
2100 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002101}
2102
2103int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002104PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 PyObject *okey;
2107 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 if (key == NULL) {
2110 null_error();
2111 return -1;
2112 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 okey = PyUnicode_FromString(key);
2115 if (okey == NULL)
2116 return -1;
2117 r = PyObject_SetItem(o, okey, value);
2118 Py_DECREF(okey);
2119 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002120}
2121
2122int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002123PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 v = PyMapping_GetItemString(o, key);
2128 if (v) {
2129 Py_DECREF(v);
2130 return 1;
2131 }
2132 PyErr_Clear();
2133 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002134}
2135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002136int
Fred Drake79912472000-07-09 04:06:11 +00002137PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 v = PyObject_GetItem(o, key);
2142 if (v) {
2143 Py_DECREF(v);
2144 return 1;
2145 }
2146 PyErr_Clear();
2147 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002148}
2149
Oren Milman0ccc0f62017-10-08 11:17:46 +03002150/* This function is quite similar to PySequence_Fast(), but specialized to be
2151 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2152 */
2153static PyObject *
2154method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2155{
2156 PyObject *it, *result, *meth_output;
2157
2158 assert(o != NULL);
2159 meth_output = _PyObject_CallMethodId(o, meth_id, NULL);
2160 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2161 return meth_output;
2162 }
2163 it = PyObject_GetIter(meth_output);
2164 if (it == NULL) {
2165 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2166 PyErr_Format(PyExc_TypeError,
2167 "%.200s.%U() returned a non-iterable (type %.200s)",
2168 Py_TYPE(o)->tp_name,
2169 meth_id->object,
2170 Py_TYPE(meth_output)->tp_name);
2171 }
2172 Py_DECREF(meth_output);
2173 return NULL;
2174 }
2175 Py_DECREF(meth_output);
2176 result = PySequence_List(it);
2177 Py_DECREF(it);
2178 return result;
2179}
2180
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002181PyObject *
2182PyMapping_Keys(PyObject *o)
2183{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002184 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002185
Oren Milman0ccc0f62017-10-08 11:17:46 +03002186 if (o == NULL) {
2187 return null_error();
2188 }
2189 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002191 }
2192 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002193}
2194
2195PyObject *
2196PyMapping_Items(PyObject *o)
2197{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002198 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002199
Oren Milman0ccc0f62017-10-08 11:17:46 +03002200 if (o == NULL) {
2201 return null_error();
2202 }
2203 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002204 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002205 }
2206 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002207}
2208
2209PyObject *
2210PyMapping_Values(PyObject *o)
2211{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002212 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002213
Oren Milman0ccc0f62017-10-08 11:17:46 +03002214 if (o == NULL) {
2215 return null_error();
2216 }
2217 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002219 }
2220 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002221}
2222
Guido van Rossum823649d2001-03-21 18:40:58 +00002223/* isinstance(), issubclass() */
2224
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002225/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002226 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002227 * 1. getattr(cls, '__bases__') could raise an AttributeError
2228 * 2. getattr(cls, '__bases__') could raise some other exception
2229 * 3. getattr(cls, '__bases__') could return a tuple
2230 * 4. getattr(cls, '__bases__') could return something other than a tuple
2231 *
2232 * Only state #3 is a non-error state and only it returns a non-NULL object
2233 * (it returns the retrieved tuple).
2234 *
2235 * Any raised AttributeErrors are masked by clearing the exception and
2236 * returning NULL. If an object other than a tuple comes out of __bases__,
2237 * then again, the return value is NULL. So yes, these two situations
2238 * produce exactly the same results: NULL is returned and no error is set.
2239 *
2240 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002242 * exception to be propagated along.
2243 *
2244 * Callers are expected to test for PyErr_Occurred() when the return value
2245 * is NULL to decide whether a valid exception should be propagated or not.
2246 * When there's no exception to propagate, it's customary for the caller to
2247 * set a TypeError.
2248 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002249static PyObject *
2250abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002251{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002252 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002256 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 Py_END_ALLOW_RECURSION
2258 if (bases == NULL) {
2259 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2260 PyErr_Clear();
2261 return NULL;
2262 }
2263 if (!PyTuple_Check(bases)) {
2264 Py_DECREF(bases);
2265 return NULL;
2266 }
2267 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002268}
2269
2270
2271static int
2272abstract_issubclass(PyObject *derived, PyObject *cls)
2273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 PyObject *bases = NULL;
2275 Py_ssize_t i, n;
2276 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 while (1) {
2279 if (derived == cls)
2280 return 1;
2281 bases = abstract_get_bases(derived);
2282 if (bases == NULL) {
2283 if (PyErr_Occurred())
2284 return -1;
2285 return 0;
2286 }
2287 n = PyTuple_GET_SIZE(bases);
2288 if (n == 0) {
2289 Py_DECREF(bases);
2290 return 0;
2291 }
2292 /* Avoid recursivity in the single inheritance case */
2293 if (n == 1) {
2294 derived = PyTuple_GET_ITEM(bases, 0);
2295 Py_DECREF(bases);
2296 continue;
2297 }
2298 for (i = 0; i < n; i++) {
2299 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2300 if (r != 0)
2301 break;
2302 }
2303 Py_DECREF(bases);
2304 return r;
2305 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002306}
2307
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002308static int
2309check_class(PyObject *cls, const char *error)
2310{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 PyObject *bases = abstract_get_bases(cls);
2312 if (bases == NULL) {
2313 /* Do not mask errors. */
2314 if (!PyErr_Occurred())
2315 PyErr_SetString(PyExc_TypeError, error);
2316 return 0;
2317 }
2318 Py_DECREF(bases);
2319 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002320}
2321
Brett Cannon4f653312004-03-20 22:52:14 +00002322static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002323recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002327 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 if (PyType_Check(cls)) {
2330 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2331 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002332 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002334 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002335 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002336 else
R. David Murray6bb99892010-11-20 16:33:30 +00002337 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 }
2339 else {
2340 if (c != (PyObject *)(inst->ob_type) &&
2341 PyType_Check(c))
2342 retval = PyType_IsSubtype(
2343 (PyTypeObject *)c,
2344 (PyTypeObject *)cls);
2345 Py_DECREF(c);
2346 }
2347 }
2348 }
2349 else {
2350 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002351 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002353 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002355 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002356 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002357 else
R. David Murray6bb99892010-11-20 16:33:30 +00002358 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002359 }
2360 else {
2361 retval = abstract_issubclass(icls, cls);
2362 Py_DECREF(icls);
2363 }
2364 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002367}
2368
2369int
Brett Cannon4f653312004-03-20 22:52:14 +00002370PyObject_IsInstance(PyObject *inst, PyObject *cls)
2371{
Benjamin Petersonce798522012-01-22 11:24:29 -05002372 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002375 /* Quick test for an exact match */
2376 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2377 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002378
Georg Brandl72b8a802014-10-03 09:26:37 +02002379 /* We know what type's __instancecheck__ does. */
2380 if (PyType_CheckExact(cls)) {
2381 return recursive_isinstance(inst, cls);
2382 }
2383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 if (PyTuple_Check(cls)) {
2385 Py_ssize_t i;
2386 Py_ssize_t n;
2387 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2390 return -1;
2391 n = PyTuple_GET_SIZE(cls);
2392 for (i = 0; i < n; ++i) {
2393 PyObject *item = PyTuple_GET_ITEM(cls, i);
2394 r = PyObject_IsInstance(inst, item);
2395 if (r != 0)
2396 /* either found it, or got an error */
2397 break;
2398 }
2399 Py_LeaveRecursiveCall();
2400 return r;
2401 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002402
Benjamin Petersonce798522012-01-22 11:24:29 -05002403 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if (checker != NULL) {
2405 PyObject *res;
2406 int ok = -1;
2407 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2408 Py_DECREF(checker);
2409 return ok;
2410 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002411 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 Py_LeaveRecursiveCall();
2413 Py_DECREF(checker);
2414 if (res != NULL) {
2415 ok = PyObject_IsTrue(res);
2416 Py_DECREF(res);
2417 }
2418 return ok;
2419 }
2420 else if (PyErr_Occurred())
2421 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002422 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002424}
2425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002427recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 if (PyType_Check(cls) && PyType_Check(derived)) {
2430 /* Fast path (non-recursive) */
2431 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2432 }
2433 if (!check_class(derived,
2434 "issubclass() arg 1 must be a class"))
2435 return -1;
2436 if (!check_class(cls,
2437 "issubclass() arg 2 must be a class"
2438 " or tuple of classes"))
2439 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002442}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002443
Brett Cannon4f653312004-03-20 22:52:14 +00002444int
2445PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2446{
Benjamin Petersonce798522012-01-22 11:24:29 -05002447 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002449
Georg Brandl72b8a802014-10-03 09:26:37 +02002450 /* We know what type's __subclasscheck__ does. */
2451 if (PyType_CheckExact(cls)) {
2452 /* Quick test for an exact match */
2453 if (derived == cls)
2454 return 1;
2455 return recursive_issubclass(derived, cls);
2456 }
2457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 if (PyTuple_Check(cls)) {
2459 Py_ssize_t i;
2460 Py_ssize_t n;
2461 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2464 return -1;
2465 n = PyTuple_GET_SIZE(cls);
2466 for (i = 0; i < n; ++i) {
2467 PyObject *item = PyTuple_GET_ITEM(cls, i);
2468 r = PyObject_IsSubclass(derived, item);
2469 if (r != 0)
2470 /* either found it, or got an error */
2471 break;
2472 }
2473 Py_LeaveRecursiveCall();
2474 return r;
2475 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002476
Benjamin Petersonce798522012-01-22 11:24:29 -05002477 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 if (checker != NULL) {
2479 PyObject *res;
2480 int ok = -1;
2481 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2482 Py_DECREF(checker);
2483 return ok;
2484 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002485 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 Py_LeaveRecursiveCall();
2487 Py_DECREF(checker);
2488 if (res != NULL) {
2489 ok = PyObject_IsTrue(res);
2490 Py_DECREF(res);
2491 }
2492 return ok;
2493 }
2494 else if (PyErr_Occurred())
2495 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002496 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002498}
2499
2500int
2501_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002504}
2505
2506int
2507_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002510}
2511
2512
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002513PyObject *
2514PyObject_GetIter(PyObject *o)
2515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 PyTypeObject *t = o->ob_type;
Victor Stinner14e6d092016-12-09 17:08:59 +01002517 getiterfunc f;
2518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 f = t->tp_iter;
2520 if (f == NULL) {
2521 if (PySequence_Check(o))
2522 return PySeqIter_New(o);
2523 return type_error("'%.200s' object is not iterable", o);
2524 }
2525 else {
2526 PyObject *res = (*f)(o);
2527 if (res != NULL && !PyIter_Check(res)) {
2528 PyErr_Format(PyExc_TypeError,
2529 "iter() returned non-iterator "
2530 "of type '%.100s'",
2531 res->ob_type->tp_name);
2532 Py_DECREF(res);
2533 res = NULL;
2534 }
2535 return res;
2536 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002537}
2538
Tim Petersf4848da2001-05-05 00:14:56 +00002539/* Return next item.
2540 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2541 * If the iteration terminates normally, return NULL and clear the
2542 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2543 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002545 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002546PyObject *
2547PyIter_Next(PyObject *iter)
2548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 PyObject *result;
2550 result = (*iter->ob_type->tp_iternext)(iter);
2551 if (result == NULL &&
2552 PyErr_Occurred() &&
2553 PyErr_ExceptionMatches(PyExc_StopIteration))
2554 PyErr_Clear();
2555 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002556}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002557
2558
2559/*
2560 * Flatten a sequence of bytes() objects into a C array of
2561 * NULL terminated string pointers with a NULL char* terminating the array.
2562 * (ie: an argv or env list)
2563 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002564 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2565 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002566 */
2567char *const *
2568_PySequence_BytesToCharpArray(PyObject* self)
2569{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 char **array;
2571 Py_ssize_t i, argc;
2572 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002573 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 argc = PySequence_Size(self);
2576 if (argc == -1)
2577 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002578
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002579 assert(argc >= 0);
2580
2581 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2582 PyErr_NoMemory();
2583 return NULL;
2584 }
2585
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002586 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 if (array == NULL) {
2588 PyErr_NoMemory();
2589 return NULL;
2590 }
2591 for (i = 0; i < argc; ++i) {
2592 char *data;
2593 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002594 if (item == NULL) {
2595 /* NULL terminate before freeing. */
2596 array[i] = NULL;
2597 goto fail;
2598 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002599 /* check for embedded null bytes */
2600 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 /* NULL terminate before freeing. */
2602 array[i] = NULL;
2603 goto fail;
2604 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002605 size = PyBytes_GET_SIZE(item) + 1;
2606 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 if (!array[i]) {
2608 PyErr_NoMemory();
2609 goto fail;
2610 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002611 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 Py_DECREF(item);
2613 }
2614 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002617
2618fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 Py_XDECREF(item);
2620 _Py_FreeCharPArray(array);
2621 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002622}
2623
2624
2625/* Free's a NULL terminated char** array of C strings. */
2626void
2627_Py_FreeCharPArray(char *const array[])
2628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002629 Py_ssize_t i;
2630 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002631 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002633 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002634}