blob: a68253bdb43d0f64b8785256be8abfb16800c083 [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
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100171 if (PyType_Check(o)) {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +0200172 PyObject *meth, *result, *stack[1] = {key};
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100173 _Py_IDENTIFIER(__class_getitem__);
174 meth = _PyObject_GetAttrId(o, &PyId___class_getitem__);
175 if (meth) {
Serhiy Storchakace5b0e92018-01-05 00:21:41 +0200176 result = _PyObject_FastCall(meth, stack, 1);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100177 Py_DECREF(meth);
178 return result;
179 }
180 else if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
181 return NULL;
182 }
183 PyErr_Clear();
184 }
185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000187}
188
189int
Fred Drake79912472000-07-09 04:06:11 +0000190PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 if (o == NULL || key == NULL || value == NULL) {
195 null_error();
196 return -1;
197 }
198 m = o->ob_type->tp_as_mapping;
199 if (m && m->mp_ass_subscript)
200 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 if (o->ob_type->tp_as_sequence) {
203 if (PyIndex_Check(key)) {
204 Py_ssize_t key_value;
205 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
206 if (key_value == -1 && PyErr_Occurred())
207 return -1;
208 return PySequence_SetItem(o, key_value, value);
209 }
210 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
211 type_error("sequence index must be "
212 "integer, not '%.200s'", key);
213 return -1;
214 }
215 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 type_error("'%.200s' object does not support item assignment", o);
218 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000219}
220
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000221int
Fred Drake79912472000-07-09 04:06:11 +0000222PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 if (o == NULL || key == NULL) {
227 null_error();
228 return -1;
229 }
230 m = o->ob_type->tp_as_mapping;
231 if (m && m->mp_ass_subscript)
232 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (o->ob_type->tp_as_sequence) {
235 if (PyIndex_Check(key)) {
236 Py_ssize_t key_value;
237 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
238 if (key_value == -1 && PyErr_Occurred())
239 return -1;
240 return PySequence_DelItem(o, key_value);
241 }
242 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
243 type_error("sequence index must be "
244 "integer, not '%.200s'", key);
245 return -1;
246 }
247 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 type_error("'%.200s' object does not support item deletion", o);
250 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000251}
252
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000253int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300254PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 PyObject *okey;
257 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 if (o == NULL || key == NULL) {
260 null_error();
261 return -1;
262 }
263 okey = PyUnicode_FromString(key);
264 if (okey == NULL)
265 return -1;
266 ret = PyObject_DelItem(o, okey);
267 Py_DECREF(okey);
268 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000269}
270
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000271/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000272 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000273 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000274int
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000275PyObject_CheckReadBuffer(PyObject *obj)
276{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
278 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 if (pb == NULL ||
281 pb->bf_getbuffer == NULL)
282 return 0;
283 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
284 PyErr_Clear();
285 return 0;
286 }
287 PyBuffer_Release(&view);
288 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000289}
290
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200291static int
292as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
297 null_error();
298 return -1;
299 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200300 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 *buffer = view.buf;
304 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200305 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000307}
308
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200309int
310PyObject_AsCharBuffer(PyObject *obj,
311 const char **buffer,
312 Py_ssize_t *buffer_len)
313{
314 return as_read_buffer(obj, (const void **)buffer, buffer_len);
315}
316
317int PyObject_AsReadBuffer(PyObject *obj,
318 const void **buffer,
319 Py_ssize_t *buffer_len)
320{
321 return as_read_buffer(obj, buffer, buffer_len);
322}
323
Guido van Rossum4c08d552000-03-10 22:55:18 +0000324int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 void **buffer,
326 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 PyBufferProcs *pb;
329 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
332 null_error();
333 return -1;
334 }
335 pb = obj->ob_type->tp_as_buffer;
336 if (pb == NULL ||
337 pb->bf_getbuffer == NULL ||
338 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
339 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400340 "expected a writable bytes-like object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 return -1;
342 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 *buffer = view.buf;
345 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200346 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000348}
349
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000350/* Buffer C-API for Python 3.0 */
351
352int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000353PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000354{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200355 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
356
357 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400359 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 Py_TYPE(obj)->tp_name);
361 return -1;
362 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200363 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000364}
365
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000366static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100367_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 Py_ssize_t sd, dim;
370 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000371
Stefan Krah363af442015-02-01 14:53:54 +0100372 /* 1) len = product(shape) * itemsize
373 2) itemsize > 0
374 3) len = 0 <==> exists i: shape[i] = 0 */
375 if (view->len == 0) return 1;
376 if (view->strides == NULL) { /* C-contiguous by definition */
377 /* Trivially F-contiguous */
378 if (view->ndim <= 1) return 1;
379
380 /* ndim > 1 implies shape != NULL */
381 assert(view->shape != NULL);
382
383 /* Effectively 1-d */
384 sd = 0;
385 for (i=0; i<view->ndim; i++) {
386 if (view->shape[i] > 1) sd += 1;
387 }
388 return sd <= 1;
389 }
390
391 /* strides != NULL implies both of these */
392 assert(view->ndim > 0);
393 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 for (i=0; i<view->ndim; i++) {
397 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100398 if (dim > 1 && view->strides[i] != sd) {
399 return 0;
400 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 sd *= dim;
402 }
403 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000404}
405
406static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100407_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 Py_ssize_t sd, dim;
410 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000411
Stefan Krah363af442015-02-01 14:53:54 +0100412 /* 1) len = product(shape) * itemsize
413 2) itemsize > 0
414 3) len = 0 <==> exists i: shape[i] = 0 */
415 if (view->len == 0) return 1;
416 if (view->strides == NULL) return 1; /* C-contiguous by definition */
417
418 /* strides != NULL implies both of these */
419 assert(view->ndim > 0);
420 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 for (i=view->ndim-1; i>=0; i--) {
424 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100425 if (dim > 1 && view->strides[i] != sd) {
426 return 0;
427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 sd *= dim;
429 }
430 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431}
432
433int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100434PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000435{
436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000438
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100439 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100441 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100443 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return (_IsCContiguous(view) || _IsFortranContiguous(view));
445 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446}
447
448
Guido van Rossum98297ee2007-11-06 21:34:58 +0000449void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000450PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 char* pointer;
453 int i;
454 pointer = (char *)view->buf;
455 for (i = 0; i < view->ndim; i++) {
456 pointer += view->strides[i]*indices[i];
457 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
458 pointer = *((char**)pointer) + view->suboffsets[i];
459 }
460 }
461 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000462}
463
464
Guido van Rossum98297ee2007-11-06 21:34:58 +0000465void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000466_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 +0000467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 for (k=0; k<nd; k++) {
471 if (index[k] < shape[k]-1) {
472 index[k]++;
473 break;
474 }
475 else {
476 index[k] = 0;
477 }
478 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000479}
480
Guido van Rossum98297ee2007-11-06 21:34:58 +0000481void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000482_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 +0000483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 for (k=nd-1; k>=0; k--) {
487 if (index[k] < shape[k]-1) {
488 index[k]++;
489 break;
490 }
491 else {
492 index[k] = 0;
493 }
494 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000495}
496
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000497int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000498PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000501 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 Py_ssize_t *indices, elements;
503 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 if (len > view->len) {
506 len = view->len;
507 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 if (PyBuffer_IsContiguous(view, fort)) {
510 /* simplest copy is all that is needed */
511 memcpy(view->buf, buf, len);
512 return 0;
513 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000516
Stefan Krah7213fcc2015-02-01 16:19:23 +0100517 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
519 if (indices == NULL) {
520 PyErr_NoMemory();
521 return -1;
522 }
523 for (k=0; k<view->ndim;k++) {
524 indices[k] = 0;
525 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000528 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 }
530 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000531 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 }
533 src = buf;
534 /* XXX : This is not going to be the fastest code in the world
535 several optimizations are possible.
536 */
537 elements = len / view->itemsize;
538 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 ptr = PyBuffer_GetPointer(view, indices);
540 memcpy(ptr, src, view->itemsize);
541 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100542 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 PyMem_Free(indices);
546 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000547}
548
Guido van Rossum98297ee2007-11-06 21:34:58 +0000549int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 Py_buffer view_dest, view_src;
552 int k;
553 Py_ssize_t *indices, elements;
554 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (!PyObject_CheckBuffer(dest) ||
557 !PyObject_CheckBuffer(src)) {
558 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400559 "both destination and source must be "\
560 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return -1;
562 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
565 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
566 PyBuffer_Release(&view_dest);
567 return -1;
568 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 if (view_dest.len < view_src.len) {
571 PyErr_SetString(PyExc_BufferError,
572 "destination is too small to receive data from source");
573 PyBuffer_Release(&view_dest);
574 PyBuffer_Release(&view_src);
575 return -1;
576 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
579 PyBuffer_IsContiguous(&view_src, 'C')) ||
580 (PyBuffer_IsContiguous(&view_dest, 'F') &&
581 PyBuffer_IsContiguous(&view_src, 'F'))) {
582 /* simplest copy is all that is needed */
583 memcpy(view_dest.buf, view_src.buf, view_src.len);
584 PyBuffer_Release(&view_dest);
585 PyBuffer_Release(&view_src);
586 return 0;
587 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 /* XXX(nnorwitz): need to check for overflow! */
592 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
593 if (indices == NULL) {
594 PyErr_NoMemory();
595 PyBuffer_Release(&view_dest);
596 PyBuffer_Release(&view_src);
597 return -1;
598 }
599 for (k=0; k<view_src.ndim;k++) {
600 indices[k] = 0;
601 }
602 elements = 1;
603 for (k=0; k<view_src.ndim; k++) {
604 /* XXX(nnorwitz): can this overflow? */
605 elements *= view_src.shape[k];
606 }
607 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000608 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 dptr = PyBuffer_GetPointer(&view_dest, indices);
610 sptr = PyBuffer_GetPointer(&view_src, indices);
611 memcpy(dptr, sptr, view_src.itemsize);
612 }
613 PyMem_Free(indices);
614 PyBuffer_Release(&view_dest);
615 PyBuffer_Release(&view_src);
616 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000617}
618
619void
620PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 Py_ssize_t *strides, int itemsize,
622 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000623{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 int k;
625 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 sd = itemsize;
628 if (fort == 'F') {
629 for (k=0; k<nd; k++) {
630 strides[k] = sd;
631 sd *= shape[k];
632 }
633 }
634 else {
635 for (k=nd-1; k>=0; k--) {
636 strides[k] = sd;
637 sd *= shape[k];
638 }
639 }
640 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000641}
642
643int
Martin v. Löwis423be952008-08-13 15:53:07 +0000644PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100645 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000646{
Stefan Krah5178d912015-02-03 16:57:21 +0100647 if (view == NULL) {
648 PyErr_SetString(PyExc_BufferError,
649 "PyBuffer_FillInfo: view==NULL argument is obsolete");
650 return -1;
651 }
652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
654 (readonly == 1)) {
655 PyErr_SetString(PyExc_BufferError,
656 "Object is not writable.");
657 return -1;
658 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 view->obj = obj;
661 if (obj)
662 Py_INCREF(obj);
663 view->buf = buf;
664 view->len = len;
665 view->readonly = readonly;
666 view->itemsize = 1;
667 view->format = NULL;
668 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
669 view->format = "B";
670 view->ndim = 1;
671 view->shape = NULL;
672 if ((flags & PyBUF_ND) == PyBUF_ND)
673 view->shape = &(view->len);
674 view->strides = NULL;
675 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
676 view->strides = &(view->itemsize);
677 view->suboffsets = NULL;
678 view->internal = NULL;
679 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000680}
681
Martin v. Löwis423be952008-08-13 15:53:07 +0000682void
683PyBuffer_Release(Py_buffer *view)
684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200686 PyBufferProcs *pb;
687 if (obj == NULL)
688 return;
689 pb = Py_TYPE(obj)->tp_as_buffer;
690 if (pb && pb->bf_releasebuffer)
691 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200693 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000694}
695
Eric Smith8fd3eba2008-02-17 19:48:00 +0000696PyObject *
697PyObject_Format(PyObject *obj, PyObject *format_spec)
698{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000699 PyObject *meth;
700 PyObject *empty = NULL;
701 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500702 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000703
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300704 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
705 PyErr_Format(PyExc_SystemError,
706 "Format specifier must be a string, not %.200s",
707 Py_TYPE(format_spec)->tp_name);
708 return NULL;
709 }
710
711 /* Fast path for common types. */
712 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
713 if (PyUnicode_CheckExact(obj)) {
714 Py_INCREF(obj);
715 return obj;
716 }
717 if (PyLong_CheckExact(obj)) {
718 return PyObject_Str(obj);
719 }
720 }
721
Eric Smith8fd3eba2008-02-17 19:48:00 +0000722 /* If no format_spec is provided, use an empty string */
723 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100724 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000725 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000726 }
727
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300728 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500729 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000730 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000731 if (!PyErr_Occurred())
732 PyErr_Format(PyExc_TypeError,
733 "Type %.100s doesn't define __format__",
734 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000736 }
737
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000738 /* And call it. */
Victor Stinnerde4ae3d2016-12-04 22:59:09 +0100739 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000740 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000741
742 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800743 PyErr_Format(PyExc_TypeError,
744 "__format__ must return a str, not %.200s",
745 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000746 Py_DECREF(result);
747 result = NULL;
748 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000749 }
750
751done:
752 Py_XDECREF(empty);
753 return result;
754}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755/* Operations on numbers */
756
757int
Fred Drake79912472000-07-09 04:06:11 +0000758PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 return o && o->ob_type->tp_as_number &&
761 (o->ob_type->tp_as_number->nb_int ||
762 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000763}
764
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000765/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000766
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000767#define NB_SLOT(x) offsetof(PyNumberMethods, x)
768#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000770#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000772
773/*
774 Calling scheme used for binary operations:
775
Neal Norwitz4886cc32006-08-21 17:06:07 +0000776 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000778
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000779 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
780 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000781 */
782
783static PyObject *
784binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 PyObject *x;
787 binaryfunc slotv = NULL;
788 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 if (v->ob_type->tp_as_number != NULL)
791 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
792 if (w->ob_type != v->ob_type &&
793 w->ob_type->tp_as_number != NULL) {
794 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
795 if (slotw == slotv)
796 slotw = NULL;
797 }
798 if (slotv) {
799 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
800 x = slotw(v, w);
801 if (x != Py_NotImplemented)
802 return x;
803 Py_DECREF(x); /* can't do it */
804 slotw = NULL;
805 }
806 x = slotv(v, w);
807 if (x != Py_NotImplemented)
808 return x;
809 Py_DECREF(x); /* can't do it */
810 }
811 if (slotw) {
812 x = slotw(v, w);
813 if (x != Py_NotImplemented)
814 return x;
815 Py_DECREF(x); /* can't do it */
816 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500817 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000818}
Guido van Rossum77660912002-04-16 16:32:50 +0000819
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000820static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000821binop_type_error(PyObject *v, PyObject *w, const char *op_name)
822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 PyErr_Format(PyExc_TypeError,
824 "unsupported operand type(s) for %.100s: "
825 "'%.100s' and '%.100s'",
826 op_name,
827 v->ob_type->tp_name,
828 w->ob_type->tp_name);
829 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000830}
831
832static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000833binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 PyObject *result = binary_op1(v, w, op_slot);
836 if (result == Py_NotImplemented) {
837 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530838
839 if (op_slot == NB_SLOT(nb_rshift) &&
840 PyCFunction_Check(v) &&
841 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
842 {
843 PyErr_Format(PyExc_TypeError,
844 "unsupported operand type(s) for %.100s: "
845 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530846 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530847 op_name,
848 v->ob_type->tp_name,
849 w->ob_type->tp_name);
850 return NULL;
851 }
852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 return binop_type_error(v, w, op_name);
854 }
855 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000856}
857
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000858
859/*
860 Calling scheme used for ternary operations:
861
Neal Norwitz4886cc32006-08-21 17:06:07 +0000862 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000864 */
865
866static PyObject *
867ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 PyObject *w,
869 PyObject *z,
870 const int op_slot,
871 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 PyNumberMethods *mv, *mw, *mz;
874 PyObject *x = NULL;
875 ternaryfunc slotv = NULL;
876 ternaryfunc slotw = NULL;
877 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 mv = v->ob_type->tp_as_number;
880 mw = w->ob_type->tp_as_number;
881 if (mv != NULL)
882 slotv = NB_TERNOP(mv, op_slot);
883 if (w->ob_type != v->ob_type &&
884 mw != NULL) {
885 slotw = NB_TERNOP(mw, op_slot);
886 if (slotw == slotv)
887 slotw = NULL;
888 }
889 if (slotv) {
890 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
891 x = slotw(v, w, z);
892 if (x != Py_NotImplemented)
893 return x;
894 Py_DECREF(x); /* can't do it */
895 slotw = NULL;
896 }
897 x = slotv(v, w, z);
898 if (x != Py_NotImplemented)
899 return x;
900 Py_DECREF(x); /* can't do it */
901 }
902 if (slotw) {
903 x = slotw(v, w, z);
904 if (x != Py_NotImplemented)
905 return x;
906 Py_DECREF(x); /* can't do it */
907 }
908 mz = z->ob_type->tp_as_number;
909 if (mz != NULL) {
910 slotz = NB_TERNOP(mz, op_slot);
911 if (slotz == slotv || slotz == slotw)
912 slotz = NULL;
913 if (slotz) {
914 x = slotz(v, w, z);
915 if (x != Py_NotImplemented)
916 return x;
917 Py_DECREF(x); /* can't do it */
918 }
919 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 if (z == Py_None)
922 PyErr_Format(
923 PyExc_TypeError,
924 "unsupported operand type(s) for ** or pow(): "
925 "'%.100s' and '%.100s'",
926 v->ob_type->tp_name,
927 w->ob_type->tp_name);
928 else
929 PyErr_Format(
930 PyExc_TypeError,
931 "unsupported operand type(s) for pow(): "
932 "'%.100s', '%.100s', '%.100s'",
933 v->ob_type->tp_name,
934 w->ob_type->tp_name,
935 z->ob_type->tp_name);
936 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000937}
938
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000939#define BINARY_FUNC(func, op, op_name) \
940 PyObject * \
941 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000943 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000944
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000945BINARY_FUNC(PyNumber_Or, nb_or, "|")
946BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
947BINARY_FUNC(PyNumber_And, nb_and, "&")
948BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
949BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
950BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000951BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000952
953PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000954PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
957 if (result == Py_NotImplemented) {
958 PySequenceMethods *m = v->ob_type->tp_as_sequence;
959 Py_DECREF(result);
960 if (m && m->sq_concat) {
961 return (*m->sq_concat)(v, w);
962 }
963 result = binop_type_error(v, w, "+");
964 }
965 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000966}
967
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000968static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000969sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 Py_ssize_t count;
972 if (PyIndex_Check(n)) {
973 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
974 if (count == -1 && PyErr_Occurred())
975 return NULL;
976 }
977 else {
978 return type_error("can't multiply sequence by "
979 "non-int of type '%.200s'", n);
980 }
981 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000982}
983
984PyObject *
985PyNumber_Multiply(PyObject *v, PyObject *w)
986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
988 if (result == Py_NotImplemented) {
989 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
990 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
991 Py_DECREF(result);
992 if (mv && mv->sq_repeat) {
993 return sequence_repeat(mv->sq_repeat, v, w);
994 }
995 else if (mw && mw->sq_repeat) {
996 return sequence_repeat(mw->sq_repeat, w, v);
997 }
998 result = binop_type_error(v, w, "*");
999 }
1000 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001001}
1002
Guido van Rossume15dee51995-07-18 14:12:02 +00001003PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001004PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
1005{
1006 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
1007}
1008
1009PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001010PyNumber_FloorDivide(PyObject *v, PyObject *w)
1011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001013}
1014
1015PyObject *
1016PyNumber_TrueDivide(PyObject *v, PyObject *w)
1017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001019}
1020
1021PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001022PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001025}
1026
1027PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001028PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001031}
1032
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001033/* Binary in-place operators */
1034
1035/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001036 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001037
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001038 - If the left hand object has the appropriate struct members, and
1039 they are filled, call the appropriate function and return the
1040 result. No coercion is done on the arguments; the left-hand object
1041 is the one the operation is performed on, and it's up to the
1042 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001043
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001044 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001045 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001046
1047 */
1048
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001049static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001050binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyNumberMethods *mv = v->ob_type->tp_as_number;
1053 if (mv != NULL) {
1054 binaryfunc slot = NB_BINOP(mv, iop_slot);
1055 if (slot) {
1056 PyObject *x = (slot)(v, w);
1057 if (x != Py_NotImplemented) {
1058 return x;
1059 }
1060 Py_DECREF(x);
1061 }
1062 }
1063 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001064}
1065
1066static PyObject *
1067binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1071 if (result == Py_NotImplemented) {
1072 Py_DECREF(result);
1073 return binop_type_error(v, w, op_name);
1074 }
1075 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001076}
1077
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001078#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 PyObject * \
1080 func(PyObject *v, PyObject *w) { \
1081 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1082 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001083
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001084INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1085INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1086INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1087INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1088INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1089INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001090INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001091
1092PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001093PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1096 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001097}
1098
1099PyObject *
1100PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1101{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1103 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001104}
1105
1106PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001107PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1110 NB_SLOT(nb_add));
1111 if (result == Py_NotImplemented) {
1112 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1113 Py_DECREF(result);
1114 if (m != NULL) {
1115 binaryfunc f = NULL;
1116 f = m->sq_inplace_concat;
1117 if (f == NULL)
1118 f = m->sq_concat;
1119 if (f != NULL)
1120 return (*f)(v, w);
1121 }
1122 result = binop_type_error(v, w, "+=");
1123 }
1124 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001125}
1126
1127PyObject *
1128PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1129{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1131 NB_SLOT(nb_multiply));
1132 if (result == Py_NotImplemented) {
1133 ssizeargfunc f = NULL;
1134 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1135 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1136 Py_DECREF(result);
1137 if (mv != NULL) {
1138 f = mv->sq_inplace_repeat;
1139 if (f == NULL)
1140 f = mv->sq_repeat;
1141 if (f != NULL)
1142 return sequence_repeat(f, v, w);
1143 }
1144 else if (mw != NULL) {
1145 /* Note that the right hand operand should not be
1146 * mutated in this case so sq_inplace_repeat is not
1147 * used. */
1148 if (mw->sq_repeat)
1149 return sequence_repeat(mw->sq_repeat, w, v);
1150 }
1151 result = binop_type_error(v, w, "*=");
1152 }
1153 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001154}
1155
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001156PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001157PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1158{
1159 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1160 NB_SLOT(nb_matrix_multiply), "@=");
1161}
1162
1163PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001164PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1167 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001168}
1169
1170PyObject *
1171PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 if (v->ob_type->tp_as_number &&
1174 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1175 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1176 }
1177 else {
1178 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1179 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001180}
1181
1182
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001183/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001184
1185PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001186PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001187{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001189
Victor Stinner71aea8e2016-08-19 16:59:55 +02001190 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001192 }
1193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 m = o->ob_type->tp_as_number;
1195 if (m && m->nb_negative)
1196 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001199}
1200
1201PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001202PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001205
Victor Stinner71aea8e2016-08-19 16:59:55 +02001206 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001208 }
1209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 m = o->ob_type->tp_as_number;
1211 if (m && m->nb_positive)
1212 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001215}
1216
1217PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001218PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001221
Victor Stinner71aea8e2016-08-19 16:59:55 +02001222 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001224 }
1225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 m = o->ob_type->tp_as_number;
1227 if (m && m->nb_invert)
1228 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001231}
1232
1233PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001234PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001237
Victor Stinner71aea8e2016-08-19 16:59:55 +02001238 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001240 }
1241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 m = o->ob_type->tp_as_number;
1243 if (m && m->nb_absolute)
1244 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001247}
1248
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001249/* Return a Python int from the object item.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001250 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001251 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001252*/
1253PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001254PyNumber_Index(PyObject *item)
1255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 PyObject *result = NULL;
Victor Stinner71aea8e2016-08-19 16:59:55 +02001257 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001259 }
1260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 if (PyLong_Check(item)) {
1262 Py_INCREF(item);
1263 return item;
1264 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001265 if (!PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 PyErr_Format(PyExc_TypeError,
1267 "'%.200s' object cannot be interpreted "
1268 "as an integer", item->ob_type->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001269 return NULL;
1270 }
1271 result = item->ob_type->tp_as_number->nb_index(item);
1272 if (!result || PyLong_CheckExact(result))
1273 return result;
1274 if (!PyLong_Check(result)) {
1275 PyErr_Format(PyExc_TypeError,
1276 "__index__ returned non-int (type %.200s)",
1277 result->ob_type->tp_name);
1278 Py_DECREF(result);
1279 return NULL;
1280 }
1281 /* Issue #17576: warn if 'result' not of exact type int. */
1282 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1283 "__index__ returned non-int (type %.200s). "
1284 "The ability to return an instance of a strict subclass of int "
1285 "is deprecated, and may be removed in a future version of Python.",
1286 result->ob_type->tp_name)) {
1287 Py_DECREF(result);
1288 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 }
1290 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001291}
1292
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001293/* Return an error on Overflow only if err is not NULL*/
1294
1295Py_ssize_t
1296PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 Py_ssize_t result;
1299 PyObject *runerr;
1300 PyObject *value = PyNumber_Index(item);
1301 if (value == NULL)
1302 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 /* We're done if PyLong_AsSsize_t() returns without error. */
1305 result = PyLong_AsSsize_t(value);
1306 if (result != -1 || !(runerr = PyErr_Occurred()))
1307 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001308
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 /* Error handling code -- only manage OverflowError differently */
1310 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1311 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 PyErr_Clear();
1314 /* If no error-handling desired then the default clipping
1315 is sufficient.
1316 */
1317 if (!err) {
1318 assert(PyLong_Check(value));
1319 /* Whether or not it is less than or equal to
1320 zero is determined by the sign of ob_size
1321 */
1322 if (_PyLong_Sign(value) < 0)
1323 result = PY_SSIZE_T_MIN;
1324 else
1325 result = PY_SSIZE_T_MAX;
1326 }
1327 else {
1328 /* Otherwise replace the error with caller's error object. */
1329 PyErr_Format(err,
1330 "cannot fit '%.200s' into an index-sized integer",
1331 item->ob_type->tp_name);
1332 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001333
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001334 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 Py_DECREF(value);
1336 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001337}
1338
1339
Guido van Rossume15dee51995-07-18 14:12:02 +00001340PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001341PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001342{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001343 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001346 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001347 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001348
Victor Stinner71aea8e2016-08-19 16:59:55 +02001349 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001351 }
1352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (PyLong_CheckExact(o)) {
1354 Py_INCREF(o);
1355 return o;
1356 }
1357 m = o->ob_type->tp_as_number;
1358 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001359 result = (PyObject *)_PyLong_FromNbInt(o);
1360 if (result != NULL && !PyLong_CheckExact(result)) {
1361 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1362 }
1363 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001365 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001366 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001367 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001369 if (result == NULL || PyLong_CheckExact(result)) {
1370 return result;
1371 }
1372 if (PyLong_Check(result)) {
1373 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1374 return result;
1375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001377 but int() needs to return an int. */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001378 m = result->ob_type->tp_as_number;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001379 if (m == NULL || m->nb_int == NULL) {
1380 PyErr_Format(
1381 PyExc_TypeError,
1382 "__trunc__ returned non-Integral (type %.200s)",
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001383 result->ob_type->tp_name);
1384 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001385 return NULL;
1386 }
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001387 Py_SETREF(result, (PyObject *)_PyLong_FromNbInt(result));
1388 if (result != NULL && !PyLong_CheckExact(result)) {
1389 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1390 }
1391 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001393 if (PyErr_Occurred())
1394 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001395
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001396 if (PyUnicode_Check(o))
1397 /* The below check is done in PyLong_FromUnicode(). */
1398 return PyLong_FromUnicodeObject(o, 10);
1399
Martin Pantereeb896c2015-11-07 02:32:21 +00001400 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001402 * doesn't do. In particular int('9\x005') must raise an
1403 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001405 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1406 PyBytes_GET_SIZE(o), 10);
1407
1408 if (PyByteArray_Check(o))
1409 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1410 PyByteArray_GET_SIZE(o), 10);
1411
1412 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001413 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001414
1415 /* Copy to NUL-terminated buffer. */
1416 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1417 if (bytes == NULL) {
1418 PyBuffer_Release(&view);
1419 return NULL;
1420 }
1421 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1422 PyBytes_GET_SIZE(bytes), 10);
1423 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001424 PyBuffer_Release(&view);
1425 return result;
1426 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001427
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001428 return type_error("int() argument must be a string, a bytes-like object "
1429 "or a number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001430}
1431
1432PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001433PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001436
Victor Stinner71aea8e2016-08-19 16:59:55 +02001437 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001439 }
1440
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001441 if (PyFloat_CheckExact(o)) {
1442 Py_INCREF(o);
1443 return o;
1444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 m = o->ob_type->tp_as_number;
1446 if (m && m->nb_float) { /* This should include subclasses of float */
1447 PyObject *res = m->nb_float(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001448 double val;
1449 if (!res || PyFloat_CheckExact(res)) {
1450 return res;
1451 }
1452 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001454 "%.50s.__float__ returned non-float (type %.50s)",
1455 o->ob_type->tp_name, res->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 Py_DECREF(res);
1457 return NULL;
1458 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001459 /* Issue #26983: warn if 'res' not of exact type float. */
1460 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1461 "%.50s.__float__ returned non-float (type %.50s). "
1462 "The ability to return an instance of a strict subclass of float "
1463 "is deprecated, and may be removed in a future version of Python.",
1464 o->ob_type->tp_name, res->ob_type->tp_name)) {
1465 Py_DECREF(res);
1466 return NULL;
1467 }
1468 val = PyFloat_AS_DOUBLE(res);
1469 Py_DECREF(res);
1470 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 }
1472 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001473 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 }
1475 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001476}
1477
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001478
1479PyObject *
1480PyNumber_ToBase(PyObject *n, int base)
1481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 PyObject *res = NULL;
1483 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 if (!index)
1486 return NULL;
1487 if (PyLong_Check(index))
1488 res = _PyLong_Format(index, base);
1489 else
1490 /* It should not be possible to get here, as
1491 PyNumber_Index already has a check for the same
1492 condition */
Serhiy Storchaka95949422013-08-27 19:40:23 +03001493 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 Py_DECREF(index);
1495 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001496}
1497
1498
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001499/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001500
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001501int
Fred Drake79912472000-07-09 04:06:11 +00001502PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 if (PyDict_Check(s))
1505 return 0;
1506 return s != NULL && s->ob_type->tp_as_sequence &&
1507 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001508}
1509
Martin v. Löwis18e16552006-02-15 17:27:45 +00001510Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001511PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 if (s == NULL) {
1516 null_error();
1517 return -1;
1518 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 m = s->ob_type->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001521 if (m && m->sq_length) {
1522 Py_ssize_t len = m->sq_length(s);
1523 assert(len >= 0 || PyErr_Occurred());
1524 return len;
1525 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 type_error("object of type '%.200s' has no len()", s);
1528 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001529}
1530
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001531#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001532Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001533PySequence_Length(PyObject *s)
1534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001536}
1537#define PySequence_Length PySequence_Size
1538
Guido van Rossume15dee51995-07-18 14:12:02 +00001539PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001540PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001543
Victor Stinner71aea8e2016-08-19 16:59:55 +02001544 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001546 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 m = s->ob_type->tp_as_sequence;
1549 if (m && m->sq_concat)
1550 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 /* Instances of user classes defining an __add__() method only
1553 have an nb_add slot, not an sq_concat slot. So we fall back
1554 to nb_add if both arguments appear to be sequences. */
1555 if (PySequence_Check(s) && PySequence_Check(o)) {
1556 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1557 if (result != Py_NotImplemented)
1558 return result;
1559 Py_DECREF(result);
1560 }
1561 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001562}
1563
1564PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001565PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001568
Victor Stinner71aea8e2016-08-19 16:59:55 +02001569 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001571 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 m = o->ob_type->tp_as_sequence;
1574 if (m && m->sq_repeat)
1575 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 /* Instances of user classes defining a __mul__() method only
1578 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1579 to nb_multiply if o appears to be a sequence. */
1580 if (PySequence_Check(o)) {
1581 PyObject *n, *result;
1582 n = PyLong_FromSsize_t(count);
1583 if (n == NULL)
1584 return NULL;
1585 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1586 Py_DECREF(n);
1587 if (result != Py_NotImplemented)
1588 return result;
1589 Py_DECREF(result);
1590 }
1591 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001592}
1593
1594PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001595PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001598
Victor Stinner71aea8e2016-08-19 16:59:55 +02001599 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001601 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 m = s->ob_type->tp_as_sequence;
1604 if (m && m->sq_inplace_concat)
1605 return m->sq_inplace_concat(s, o);
1606 if (m && m->sq_concat)
1607 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 if (PySequence_Check(s) && PySequence_Check(o)) {
1610 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1611 NB_SLOT(nb_add));
1612 if (result != Py_NotImplemented)
1613 return result;
1614 Py_DECREF(result);
1615 }
1616 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001617}
1618
1619PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001620PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001623
Victor Stinner71aea8e2016-08-19 16:59:55 +02001624 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001626 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 m = o->ob_type->tp_as_sequence;
1629 if (m && m->sq_inplace_repeat)
1630 return m->sq_inplace_repeat(o, count);
1631 if (m && m->sq_repeat)
1632 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 if (PySequence_Check(o)) {
1635 PyObject *n, *result;
1636 n = PyLong_FromSsize_t(count);
1637 if (n == NULL)
1638 return NULL;
1639 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1640 NB_SLOT(nb_multiply));
1641 Py_DECREF(n);
1642 if (result != Py_NotImplemented)
1643 return result;
1644 Py_DECREF(result);
1645 }
1646 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001647}
1648
1649PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001650PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001653
Victor Stinner71aea8e2016-08-19 16:59:55 +02001654 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 m = s->ob_type->tp_as_sequence;
1659 if (m && m->sq_item) {
1660 if (i < 0) {
1661 if (m->sq_length) {
1662 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnere20310f2015-11-05 13:56:58 +01001663 if (l < 0) {
1664 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001666 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 i += l;
1668 }
1669 }
1670 return m->sq_item(s, i);
1671 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001674}
1675
1676PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001677PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001680
Victor Stinner71aea8e2016-08-19 16:59:55 +02001681 if (!s) {
1682 return null_error();
1683 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001686 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 PyObject *res;
1688 PyObject *slice = _PySlice_FromIndices(i1, i2);
1689 if (!slice)
1690 return NULL;
1691 res = mp->mp_subscript(s, slice);
1692 Py_DECREF(slice);
1693 return res;
1694 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001697}
1698
1699int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001700PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001701{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (s == NULL) {
1705 null_error();
1706 return -1;
1707 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 m = s->ob_type->tp_as_sequence;
1710 if (m && m->sq_ass_item) {
1711 if (i < 0) {
1712 if (m->sq_length) {
1713 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001714 if (l < 0) {
1715 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001717 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 i += l;
1719 }
1720 }
1721 return m->sq_ass_item(s, i, o);
1722 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 type_error("'%.200s' object does not support item assignment", s);
1725 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001726}
1727
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001728int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001729PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 if (s == NULL) {
1734 null_error();
1735 return -1;
1736 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 m = s->ob_type->tp_as_sequence;
1739 if (m && m->sq_ass_item) {
1740 if (i < 0) {
1741 if (m->sq_length) {
1742 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001743 if (l < 0) {
1744 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001746 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 i += l;
1748 }
1749 }
1750 return m->sq_ass_item(s, i, (PyObject *)NULL);
1751 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 type_error("'%.200s' object doesn't support item deletion", s);
1754 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001755}
1756
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001758PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 if (s == NULL) {
1763 null_error();
1764 return -1;
1765 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001768 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 int res;
1770 PyObject *slice = _PySlice_FromIndices(i1, i2);
1771 if (!slice)
1772 return -1;
1773 res = mp->mp_ass_subscript(s, slice, o);
1774 Py_DECREF(slice);
1775 return res;
1776 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 type_error("'%.200s' object doesn't support slice assignment", s);
1779 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001780}
1781
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001782int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001783PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 if (s == NULL) {
1788 null_error();
1789 return -1;
1790 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001793 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 int res;
1795 PyObject *slice = _PySlice_FromIndices(i1, i2);
1796 if (!slice)
1797 return -1;
1798 res = mp->mp_ass_subscript(s, slice, NULL);
1799 Py_DECREF(slice);
1800 return res;
1801 }
1802 type_error("'%.200s' object doesn't support slice deletion", s);
1803 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001804}
1805
Guido van Rossume15dee51995-07-18 14:12:02 +00001806PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001807PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 PyObject *it; /* iter(v) */
1810 Py_ssize_t n; /* guess for result tuple size */
1811 PyObject *result = NULL;
1812 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001813
Victor Stinner71aea8e2016-08-19 16:59:55 +02001814 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001816 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 /* Special-case the common tuple and list cases, for efficiency. */
1819 if (PyTuple_CheckExact(v)) {
1820 /* Note that we can't know whether it's safe to return
1821 a tuple *subclass* instance as-is, hence the restriction
1822 to exact tuples here. In contrast, lists always make
1823 a copy, so there's no need for exactness below. */
1824 Py_INCREF(v);
1825 return v;
1826 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001827 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 /* Get iterator. */
1831 it = PyObject_GetIter(v);
1832 if (it == NULL)
1833 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001836 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (n == -1)
1838 goto Fail;
1839 result = PyTuple_New(n);
1840 if (result == NULL)
1841 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 /* Fill the tuple. */
1844 for (j = 0; ; ++j) {
1845 PyObject *item = PyIter_Next(it);
1846 if (item == NULL) {
1847 if (PyErr_Occurred())
1848 goto Fail;
1849 break;
1850 }
1851 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00001852 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 /* The over-allocation strategy can grow a bit faster
1854 than for lists because unlike lists the
1855 over-allocation isn't permanent -- we reclaim
1856 the excess before the end of this routine.
1857 So, grow by ten and then add 25%.
1858 */
Martin Pantere8db8612016-07-25 02:30:05 +00001859 newn += 10u;
1860 newn += newn >> 2;
1861 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 /* Check for overflow */
1863 PyErr_NoMemory();
1864 Py_DECREF(item);
1865 goto Fail;
1866 }
Martin Pantere8db8612016-07-25 02:30:05 +00001867 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 if (_PyTuple_Resize(&result, n) != 0) {
1869 Py_DECREF(item);
1870 goto Fail;
1871 }
1872 }
1873 PyTuple_SET_ITEM(result, j, item);
1874 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 /* Cut tuple back if guess was too large. */
1877 if (j < n &&
1878 _PyTuple_Resize(&result, j) != 0)
1879 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 Py_DECREF(it);
1882 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001883
1884Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 Py_XDECREF(result);
1886 Py_DECREF(it);
1887 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001888}
1889
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001890PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001891PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 PyObject *result; /* result list */
1894 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001895
Victor Stinner71aea8e2016-08-19 16:59:55 +02001896 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001898 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 result = PyList_New(0);
1901 if (result == NULL)
1902 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 rv = _PyList_Extend((PyListObject *)result, v);
1905 if (rv == NULL) {
1906 Py_DECREF(result);
1907 return NULL;
1908 }
1909 Py_DECREF(rv);
1910 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001911}
1912
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001913PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001914PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001917
Victor Stinner71aea8e2016-08-19 16:59:55 +02001918 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001920 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1923 Py_INCREF(v);
1924 return v;
1925 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 it = PyObject_GetIter(v);
1928 if (it == NULL) {
1929 if (PyErr_ExceptionMatches(PyExc_TypeError))
1930 PyErr_SetString(PyExc_TypeError, m);
1931 return NULL;
1932 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 v = PySequence_List(it);
1935 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001938}
1939
Tim Peters16a77ad2001-09-08 04:00:12 +00001940/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1942 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1943 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001944 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1945*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001946Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001947_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 Py_ssize_t n;
1950 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1951 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 if (seq == NULL || obj == NULL) {
1954 null_error();
1955 return -1;
1956 }
Tim Peters75f8e352001-05-05 11:33:43 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 it = PyObject_GetIter(seq);
1959 if (it == NULL) {
1960 type_error("argument of type '%.200s' is not iterable", seq);
1961 return -1;
1962 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 n = wrapped = 0;
1965 for (;;) {
1966 int cmp;
1967 PyObject *item = PyIter_Next(it);
1968 if (item == NULL) {
1969 if (PyErr_Occurred())
1970 goto Fail;
1971 break;
1972 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1975 Py_DECREF(item);
1976 if (cmp < 0)
1977 goto Fail;
1978 if (cmp > 0) {
1979 switch (operation) {
1980 case PY_ITERSEARCH_COUNT:
1981 if (n == PY_SSIZE_T_MAX) {
1982 PyErr_SetString(PyExc_OverflowError,
1983 "count exceeds C integer size");
1984 goto Fail;
1985 }
1986 ++n;
1987 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 case PY_ITERSEARCH_INDEX:
1990 if (wrapped) {
1991 PyErr_SetString(PyExc_OverflowError,
1992 "index exceeds C integer size");
1993 goto Fail;
1994 }
1995 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 case PY_ITERSEARCH_CONTAINS:
1998 n = 1;
1999 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07002002 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 }
2004 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 if (operation == PY_ITERSEARCH_INDEX) {
2007 if (n == PY_SSIZE_T_MAX)
2008 wrapped = 1;
2009 ++n;
2010 }
2011 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 if (operation != PY_ITERSEARCH_INDEX)
2014 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 PyErr_SetString(PyExc_ValueError,
2017 "sequence.index(x): x not in sequence");
2018 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002019Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 n = -1;
2021 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002022Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 Py_DECREF(it);
2024 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002025
Guido van Rossume15dee51995-07-18 14:12:02 +00002026}
2027
Tim Peters16a77ad2001-09-08 04:00:12 +00002028/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002029Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002030PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002033}
2034
Tim Peterscb8d3682001-05-05 21:05:01 +00002035/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002036 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002037 */
2038int
2039PySequence_Contains(PyObject *seq, PyObject *ob)
2040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 Py_ssize_t result;
2042 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2043 if (sqm != NULL && sqm->sq_contains != NULL)
2044 return (*sqm->sq_contains)(seq, ob);
2045 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2046 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002047}
2048
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002049/* Backwards compatibility */
2050#undef PySequence_In
2051int
Fred Drake79912472000-07-09 04:06:11 +00002052PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002055}
2056
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002057Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002058PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002061}
2062
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002063/* Operations on mappings */
2064
2065int
Fred Drake79912472000-07-09 04:06:11 +00002066PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002067{
Benjamin Peterson21992272011-12-28 12:01:31 -06002068 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002070}
2071
Martin v. Löwis18e16552006-02-15 17:27:45 +00002072Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002073PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 if (o == NULL) {
2078 null_error();
2079 return -1;
2080 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 m = o->ob_type->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002083 if (m && m->mp_length) {
2084 Py_ssize_t len = m->mp_length(o);
2085 assert(len >= 0 || PyErr_Occurred());
2086 return len;
2087 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 type_error("object of type '%.200s' has no len()", o);
2090 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002091}
2092
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002093#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002094Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002095PyMapping_Length(PyObject *o)
2096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002098}
2099#define PyMapping_Length PyMapping_Size
2100
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002101PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002102PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002105
Victor Stinner71aea8e2016-08-19 16:59:55 +02002106 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002108 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 okey = PyUnicode_FromString(key);
2111 if (okey == NULL)
2112 return NULL;
2113 r = PyObject_GetItem(o, okey);
2114 Py_DECREF(okey);
2115 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002116}
2117
2118int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002119PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 PyObject *okey;
2122 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 if (key == NULL) {
2125 null_error();
2126 return -1;
2127 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 okey = PyUnicode_FromString(key);
2130 if (okey == NULL)
2131 return -1;
2132 r = PyObject_SetItem(o, okey, value);
2133 Py_DECREF(okey);
2134 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002135}
2136
2137int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002138PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 v = PyMapping_GetItemString(o, key);
2143 if (v) {
2144 Py_DECREF(v);
2145 return 1;
2146 }
2147 PyErr_Clear();
2148 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002149}
2150
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002151int
Fred Drake79912472000-07-09 04:06:11 +00002152PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 v = PyObject_GetItem(o, key);
2157 if (v) {
2158 Py_DECREF(v);
2159 return 1;
2160 }
2161 PyErr_Clear();
2162 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002163}
2164
Oren Milman0ccc0f62017-10-08 11:17:46 +03002165/* This function is quite similar to PySequence_Fast(), but specialized to be
2166 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2167 */
2168static PyObject *
2169method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2170{
2171 PyObject *it, *result, *meth_output;
2172
2173 assert(o != NULL);
2174 meth_output = _PyObject_CallMethodId(o, meth_id, NULL);
2175 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2176 return meth_output;
2177 }
2178 it = PyObject_GetIter(meth_output);
2179 if (it == NULL) {
2180 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2181 PyErr_Format(PyExc_TypeError,
2182 "%.200s.%U() returned a non-iterable (type %.200s)",
2183 Py_TYPE(o)->tp_name,
2184 meth_id->object,
2185 Py_TYPE(meth_output)->tp_name);
2186 }
2187 Py_DECREF(meth_output);
2188 return NULL;
2189 }
2190 Py_DECREF(meth_output);
2191 result = PySequence_List(it);
2192 Py_DECREF(it);
2193 return result;
2194}
2195
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002196PyObject *
2197PyMapping_Keys(PyObject *o)
2198{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002199 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002200
Oren Milman0ccc0f62017-10-08 11:17:46 +03002201 if (o == NULL) {
2202 return null_error();
2203 }
2204 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002206 }
2207 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002208}
2209
2210PyObject *
2211PyMapping_Items(PyObject *o)
2212{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002213 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002214
Oren Milman0ccc0f62017-10-08 11:17:46 +03002215 if (o == NULL) {
2216 return null_error();
2217 }
2218 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002220 }
2221 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002222}
2223
2224PyObject *
2225PyMapping_Values(PyObject *o)
2226{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002227 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002228
Oren Milman0ccc0f62017-10-08 11:17:46 +03002229 if (o == NULL) {
2230 return null_error();
2231 }
2232 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002234 }
2235 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002236}
2237
Guido van Rossum823649d2001-03-21 18:40:58 +00002238/* isinstance(), issubclass() */
2239
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002240/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002241 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002242 * 1. getattr(cls, '__bases__') could raise an AttributeError
2243 * 2. getattr(cls, '__bases__') could raise some other exception
2244 * 3. getattr(cls, '__bases__') could return a tuple
2245 * 4. getattr(cls, '__bases__') could return something other than a tuple
2246 *
2247 * Only state #3 is a non-error state and only it returns a non-NULL object
2248 * (it returns the retrieved tuple).
2249 *
2250 * Any raised AttributeErrors are masked by clearing the exception and
2251 * returning NULL. If an object other than a tuple comes out of __bases__,
2252 * then again, the return value is NULL. So yes, these two situations
2253 * produce exactly the same results: NULL is returned and no error is set.
2254 *
2255 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002257 * exception to be propagated along.
2258 *
2259 * Callers are expected to test for PyErr_Occurred() when the return value
2260 * is NULL to decide whether a valid exception should be propagated or not.
2261 * When there's no exception to propagate, it's customary for the caller to
2262 * set a TypeError.
2263 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002264static PyObject *
2265abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002266{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002267 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002271 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 Py_END_ALLOW_RECURSION
2273 if (bases == NULL) {
2274 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2275 PyErr_Clear();
2276 return NULL;
2277 }
2278 if (!PyTuple_Check(bases)) {
2279 Py_DECREF(bases);
2280 return NULL;
2281 }
2282 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002283}
2284
2285
2286static int
2287abstract_issubclass(PyObject *derived, PyObject *cls)
2288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *bases = NULL;
2290 Py_ssize_t i, n;
2291 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 while (1) {
2294 if (derived == cls)
2295 return 1;
2296 bases = abstract_get_bases(derived);
2297 if (bases == NULL) {
2298 if (PyErr_Occurred())
2299 return -1;
2300 return 0;
2301 }
2302 n = PyTuple_GET_SIZE(bases);
2303 if (n == 0) {
2304 Py_DECREF(bases);
2305 return 0;
2306 }
2307 /* Avoid recursivity in the single inheritance case */
2308 if (n == 1) {
2309 derived = PyTuple_GET_ITEM(bases, 0);
2310 Py_DECREF(bases);
2311 continue;
2312 }
2313 for (i = 0; i < n; i++) {
2314 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2315 if (r != 0)
2316 break;
2317 }
2318 Py_DECREF(bases);
2319 return r;
2320 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002321}
2322
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002323static int
2324check_class(PyObject *cls, const char *error)
2325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 PyObject *bases = abstract_get_bases(cls);
2327 if (bases == NULL) {
2328 /* Do not mask errors. */
2329 if (!PyErr_Occurred())
2330 PyErr_SetString(PyExc_TypeError, error);
2331 return 0;
2332 }
2333 Py_DECREF(bases);
2334 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002335}
2336
Brett Cannon4f653312004-03-20 22:52:14 +00002337static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002338recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002342 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 if (PyType_Check(cls)) {
2345 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2346 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002347 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002349 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002350 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002351 else
R. David Murray6bb99892010-11-20 16:33:30 +00002352 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 }
2354 else {
2355 if (c != (PyObject *)(inst->ob_type) &&
2356 PyType_Check(c))
2357 retval = PyType_IsSubtype(
2358 (PyTypeObject *)c,
2359 (PyTypeObject *)cls);
2360 Py_DECREF(c);
2361 }
2362 }
2363 }
2364 else {
2365 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002366 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002368 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002370 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002371 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002372 else
R. David Murray6bb99892010-11-20 16:33:30 +00002373 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 }
2375 else {
2376 retval = abstract_issubclass(icls, cls);
2377 Py_DECREF(icls);
2378 }
2379 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002382}
2383
2384int
Brett Cannon4f653312004-03-20 22:52:14 +00002385PyObject_IsInstance(PyObject *inst, PyObject *cls)
2386{
Benjamin Petersonce798522012-01-22 11:24:29 -05002387 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 /* Quick test for an exact match */
2391 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2392 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002393
Georg Brandl72b8a802014-10-03 09:26:37 +02002394 /* We know what type's __instancecheck__ does. */
2395 if (PyType_CheckExact(cls)) {
2396 return recursive_isinstance(inst, cls);
2397 }
2398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 if (PyTuple_Check(cls)) {
2400 Py_ssize_t i;
2401 Py_ssize_t n;
2402 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2405 return -1;
2406 n = PyTuple_GET_SIZE(cls);
2407 for (i = 0; i < n; ++i) {
2408 PyObject *item = PyTuple_GET_ITEM(cls, i);
2409 r = PyObject_IsInstance(inst, item);
2410 if (r != 0)
2411 /* either found it, or got an error */
2412 break;
2413 }
2414 Py_LeaveRecursiveCall();
2415 return r;
2416 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002417
Benjamin Petersonce798522012-01-22 11:24:29 -05002418 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 if (checker != NULL) {
2420 PyObject *res;
2421 int ok = -1;
2422 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2423 Py_DECREF(checker);
2424 return ok;
2425 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002426 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 Py_LeaveRecursiveCall();
2428 Py_DECREF(checker);
2429 if (res != NULL) {
2430 ok = PyObject_IsTrue(res);
2431 Py_DECREF(res);
2432 }
2433 return ok;
2434 }
2435 else if (PyErr_Occurred())
2436 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002437 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002439}
2440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002442recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002443{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 if (PyType_Check(cls) && PyType_Check(derived)) {
2445 /* Fast path (non-recursive) */
2446 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2447 }
2448 if (!check_class(derived,
2449 "issubclass() arg 1 must be a class"))
2450 return -1;
2451 if (!check_class(cls,
2452 "issubclass() arg 2 must be a class"
2453 " or tuple of classes"))
2454 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002457}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002458
Brett Cannon4f653312004-03-20 22:52:14 +00002459int
2460PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2461{
Benjamin Petersonce798522012-01-22 11:24:29 -05002462 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002464
Georg Brandl72b8a802014-10-03 09:26:37 +02002465 /* We know what type's __subclasscheck__ does. */
2466 if (PyType_CheckExact(cls)) {
2467 /* Quick test for an exact match */
2468 if (derived == cls)
2469 return 1;
2470 return recursive_issubclass(derived, cls);
2471 }
2472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (PyTuple_Check(cls)) {
2474 Py_ssize_t i;
2475 Py_ssize_t n;
2476 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2479 return -1;
2480 n = PyTuple_GET_SIZE(cls);
2481 for (i = 0; i < n; ++i) {
2482 PyObject *item = PyTuple_GET_ITEM(cls, i);
2483 r = PyObject_IsSubclass(derived, item);
2484 if (r != 0)
2485 /* either found it, or got an error */
2486 break;
2487 }
2488 Py_LeaveRecursiveCall();
2489 return r;
2490 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002491
Benjamin Petersonce798522012-01-22 11:24:29 -05002492 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 if (checker != NULL) {
2494 PyObject *res;
2495 int ok = -1;
2496 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2497 Py_DECREF(checker);
2498 return ok;
2499 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002500 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 Py_LeaveRecursiveCall();
2502 Py_DECREF(checker);
2503 if (res != NULL) {
2504 ok = PyObject_IsTrue(res);
2505 Py_DECREF(res);
2506 }
2507 return ok;
2508 }
2509 else if (PyErr_Occurred())
2510 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002511 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002512 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002513}
2514
2515int
2516_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002519}
2520
2521int
2522_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002525}
2526
2527
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002528PyObject *
2529PyObject_GetIter(PyObject *o)
2530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 PyTypeObject *t = o->ob_type;
Victor Stinner14e6d092016-12-09 17:08:59 +01002532 getiterfunc f;
2533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 f = t->tp_iter;
2535 if (f == NULL) {
2536 if (PySequence_Check(o))
2537 return PySeqIter_New(o);
2538 return type_error("'%.200s' object is not iterable", o);
2539 }
2540 else {
2541 PyObject *res = (*f)(o);
2542 if (res != NULL && !PyIter_Check(res)) {
2543 PyErr_Format(PyExc_TypeError,
2544 "iter() returned non-iterator "
2545 "of type '%.100s'",
2546 res->ob_type->tp_name);
2547 Py_DECREF(res);
2548 res = NULL;
2549 }
2550 return res;
2551 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002552}
2553
Tim Petersf4848da2001-05-05 00:14:56 +00002554/* Return next item.
2555 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2556 * If the iteration terminates normally, return NULL and clear the
2557 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2558 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002560 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002561PyObject *
2562PyIter_Next(PyObject *iter)
2563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 PyObject *result;
2565 result = (*iter->ob_type->tp_iternext)(iter);
2566 if (result == NULL &&
2567 PyErr_Occurred() &&
2568 PyErr_ExceptionMatches(PyExc_StopIteration))
2569 PyErr_Clear();
2570 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002571}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002572
2573
2574/*
2575 * Flatten a sequence of bytes() objects into a C array of
2576 * NULL terminated string pointers with a NULL char* terminating the array.
2577 * (ie: an argv or env list)
2578 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002579 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2580 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002581 */
2582char *const *
2583_PySequence_BytesToCharpArray(PyObject* self)
2584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 char **array;
2586 Py_ssize_t i, argc;
2587 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002588 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 argc = PySequence_Size(self);
2591 if (argc == -1)
2592 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002593
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002594 assert(argc >= 0);
2595
2596 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2597 PyErr_NoMemory();
2598 return NULL;
2599 }
2600
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002601 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 if (array == NULL) {
2603 PyErr_NoMemory();
2604 return NULL;
2605 }
2606 for (i = 0; i < argc; ++i) {
2607 char *data;
2608 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002609 if (item == NULL) {
2610 /* NULL terminate before freeing. */
2611 array[i] = NULL;
2612 goto fail;
2613 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002614 /* check for embedded null bytes */
2615 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 /* NULL terminate before freeing. */
2617 array[i] = NULL;
2618 goto fail;
2619 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002620 size = PyBytes_GET_SIZE(item) + 1;
2621 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 if (!array[i]) {
2623 PyErr_NoMemory();
2624 goto fail;
2625 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002626 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 Py_DECREF(item);
2628 }
2629 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002632
2633fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 Py_XDECREF(item);
2635 _Py_FreeCharPArray(array);
2636 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002637}
2638
2639
2640/* Free's a NULL terminated char** array of C strings. */
2641void
2642_Py_FreeCharPArray(char *const array[])
2643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 Py_ssize_t i;
2645 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002646 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002648 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002649}