blob: 44ed5b3932bf21658028fd3082639b3165d8d126 [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"
Maggie Moss1b4552c2020-09-09 13:23:24 -07004#include "pycore_unionobject.h" // _Py_UnionType && _Py_Union()
Victor Stinner4a21e572020-04-15 02:35:41 +02005#include "pycore_abstract.h" // _PyIndex_Check()
6#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
Victor Stinner61b64922020-06-23 15:55:06 +02007#include "pycore_pyerrors.h" // _PyErr_Occurred()
Victor Stinner4a21e572020-04-15 02:35:41 +02008#include "pycore_pystate.h" // _PyThreadState_GET()
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00009#include <ctype.h>
Victor Stinner4a21e572020-04-15 02:35:41 +020010#include <stddef.h> // offsetof()
Tim Peters64b5ce32001-09-10 20:52:51 +000011#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +000012
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000013
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000014
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000015/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000016
17static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000019{
Victor Stinner0d76d2b2020-02-07 01:53:23 +010020 PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000021 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000022}
23
Guido van Rossum052b7e11996-11-11 15:08:19 +000024static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000025null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000026{
Victor Stinner61b64922020-06-23 15:55:06 +020027 PyThreadState *tstate = _PyThreadState_GET();
28 if (!_PyErr_Occurred(tstate)) {
29 _PyErr_SetString(tstate, PyExc_SystemError,
30 "null argument to internal routine");
31 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000033}
34
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000035/* Operations on any object */
36
Guido van Rossume15dee51995-07-18 14:12:02 +000037PyObject *
Fred Drake79912472000-07-09 04:06:11 +000038PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000041
Victor Stinner71aea8e2016-08-19 16:59:55 +020042 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020044 }
45
Victor Stinner0d76d2b2020-02-07 01:53:23 +010046 v = (PyObject *)Py_TYPE(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 Py_INCREF(v);
48 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000049}
50
Martin v. Löwis18e16552006-02-15 17:27:45 +000051Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000052PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 if (o == NULL) {
57 null_error();
58 return -1;
59 }
Guido van Rossume15dee51995-07-18 14:12:02 +000060
Victor Stinner0d76d2b2020-02-07 01:53:23 +010061 m = Py_TYPE(o)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +030062 if (m && m->sq_length) {
63 Py_ssize_t len = m->sq_length(o);
64 assert(len >= 0 || PyErr_Occurred());
65 return len;
66 }
Guido van Rossume15dee51995-07-18 14:12:02 +000067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000069}
70
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000071#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000072Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000073PyObject_Length(PyObject *o)
74{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000076}
77#define PyObject_Length PyObject_Size
78
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020079int
80_PyObject_HasLen(PyObject *o) {
81 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
82 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
83}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000084
Christian Heimes255f53b2007-12-08 15:33:56 +000085/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020086 or o.__length_hint__(). If those methods aren't found the defaultvalue is
87 returned. If one of the calls fails with an exception other than TypeError
88 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000089*/
90
91Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020092PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000093{
Christian Heimesb70e8a12012-10-06 17:16:39 +020094 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020095 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050096 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030097 if (_PyObject_HasLen(o)) {
98 res = PyObject_Length(o);
Serhiy Storchaka813f9432017-04-16 09:21:44 +030099 if (res < 0) {
Victor Stinner61b64922020-06-23 15:55:06 +0200100 PyThreadState *tstate = _PyThreadState_GET();
101 assert(_PyErr_Occurred(tstate));
102 if (!_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300103 return -1;
104 }
Victor Stinner61b64922020-06-23 15:55:06 +0200105 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200106 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300107 else {
108 return res;
109 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 }
Christian Heimes6314d162012-10-06 17:13:29 +0200111 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200112 if (hint == NULL) {
113 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200115 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 return defaultvalue;
117 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100118 result = _PyObject_CallNoArg(hint);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200119 Py_DECREF(hint);
120 if (result == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200121 PyThreadState *tstate = _PyThreadState_GET();
122 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
123 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200124 return defaultvalue;
125 }
126 return -1;
127 }
128 else if (result == Py_NotImplemented) {
129 Py_DECREF(result);
130 return defaultvalue;
131 }
132 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200133 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200134 Py_TYPE(result)->tp_name);
135 Py_DECREF(result);
136 return -1;
137 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200138 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200139 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200140 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200141 return -1;
142 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200143 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200144 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
145 return -1;
146 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200147 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000148}
149
Guido van Rossume15dee51995-07-18 14:12:02 +0000150PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000151PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 PyMappingMethods *m;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000154 PySequenceMethods *ms;
Guido van Rossume15dee51995-07-18 14:12:02 +0000155
Victor Stinner71aea8e2016-08-19 16:59:55 +0200156 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200158 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000159
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100160 m = Py_TYPE(o)->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100161 if (m && m->mp_subscript) {
162 PyObject *item = m->mp_subscript(o, key);
163 assert((item != NULL) ^ (PyErr_Occurred() != NULL));
164 return item;
165 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000166
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100167 ms = Py_TYPE(o)->tp_as_sequence;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000168 if (ms && ms->sq_item) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200169 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 Py_ssize_t key_value;
171 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
172 if (key_value == -1 && PyErr_Occurred())
173 return NULL;
174 return PySequence_GetItem(o, key_value);
175 }
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000176 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 return type_error("sequence index must "
178 "be integer, not '%.200s'", key);
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000179 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000181
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100182 if (PyType_Check(o)) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200183 PyObject *meth, *result;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100184 _Py_IDENTIFIER(__class_getitem__);
Victor Stinnera15e2602020-04-08 02:01:56 +0200185
Guido van Rossum48b069a2020-04-07 09:50:06 -0700186 // Special case type[int], but disallow other types so str[int] fails
187 if ((PyTypeObject*)o == &PyType_Type) {
188 return Py_GenericAlias(o, key);
189 }
190
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200191 if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) {
192 return NULL;
193 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100194 if (meth) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100195 result = PyObject_CallOneArg(meth, key);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100196 Py_DECREF(meth);
197 return result;
198 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100199 }
200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000202}
203
204int
Fred Drake79912472000-07-09 04:06:11 +0000205PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 if (o == NULL || key == NULL || value == NULL) {
210 null_error();
211 return -1;
212 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100213 m = Py_TYPE(o)->tp_as_mapping;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 if (m && m->mp_ass_subscript)
215 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000216
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100217 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200218 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 Py_ssize_t key_value;
220 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
221 if (key_value == -1 && PyErr_Occurred())
222 return -1;
223 return PySequence_SetItem(o, key_value, value);
224 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100225 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 type_error("sequence index must be "
227 "integer, not '%.200s'", key);
228 return -1;
229 }
230 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 type_error("'%.200s' object does not support item assignment", o);
233 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000234}
235
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000236int
Fred Drake79912472000-07-09 04:06:11 +0000237PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 if (o == NULL || key == NULL) {
242 null_error();
243 return -1;
244 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100245 m = Py_TYPE(o)->tp_as_mapping;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 if (m && m->mp_ass_subscript)
247 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000248
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100249 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200250 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_ssize_t key_value;
252 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
253 if (key_value == -1 && PyErr_Occurred())
254 return -1;
255 return PySequence_DelItem(o, key_value);
256 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100257 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 type_error("sequence index must be "
259 "integer, not '%.200s'", key);
260 return -1;
261 }
262 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 type_error("'%.200s' object does not support item deletion", o);
265 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000266}
267
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000268int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300269PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyObject *okey;
272 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 if (o == NULL || key == NULL) {
275 null_error();
276 return -1;
277 }
278 okey = PyUnicode_FromString(key);
279 if (okey == NULL)
280 return -1;
281 ret = PyObject_DelItem(o, okey);
282 Py_DECREF(okey);
283 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000284}
285
Victor Stinneref5c6152020-04-08 01:13:53 +0200286
287/* Return 1 if the getbuffer function is available, otherwise return 0. */
288int
289PyObject_CheckBuffer(PyObject *obj)
290{
291 PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
292 return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
293}
294
295
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000296/* Buffer C-API for Python 3.0 */
297
298int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000299PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000300{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100301 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200302
303 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400305 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_TYPE(obj)->tp_name);
307 return -1;
308 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200309 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000310}
311
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000312static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100313_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 Py_ssize_t sd, dim;
316 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000317
Stefan Krah363af442015-02-01 14:53:54 +0100318 /* 1) len = product(shape) * itemsize
319 2) itemsize > 0
320 3) len = 0 <==> exists i: shape[i] = 0 */
321 if (view->len == 0) return 1;
322 if (view->strides == NULL) { /* C-contiguous by definition */
323 /* Trivially F-contiguous */
324 if (view->ndim <= 1) return 1;
325
326 /* ndim > 1 implies shape != NULL */
327 assert(view->shape != NULL);
328
329 /* Effectively 1-d */
330 sd = 0;
331 for (i=0; i<view->ndim; i++) {
332 if (view->shape[i] > 1) sd += 1;
333 }
334 return sd <= 1;
335 }
336
337 /* strides != NULL implies both of these */
338 assert(view->ndim > 0);
339 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 for (i=0; i<view->ndim; i++) {
343 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100344 if (dim > 1 && view->strides[i] != sd) {
345 return 0;
346 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 sd *= dim;
348 }
349 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000350}
351
352static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100353_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000354{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 Py_ssize_t sd, dim;
356 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000357
Stefan Krah363af442015-02-01 14:53:54 +0100358 /* 1) len = product(shape) * itemsize
359 2) itemsize > 0
360 3) len = 0 <==> exists i: shape[i] = 0 */
361 if (view->len == 0) return 1;
362 if (view->strides == NULL) return 1; /* C-contiguous by definition */
363
364 /* strides != NULL implies both of these */
365 assert(view->ndim > 0);
366 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 for (i=view->ndim-1; i>=0; i--) {
370 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100371 if (dim > 1 && view->strides[i] != sd) {
372 return 0;
373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 sd *= dim;
375 }
376 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000377}
378
379int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100380PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000381{
382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000384
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100385 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100387 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100389 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return (_IsCContiguous(view) || _IsFortranContiguous(view));
391 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000392}
393
394
Guido van Rossum98297ee2007-11-06 21:34:58 +0000395void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000396PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 char* pointer;
399 int i;
400 pointer = (char *)view->buf;
401 for (i = 0; i < view->ndim; i++) {
402 pointer += view->strides[i]*indices[i];
403 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
404 pointer = *((char**)pointer) + view->suboffsets[i];
405 }
406 }
407 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000408}
409
410
Guido van Rossum98297ee2007-11-06 21:34:58 +0000411void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000412_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 +0000413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 for (k=0; k<nd; k++) {
417 if (index[k] < shape[k]-1) {
418 index[k]++;
419 break;
420 }
421 else {
422 index[k] = 0;
423 }
424 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000425}
426
Guido van Rossum98297ee2007-11-06 21:34:58 +0000427void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000428_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 +0000429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 for (k=nd-1; k>=0; k--) {
433 if (index[k] < shape[k]-1) {
434 index[k]++;
435 break;
436 }
437 else {
438 index[k] = 0;
439 }
440 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000441}
442
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300443Py_ssize_t
444PyBuffer_SizeFromFormat(const char *format)
445{
446 PyObject *structmodule = NULL;
447 PyObject *calcsize = NULL;
448 PyObject *res = NULL;
449 PyObject *fmt = NULL;
450 Py_ssize_t itemsize = -1;
451
452 structmodule = PyImport_ImportModule("struct");
453 if (structmodule == NULL) {
454 return itemsize;
455 }
456
457 calcsize = PyObject_GetAttrString(structmodule, "calcsize");
458 if (calcsize == NULL) {
459 goto done;
460 }
461
462 fmt = PyUnicode_FromString(format);
463 if (fmt == NULL) {
464 goto done;
465 }
466
467 res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
468 if (res == NULL) {
469 goto done;
470 }
471
472 itemsize = PyLong_AsSsize_t(res);
473 if (itemsize < 0) {
474 goto done;
475 }
476
477done:
478 Py_DECREF(structmodule);
479 Py_XDECREF(calcsize);
480 Py_XDECREF(fmt);
481 Py_XDECREF(res);
482 return itemsize;
483}
484
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000485int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000486PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000489 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 Py_ssize_t *indices, elements;
491 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 if (len > view->len) {
494 len = view->len;
495 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 if (PyBuffer_IsContiguous(view, fort)) {
498 /* simplest copy is all that is needed */
499 memcpy(view->buf, buf, len);
500 return 0;
501 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000504
Stefan Krah7213fcc2015-02-01 16:19:23 +0100505 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
507 if (indices == NULL) {
508 PyErr_NoMemory();
509 return -1;
510 }
511 for (k=0; k<view->ndim;k++) {
512 indices[k] = 0;
513 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000516 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
518 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000519 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 }
521 src = buf;
522 /* XXX : This is not going to be the fastest code in the world
523 several optimizations are possible.
524 */
525 elements = len / view->itemsize;
526 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 ptr = PyBuffer_GetPointer(view, indices);
528 memcpy(ptr, src, view->itemsize);
529 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100530 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 PyMem_Free(indices);
534 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000535}
536
Guido van Rossum98297ee2007-11-06 21:34:58 +0000537int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 Py_buffer view_dest, view_src;
540 int k;
541 Py_ssize_t *indices, elements;
542 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 if (!PyObject_CheckBuffer(dest) ||
545 !PyObject_CheckBuffer(src)) {
546 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400547 "both destination and source must be "\
548 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 return -1;
550 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
553 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
554 PyBuffer_Release(&view_dest);
555 return -1;
556 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (view_dest.len < view_src.len) {
559 PyErr_SetString(PyExc_BufferError,
560 "destination is too small to receive data from source");
561 PyBuffer_Release(&view_dest);
562 PyBuffer_Release(&view_src);
563 return -1;
564 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
567 PyBuffer_IsContiguous(&view_src, 'C')) ||
568 (PyBuffer_IsContiguous(&view_dest, 'F') &&
569 PyBuffer_IsContiguous(&view_src, 'F'))) {
570 /* simplest copy is all that is needed */
571 memcpy(view_dest.buf, view_src.buf, view_src.len);
572 PyBuffer_Release(&view_dest);
573 PyBuffer_Release(&view_src);
574 return 0;
575 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* XXX(nnorwitz): need to check for overflow! */
580 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
581 if (indices == NULL) {
582 PyErr_NoMemory();
583 PyBuffer_Release(&view_dest);
584 PyBuffer_Release(&view_src);
585 return -1;
586 }
587 for (k=0; k<view_src.ndim;k++) {
588 indices[k] = 0;
589 }
590 elements = 1;
591 for (k=0; k<view_src.ndim; k++) {
592 /* XXX(nnorwitz): can this overflow? */
593 elements *= view_src.shape[k];
594 }
595 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000596 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 dptr = PyBuffer_GetPointer(&view_dest, indices);
598 sptr = PyBuffer_GetPointer(&view_src, indices);
599 memcpy(dptr, sptr, view_src.itemsize);
600 }
601 PyMem_Free(indices);
602 PyBuffer_Release(&view_dest);
603 PyBuffer_Release(&view_src);
604 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000605}
606
607void
608PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 Py_ssize_t *strides, int itemsize,
610 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 int k;
613 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 sd = itemsize;
616 if (fort == 'F') {
617 for (k=0; k<nd; k++) {
618 strides[k] = sd;
619 sd *= shape[k];
620 }
621 }
622 else {
623 for (k=nd-1; k>=0; k--) {
624 strides[k] = sd;
625 sd *= shape[k];
626 }
627 }
628 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000629}
630
631int
Martin v. Löwis423be952008-08-13 15:53:07 +0000632PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100633 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000634{
Stefan Krah5178d912015-02-03 16:57:21 +0100635 if (view == NULL) {
636 PyErr_SetString(PyExc_BufferError,
Victor Stinner61b64922020-06-23 15:55:06 +0200637 "PyBuffer_FillInfo: view==NULL argument is obsolete");
Stefan Krah5178d912015-02-03 16:57:21 +0100638 return -1;
639 }
640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
642 (readonly == 1)) {
643 PyErr_SetString(PyExc_BufferError,
644 "Object is not writable.");
645 return -1;
646 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 view->obj = obj;
649 if (obj)
650 Py_INCREF(obj);
651 view->buf = buf;
652 view->len = len;
653 view->readonly = readonly;
654 view->itemsize = 1;
655 view->format = NULL;
656 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
657 view->format = "B";
658 view->ndim = 1;
659 view->shape = NULL;
660 if ((flags & PyBUF_ND) == PyBUF_ND)
661 view->shape = &(view->len);
662 view->strides = NULL;
663 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
664 view->strides = &(view->itemsize);
665 view->suboffsets = NULL;
666 view->internal = NULL;
667 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000668}
669
Martin v. Löwis423be952008-08-13 15:53:07 +0000670void
671PyBuffer_Release(Py_buffer *view)
672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200674 PyBufferProcs *pb;
675 if (obj == NULL)
676 return;
677 pb = Py_TYPE(obj)->tp_as_buffer;
678 if (pb && pb->bf_releasebuffer)
679 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200681 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000682}
683
Eric Smith8fd3eba2008-02-17 19:48:00 +0000684PyObject *
685PyObject_Format(PyObject *obj, PyObject *format_spec)
686{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000687 PyObject *meth;
688 PyObject *empty = NULL;
689 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500690 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000691
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300692 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
693 PyErr_Format(PyExc_SystemError,
694 "Format specifier must be a string, not %.200s",
695 Py_TYPE(format_spec)->tp_name);
696 return NULL;
697 }
698
699 /* Fast path for common types. */
700 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
701 if (PyUnicode_CheckExact(obj)) {
702 Py_INCREF(obj);
703 return obj;
704 }
705 if (PyLong_CheckExact(obj)) {
706 return PyObject_Str(obj);
707 }
708 }
709
Eric Smith8fd3eba2008-02-17 19:48:00 +0000710 /* If no format_spec is provided, use an empty string */
711 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100712 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000713 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000714 }
715
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300716 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500717 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000718 if (meth == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200719 PyThreadState *tstate = _PyThreadState_GET();
720 if (!_PyErr_Occurred(tstate)) {
721 _PyErr_Format(tstate, PyExc_TypeError,
722 "Type %.100s doesn't define __format__",
723 Py_TYPE(obj)->tp_name);
724 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000726 }
727
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000728 /* And call it. */
Petr Viktorinffd97532020-02-11 17:46:57 +0100729 result = PyObject_CallOneArg(meth, format_spec);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000730 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000731
732 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800733 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +0200734 "__format__ must return a str, not %.200s",
735 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000736 Py_DECREF(result);
737 result = NULL;
738 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000739 }
740
741done:
742 Py_XDECREF(empty);
743 return result;
744}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000745/* Operations on numbers */
746
747int
Fred Drake79912472000-07-09 04:06:11 +0000748PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000749{
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300750 if (o == NULL)
751 return 0;
752 PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
753 return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
Guido van Rossume15dee51995-07-18 14:12:02 +0000754}
755
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000756/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000757
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000758#define NB_SLOT(x) offsetof(PyNumberMethods, x)
759#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000763
764/*
765 Calling scheme used for binary operations:
766
Neal Norwitz4886cc32006-08-21 17:06:07 +0000767 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000769
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100770 [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
771 Py_TYPE(v)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000772 */
773
774static PyObject *
775binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 PyObject *x;
778 binaryfunc slotv = NULL;
779 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000780
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100781 if (Py_TYPE(v)->tp_as_number != NULL)
782 slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
Andy Lester55728702020-03-06 16:53:17 -0600783 if (!Py_IS_TYPE(w, Py_TYPE(v)) &&
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100784 Py_TYPE(w)->tp_as_number != NULL) {
785 slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000786 if (slotw == slotv)
787 slotw = NULL;
788 }
789 if (slotv) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100790 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 x = slotw(v, w);
792 if (x != Py_NotImplemented)
793 return x;
794 Py_DECREF(x); /* can't do it */
795 slotw = NULL;
796 }
797 x = slotv(v, w);
798 if (x != Py_NotImplemented)
799 return x;
800 Py_DECREF(x); /* can't do it */
801 }
802 if (slotw) {
803 x = slotw(v, w);
804 if (x != Py_NotImplemented)
805 return x;
806 Py_DECREF(x); /* can't do it */
807 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500808 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000809}
Guido van Rossum77660912002-04-16 16:32:50 +0000810
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000811static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000812binop_type_error(PyObject *v, PyObject *w, const char *op_name)
813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 PyErr_Format(PyExc_TypeError,
815 "unsupported operand type(s) for %.100s: "
816 "'%.100s' and '%.100s'",
817 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100818 Py_TYPE(v)->tp_name,
819 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000821}
822
823static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000824binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 PyObject *result = binary_op1(v, w, op_slot);
827 if (result == Py_NotImplemented) {
828 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530829
830 if (op_slot == NB_SLOT(nb_rshift) &&
scoder4c9ea092020-05-12 16:12:41 +0200831 PyCFunction_CheckExact(v) &&
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530832 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
833 {
834 PyErr_Format(PyExc_TypeError,
835 "unsupported operand type(s) for %.100s: "
836 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530837 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530838 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100839 Py_TYPE(v)->tp_name,
840 Py_TYPE(w)->tp_name);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530841 return NULL;
842 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 return binop_type_error(v, w, op_name);
844 }
845 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000846}
847
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000848
849/*
850 Calling scheme used for ternary operations:
851
Neal Norwitz4886cc32006-08-21 17:06:07 +0000852 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000854 */
855
856static PyObject *
857ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 PyObject *w,
859 PyObject *z,
860 const int op_slot,
861 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 PyNumberMethods *mv, *mw, *mz;
864 PyObject *x = NULL;
865 ternaryfunc slotv = NULL;
866 ternaryfunc slotw = NULL;
867 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000868
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100869 mv = Py_TYPE(v)->tp_as_number;
870 mw = Py_TYPE(w)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 if (mv != NULL)
872 slotv = NB_TERNOP(mv, op_slot);
Andy Lester55728702020-03-06 16:53:17 -0600873 if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 slotw = NB_TERNOP(mw, op_slot);
875 if (slotw == slotv)
876 slotw = NULL;
877 }
878 if (slotv) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100879 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 x = slotw(v, w, z);
881 if (x != Py_NotImplemented)
882 return x;
883 Py_DECREF(x); /* can't do it */
884 slotw = NULL;
885 }
886 x = slotv(v, w, z);
887 if (x != Py_NotImplemented)
888 return x;
889 Py_DECREF(x); /* can't do it */
890 }
891 if (slotw) {
892 x = slotw(v, w, z);
893 if (x != Py_NotImplemented)
894 return x;
895 Py_DECREF(x); /* can't do it */
896 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100897 mz = Py_TYPE(z)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 if (mz != NULL) {
899 slotz = NB_TERNOP(mz, op_slot);
900 if (slotz == slotv || slotz == slotw)
901 slotz = NULL;
902 if (slotz) {
903 x = slotz(v, w, z);
904 if (x != Py_NotImplemented)
905 return x;
906 Py_DECREF(x); /* can't do it */
907 }
908 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 if (z == Py_None)
911 PyErr_Format(
912 PyExc_TypeError,
913 "unsupported operand type(s) for ** or pow(): "
914 "'%.100s' and '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100915 Py_TYPE(v)->tp_name,
916 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 else
918 PyErr_Format(
919 PyExc_TypeError,
920 "unsupported operand type(s) for pow(): "
921 "'%.100s', '%.100s', '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100922 Py_TYPE(v)->tp_name,
923 Py_TYPE(w)->tp_name,
924 Py_TYPE(z)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000926}
927
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000928#define BINARY_FUNC(func, op, op_name) \
929 PyObject * \
930 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000932 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000933
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000934BINARY_FUNC(PyNumber_Or, nb_or, "|")
935BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
936BINARY_FUNC(PyNumber_And, nb_and, "&")
937BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
938BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
939BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000940BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000941
942PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000943PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
946 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100947 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 Py_DECREF(result);
949 if (m && m->sq_concat) {
950 return (*m->sq_concat)(v, w);
951 }
952 result = binop_type_error(v, w, "+");
953 }
954 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000955}
956
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000957static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000958sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000959{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 Py_ssize_t count;
Victor Stinnera15e2602020-04-08 02:01:56 +0200961 if (_PyIndex_Check(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
963 if (count == -1 && PyErr_Occurred())
964 return NULL;
965 }
966 else {
967 return type_error("can't multiply sequence by "
968 "non-int of type '%.200s'", n);
969 }
970 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000971}
972
973PyObject *
974PyNumber_Multiply(PyObject *v, PyObject *w)
975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
977 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100978 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
979 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 Py_DECREF(result);
981 if (mv && mv->sq_repeat) {
982 return sequence_repeat(mv->sq_repeat, v, w);
983 }
984 else if (mw && mw->sq_repeat) {
985 return sequence_repeat(mw->sq_repeat, w, v);
986 }
987 result = binop_type_error(v, w, "*");
988 }
989 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000990}
991
Guido van Rossume15dee51995-07-18 14:12:02 +0000992PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -0400993PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
994{
995 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
996}
997
998PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000999PyNumber_FloorDivide(PyObject *v, PyObject *w)
1000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001002}
1003
1004PyObject *
1005PyNumber_TrueDivide(PyObject *v, PyObject *w)
1006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001008}
1009
1010PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001011PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001014}
1015
1016PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001017PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001020}
1021
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001022/* Binary in-place operators */
1023
1024/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001025 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001026
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001027 - If the left hand object has the appropriate struct members, and
1028 they are filled, call the appropriate function and return the
1029 result. No coercion is done on the arguments; the left-hand object
1030 is the one the operation is performed on, and it's up to the
1031 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001032
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001033 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001034 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001035
1036 */
1037
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001038static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001039binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001040{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001041 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 if (mv != NULL) {
1043 binaryfunc slot = NB_BINOP(mv, iop_slot);
1044 if (slot) {
1045 PyObject *x = (slot)(v, w);
1046 if (x != Py_NotImplemented) {
1047 return x;
1048 }
1049 Py_DECREF(x);
1050 }
1051 }
1052 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001053}
1054
1055static PyObject *
1056binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1060 if (result == Py_NotImplemented) {
1061 Py_DECREF(result);
1062 return binop_type_error(v, w, op_name);
1063 }
1064 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001065}
1066
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001067#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 PyObject * \
1069 func(PyObject *v, PyObject *w) { \
1070 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1071 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001072
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001073INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1074INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1075INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1076INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1077INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1078INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001079INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001080
1081PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001082PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1085 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001086}
1087
1088PyObject *
1089PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1092 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001093}
1094
1095PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001096PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1099 NB_SLOT(nb_add));
1100 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001101 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 Py_DECREF(result);
1103 if (m != NULL) {
1104 binaryfunc f = NULL;
1105 f = m->sq_inplace_concat;
1106 if (f == NULL)
1107 f = m->sq_concat;
1108 if (f != NULL)
1109 return (*f)(v, w);
1110 }
1111 result = binop_type_error(v, w, "+=");
1112 }
1113 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001114}
1115
1116PyObject *
1117PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1120 NB_SLOT(nb_multiply));
1121 if (result == Py_NotImplemented) {
1122 ssizeargfunc f = NULL;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001123 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1124 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 Py_DECREF(result);
1126 if (mv != NULL) {
1127 f = mv->sq_inplace_repeat;
1128 if (f == NULL)
1129 f = mv->sq_repeat;
1130 if (f != NULL)
1131 return sequence_repeat(f, v, w);
1132 }
1133 else if (mw != NULL) {
1134 /* Note that the right hand operand should not be
1135 * mutated in this case so sq_inplace_repeat is not
1136 * used. */
1137 if (mw->sq_repeat)
1138 return sequence_repeat(mw->sq_repeat, w, v);
1139 }
1140 result = binop_type_error(v, w, "*=");
1141 }
1142 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001143}
1144
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001145PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001146PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1147{
1148 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1149 NB_SLOT(nb_matrix_multiply), "@=");
1150}
1151
1152PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001153PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1154{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1156 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001157}
1158
1159PyObject *
1160PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1161{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001162 if (Py_TYPE(v)->tp_as_number &&
1163 Py_TYPE(v)->tp_as_number->nb_inplace_power != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1165 }
1166 else {
1167 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1168 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001169}
1170
1171
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001172/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001173
1174PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001175PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001178
Victor Stinner71aea8e2016-08-19 16:59:55 +02001179 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001181 }
1182
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001183 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (m && m->nb_negative)
1185 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001188}
1189
1190PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001191PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001194
Victor Stinner71aea8e2016-08-19 16:59:55 +02001195 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001197 }
1198
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001199 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 if (m && m->nb_positive)
1201 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001204}
1205
1206PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001207PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001210
Victor Stinner71aea8e2016-08-19 16:59:55 +02001211 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001213 }
1214
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001215 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 if (m && m->nb_invert)
1217 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001220}
1221
1222PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001223PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001226
Victor Stinner71aea8e2016-08-19 16:59:55 +02001227 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001229 }
1230
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001231 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 if (m && m->nb_absolute)
1233 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001236}
1237
Victor Stinnera15e2602020-04-08 02:01:56 +02001238
Christian Tismerea62ce72018-06-09 20:32:25 +02001239int
1240PyIndex_Check(PyObject *obj)
1241{
Victor Stinnera15e2602020-04-08 02:01:56 +02001242 return _PyIndex_Check(obj);
Christian Tismerea62ce72018-06-09 20:32:25 +02001243}
1244
Victor Stinnera15e2602020-04-08 02:01:56 +02001245
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001246/* Return a Python int from the object item.
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001247 Can return an instance of int subclass.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001248 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001249 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001250*/
1251PyObject *
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001252_PyNumber_Index(PyObject *item)
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 PyObject *result = NULL;
Victor Stinner71aea8e2016-08-19 16:59:55 +02001255 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001257 }
1258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 if (PyLong_Check(item)) {
1260 Py_INCREF(item);
1261 return item;
1262 }
Victor Stinnera15e2602020-04-08 02:01:56 +02001263 if (!_PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 PyErr_Format(PyExc_TypeError,
1265 "'%.200s' object cannot be interpreted "
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001266 "as an integer", Py_TYPE(item)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001267 return NULL;
1268 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001269 result = Py_TYPE(item)->tp_as_number->nb_index(item);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001270 if (!result || PyLong_CheckExact(result))
1271 return result;
1272 if (!PyLong_Check(result)) {
1273 PyErr_Format(PyExc_TypeError,
1274 "__index__ returned non-int (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001275 Py_TYPE(result)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001276 Py_DECREF(result);
1277 return NULL;
1278 }
1279 /* Issue #17576: warn if 'result' not of exact type int. */
1280 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1281 "__index__ returned non-int (type %.200s). "
1282 "The ability to return an instance of a strict subclass of int "
1283 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001284 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001285 Py_DECREF(result);
1286 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
1288 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001289}
1290
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001291/* Return an exact Python int from the object item.
1292 Raise TypeError if the result is not an int
1293 or if the object cannot be interpreted as an index.
1294*/
1295PyObject *
1296PyNumber_Index(PyObject *item)
1297{
1298 PyObject *result = _PyNumber_Index(item);
1299 if (result != NULL && !PyLong_CheckExact(result)) {
1300 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1301 }
1302 return result;
1303}
1304
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001305/* Return an error on Overflow only if err is not NULL*/
1306
1307Py_ssize_t
1308PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 Py_ssize_t result;
1311 PyObject *runerr;
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001312 PyObject *value = _PyNumber_Index(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 if (value == NULL)
1314 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 /* We're done if PyLong_AsSsize_t() returns without error. */
1317 result = PyLong_AsSsize_t(value);
Victor Stinner61b64922020-06-23 15:55:06 +02001318 if (result != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001320
Victor Stinner61b64922020-06-23 15:55:06 +02001321 PyThreadState *tstate = _PyThreadState_GET();
1322 runerr = _PyErr_Occurred(tstate);
1323 if (!runerr) {
1324 goto finish;
1325 }
1326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 /* Error handling code -- only manage OverflowError differently */
Victor Stinner61b64922020-06-23 15:55:06 +02001328 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 goto finish;
Victor Stinner61b64922020-06-23 15:55:06 +02001330 }
1331 _PyErr_Clear(tstate);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 /* If no error-handling desired then the default clipping
Victor Stinner61b64922020-06-23 15:55:06 +02001334 is sufficient. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if (!err) {
1336 assert(PyLong_Check(value));
1337 /* Whether or not it is less than or equal to
1338 zero is determined by the sign of ob_size
1339 */
1340 if (_PyLong_Sign(value) < 0)
1341 result = PY_SSIZE_T_MIN;
1342 else
1343 result = PY_SSIZE_T_MAX;
1344 }
1345 else {
1346 /* Otherwise replace the error with caller's error object. */
Victor Stinner61b64922020-06-23 15:55:06 +02001347 _PyErr_Format(tstate, err,
1348 "cannot fit '%.200s' into an index-sized integer",
1349 Py_TYPE(item)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001351
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001352 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 Py_DECREF(value);
1354 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001355}
1356
1357
Guido van Rossume15dee51995-07-18 14:12:02 +00001358PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001359PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001360{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001361 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001364 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001365 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001366
Victor Stinner71aea8e2016-08-19 16:59:55 +02001367 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001369 }
1370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 if (PyLong_CheckExact(o)) {
1372 Py_INCREF(o);
1373 return o;
1374 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001375 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001377 /* Convert using the nb_int slot, which should return something
1378 of exact type int. */
1379 result = m->nb_int(o);
1380 if (!result || PyLong_CheckExact(result))
1381 return result;
1382 if (!PyLong_Check(result)) {
1383 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +02001384 "__int__ returned non-int (type %.200s)",
Victor Stinner8182cc22020-07-10 12:40:38 +02001385 Py_TYPE(result)->tp_name);
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001386 Py_DECREF(result);
1387 return NULL;
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001388 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001389 /* Issue #17576: warn if 'result' not of exact type int. */
1390 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1391 "__int__ returned non-int (type %.200s). "
1392 "The ability to return an instance of a strict subclass of int "
1393 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner8182cc22020-07-10 12:40:38 +02001394 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001395 Py_DECREF(result);
1396 return NULL;
1397 }
1398 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001399 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 }
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001401 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001402 return PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001403 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001404 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001406 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001408 if (result == NULL || PyLong_CheckExact(result)) {
1409 return result;
1410 }
1411 if (PyLong_Check(result)) {
1412 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1413 return result;
1414 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001416 but int() needs to return an int. */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001417 if (!PyIndex_Check(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001418 PyErr_Format(
1419 PyExc_TypeError,
1420 "__trunc__ returned non-Integral (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001421 Py_TYPE(result)->tp_name);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001422 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001423 return NULL;
1424 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001425 Py_SETREF(result, PyNumber_Index(result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001426 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001428 if (PyErr_Occurred())
1429 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001430
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001431 if (PyUnicode_Check(o))
Inada Naokie4f1fe62020-06-29 13:00:43 +09001432 /* The below check is done in PyLong_FromUnicodeObject(). */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001433 return PyLong_FromUnicodeObject(o, 10);
1434
Martin Pantereeb896c2015-11-07 02:32:21 +00001435 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001437 * doesn't do. In particular int('9\x005') must raise an
1438 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001440 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1441 PyBytes_GET_SIZE(o), 10);
1442
1443 if (PyByteArray_Check(o))
1444 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1445 PyByteArray_GET_SIZE(o), 10);
1446
1447 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001448 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001449
1450 /* Copy to NUL-terminated buffer. */
1451 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1452 if (bytes == NULL) {
1453 PyBuffer_Release(&view);
1454 return NULL;
1455 }
1456 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1457 PyBytes_GET_SIZE(bytes), 10);
1458 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001459 PyBuffer_Release(&view);
1460 return result;
1461 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001462
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001463 return type_error("int() argument must be a string, a bytes-like object "
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +03001464 "or a real number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001465}
1466
1467PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001468PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001471
Victor Stinner71aea8e2016-08-19 16:59:55 +02001472 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001474 }
1475
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001476 if (PyFloat_CheckExact(o)) {
1477 Py_INCREF(o);
1478 return o;
1479 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001480 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 if (m && m->nb_float) { /* This should include subclasses of float */
1482 PyObject *res = m->nb_float(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001483 double val;
1484 if (!res || PyFloat_CheckExact(res)) {
1485 return res;
1486 }
1487 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001489 "%.50s.__float__ returned non-float (type %.50s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001490 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 Py_DECREF(res);
1492 return NULL;
1493 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001494 /* Issue #26983: warn if 'res' not of exact type float. */
1495 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1496 "%.50s.__float__ returned non-float (type %.50s). "
1497 "The ability to return an instance of a strict subclass of float "
1498 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001499 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001500 Py_DECREF(res);
1501 return NULL;
1502 }
1503 val = PyFloat_AS_DOUBLE(res);
1504 Py_DECREF(res);
1505 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 }
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001507 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001508 PyObject *res = _PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001509 if (!res) {
1510 return NULL;
1511 }
1512 double val = PyLong_AsDouble(res);
1513 Py_DECREF(res);
1514 if (val == -1.0 && PyErr_Occurred()) {
1515 return NULL;
1516 }
1517 return PyFloat_FromDouble(val);
1518 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001520 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 }
1522 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001523}
1524
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001525
1526PyObject *
1527PyNumber_ToBase(PyObject *n, int base)
1528{
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001529 if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
1530 PyErr_SetString(PyExc_SystemError,
1531 "PyNumber_ToBase: base must be 2, 8, 10 or 16");
1532 return NULL;
1533 }
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001534 PyObject *index = _PyNumber_Index(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 if (!index)
1536 return NULL;
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001537 PyObject *res = _PyLong_Format(index, base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 Py_DECREF(index);
1539 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001540}
1541
1542
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001543/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001544
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545int
Fred Drake79912472000-07-09 04:06:11 +00001546PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 if (PyDict_Check(s))
1549 return 0;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001550 return Py_TYPE(s)->tp_as_sequence &&
1551 Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001552}
1553
Martin v. Löwis18e16552006-02-15 17:27:45 +00001554Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001555PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 if (s == NULL) {
1560 null_error();
1561 return -1;
1562 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001563
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001564 m = Py_TYPE(s)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001565 if (m && m->sq_length) {
1566 Py_ssize_t len = m->sq_length(s);
1567 assert(len >= 0 || PyErr_Occurred());
1568 return len;
1569 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001570
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001571 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001572 type_error("%.200s is not a sequence", s);
1573 return -1;
1574 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 type_error("object of type '%.200s' has no len()", s);
1576 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001577}
1578
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001579#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001580Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001581PySequence_Length(PyObject *s)
1582{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001584}
1585#define PySequence_Length PySequence_Size
1586
Guido van Rossume15dee51995-07-18 14:12:02 +00001587PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001588PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001590 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001591
Victor Stinner71aea8e2016-08-19 16:59:55 +02001592 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001594 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001595
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001596 m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 if (m && m->sq_concat)
1598 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 /* Instances of user classes defining an __add__() method only
1601 have an nb_add slot, not an sq_concat slot. So we fall back
1602 to nb_add if both arguments appear to be sequences. */
1603 if (PySequence_Check(s) && PySequence_Check(o)) {
1604 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1605 if (result != Py_NotImplemented)
1606 return result;
1607 Py_DECREF(result);
1608 }
1609 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001610}
1611
1612PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001613PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001616
Victor Stinner71aea8e2016-08-19 16:59:55 +02001617 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001619 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001620
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001621 m = Py_TYPE(o)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (m && m->sq_repeat)
1623 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 /* Instances of user classes defining a __mul__() method only
1626 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1627 to nb_multiply if o appears to be a sequence. */
1628 if (PySequence_Check(o)) {
1629 PyObject *n, *result;
1630 n = PyLong_FromSsize_t(count);
1631 if (n == NULL)
1632 return NULL;
1633 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1634 Py_DECREF(n);
1635 if (result != Py_NotImplemented)
1636 return result;
1637 Py_DECREF(result);
1638 }
1639 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001640}
1641
1642PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001643PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001646
Victor Stinner71aea8e2016-08-19 16:59:55 +02001647 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001649 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001650
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001651 m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 if (m && m->sq_inplace_concat)
1653 return m->sq_inplace_concat(s, o);
1654 if (m && m->sq_concat)
1655 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 if (PySequence_Check(s) && PySequence_Check(o)) {
1658 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1659 NB_SLOT(nb_add));
1660 if (result != Py_NotImplemented)
1661 return result;
1662 Py_DECREF(result);
1663 }
1664 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001665}
1666
1667PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001668PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001669{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001671
Victor Stinner71aea8e2016-08-19 16:59:55 +02001672 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001674 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001675
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001676 m = Py_TYPE(o)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 if (m && m->sq_inplace_repeat)
1678 return m->sq_inplace_repeat(o, count);
1679 if (m && m->sq_repeat)
1680 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 if (PySequence_Check(o)) {
1683 PyObject *n, *result;
1684 n = PyLong_FromSsize_t(count);
1685 if (n == NULL)
1686 return NULL;
1687 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1688 NB_SLOT(nb_multiply));
1689 Py_DECREF(n);
1690 if (result != Py_NotImplemented)
1691 return result;
1692 Py_DECREF(result);
1693 }
1694 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001695}
1696
1697PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001698PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001701
Victor Stinner71aea8e2016-08-19 16:59:55 +02001702 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001704 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001705
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001706 m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 if (m && m->sq_item) {
1708 if (i < 0) {
1709 if (m->sq_length) {
1710 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnere20310f2015-11-05 13:56:58 +01001711 if (l < 0) {
1712 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001714 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 i += l;
1716 }
1717 }
1718 return m->sq_item(s, i);
1719 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001720
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001721 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001722 return type_error("%.200s is not a sequence", s);
1723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001725}
1726
1727PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001728PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001731
Victor Stinner71aea8e2016-08-19 16:59:55 +02001732 if (!s) {
1733 return null_error();
1734 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001735
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001736 mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001737 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 PyObject *res;
1739 PyObject *slice = _PySlice_FromIndices(i1, i2);
1740 if (!slice)
1741 return NULL;
1742 res = mp->mp_subscript(s, slice);
1743 Py_DECREF(slice);
1744 return res;
1745 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001748}
1749
1750int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001751PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 if (s == NULL) {
1756 null_error();
1757 return -1;
1758 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001759
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001760 m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 if (m && m->sq_ass_item) {
1762 if (i < 0) {
1763 if (m->sq_length) {
1764 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001765 if (l < 0) {
1766 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001768 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 i += l;
1770 }
1771 }
1772 return m->sq_ass_item(s, i, o);
1773 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001774
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001775 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001776 type_error("%.200s is not a sequence", s);
1777 return -1;
1778 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 type_error("'%.200s' object does not support item assignment", s);
1780 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001781}
1782
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001783int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001784PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 if (s == NULL) {
1789 null_error();
1790 return -1;
1791 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001792
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001793 m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 if (m && m->sq_ass_item) {
1795 if (i < 0) {
1796 if (m->sq_length) {
1797 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001798 if (l < 0) {
1799 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001801 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 i += l;
1803 }
1804 }
1805 return m->sq_ass_item(s, i, (PyObject *)NULL);
1806 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001807
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001808 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001809 type_error("%.200s is not a sequence", s);
1810 return -1;
1811 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 type_error("'%.200s' object doesn't support item deletion", s);
1813 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001814}
1815
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001816int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001817PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 if (s == NULL) {
1822 null_error();
1823 return -1;
1824 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001825
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001826 mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001827 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 int res;
1829 PyObject *slice = _PySlice_FromIndices(i1, i2);
1830 if (!slice)
1831 return -1;
1832 res = mp->mp_ass_subscript(s, slice, o);
1833 Py_DECREF(slice);
1834 return res;
1835 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 type_error("'%.200s' object doesn't support slice assignment", s);
1838 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001839}
1840
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001841int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001842PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 if (s == NULL) {
1847 null_error();
1848 return -1;
1849 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001850
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001851 mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001852 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 int res;
1854 PyObject *slice = _PySlice_FromIndices(i1, i2);
1855 if (!slice)
1856 return -1;
1857 res = mp->mp_ass_subscript(s, slice, NULL);
1858 Py_DECREF(slice);
1859 return res;
1860 }
1861 type_error("'%.200s' object doesn't support slice deletion", s);
1862 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001863}
1864
Guido van Rossume15dee51995-07-18 14:12:02 +00001865PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001866PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 PyObject *it; /* iter(v) */
1869 Py_ssize_t n; /* guess for result tuple size */
1870 PyObject *result = NULL;
1871 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001872
Victor Stinner71aea8e2016-08-19 16:59:55 +02001873 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001875 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 /* Special-case the common tuple and list cases, for efficiency. */
1878 if (PyTuple_CheckExact(v)) {
1879 /* Note that we can't know whether it's safe to return
1880 a tuple *subclass* instance as-is, hence the restriction
1881 to exact tuples here. In contrast, lists always make
1882 a copy, so there's no need for exactness below. */
1883 Py_INCREF(v);
1884 return v;
1885 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001886 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 /* Get iterator. */
1890 it = PyObject_GetIter(v);
1891 if (it == NULL)
1892 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001895 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 if (n == -1)
1897 goto Fail;
1898 result = PyTuple_New(n);
1899 if (result == NULL)
1900 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 /* Fill the tuple. */
1903 for (j = 0; ; ++j) {
1904 PyObject *item = PyIter_Next(it);
1905 if (item == NULL) {
1906 if (PyErr_Occurred())
1907 goto Fail;
1908 break;
1909 }
1910 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00001911 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 /* The over-allocation strategy can grow a bit faster
1913 than for lists because unlike lists the
1914 over-allocation isn't permanent -- we reclaim
1915 the excess before the end of this routine.
1916 So, grow by ten and then add 25%.
1917 */
Martin Pantere8db8612016-07-25 02:30:05 +00001918 newn += 10u;
1919 newn += newn >> 2;
1920 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* Check for overflow */
1922 PyErr_NoMemory();
1923 Py_DECREF(item);
1924 goto Fail;
1925 }
Martin Pantere8db8612016-07-25 02:30:05 +00001926 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 if (_PyTuple_Resize(&result, n) != 0) {
1928 Py_DECREF(item);
1929 goto Fail;
1930 }
1931 }
1932 PyTuple_SET_ITEM(result, j, item);
1933 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 /* Cut tuple back if guess was too large. */
1936 if (j < n &&
1937 _PyTuple_Resize(&result, j) != 0)
1938 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 Py_DECREF(it);
1941 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001942
1943Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 Py_XDECREF(result);
1945 Py_DECREF(it);
1946 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001947}
1948
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001949PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001950PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 PyObject *result; /* result list */
1953 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001954
Victor Stinner71aea8e2016-08-19 16:59:55 +02001955 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001957 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 result = PyList_New(0);
1960 if (result == NULL)
1961 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 rv = _PyList_Extend((PyListObject *)result, v);
1964 if (rv == NULL) {
1965 Py_DECREF(result);
1966 return NULL;
1967 }
1968 Py_DECREF(rv);
1969 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001970}
1971
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001972PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001973PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001976
Victor Stinner71aea8e2016-08-19 16:59:55 +02001977 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001979 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1982 Py_INCREF(v);
1983 return v;
1984 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 it = PyObject_GetIter(v);
1987 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02001988 PyThreadState *tstate = _PyThreadState_GET();
1989 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
1990 _PyErr_SetString(tstate, PyExc_TypeError, m);
1991 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 return NULL;
1993 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 v = PySequence_List(it);
1996 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001999}
2000
Tim Peters16a77ad2001-09-08 04:00:12 +00002001/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2003 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
2004 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00002005 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2006*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002007Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002008_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 Py_ssize_t n;
2011 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2012 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002014 if (seq == NULL || obj == NULL) {
2015 null_error();
2016 return -1;
2017 }
Tim Peters75f8e352001-05-05 11:33:43 +00002018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 it = PyObject_GetIter(seq);
2020 if (it == NULL) {
Serhiy Storchakacafe1b62020-06-22 10:43:35 +03002021 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2022 type_error("argument of type '%.200s' is not iterable", seq);
2023 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 return -1;
2025 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 n = wrapped = 0;
2028 for (;;) {
2029 int cmp;
2030 PyObject *item = PyIter_Next(it);
2031 if (item == NULL) {
2032 if (PyErr_Occurred())
2033 goto Fail;
2034 break;
2035 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002036
Serhiy Storchaka18b711c2019-08-04 14:12:48 +03002037 cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 Py_DECREF(item);
2039 if (cmp < 0)
2040 goto Fail;
2041 if (cmp > 0) {
2042 switch (operation) {
2043 case PY_ITERSEARCH_COUNT:
2044 if (n == PY_SSIZE_T_MAX) {
2045 PyErr_SetString(PyExc_OverflowError,
2046 "count exceeds C integer size");
2047 goto Fail;
2048 }
2049 ++n;
2050 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00002051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 case PY_ITERSEARCH_INDEX:
2053 if (wrapped) {
2054 PyErr_SetString(PyExc_OverflowError,
2055 "index exceeds C integer size");
2056 goto Fail;
2057 }
2058 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 case PY_ITERSEARCH_CONTAINS:
2061 n = 1;
2062 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07002065 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 }
2067 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 if (operation == PY_ITERSEARCH_INDEX) {
2070 if (n == PY_SSIZE_T_MAX)
2071 wrapped = 1;
2072 ++n;
2073 }
2074 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 if (operation != PY_ITERSEARCH_INDEX)
2077 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 PyErr_SetString(PyExc_ValueError,
2080 "sequence.index(x): x not in sequence");
2081 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002082Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 n = -1;
2084 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002085Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 Py_DECREF(it);
2087 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002088
Guido van Rossume15dee51995-07-18 14:12:02 +00002089}
2090
Tim Peters16a77ad2001-09-08 04:00:12 +00002091/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002092Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002093PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002096}
2097
Tim Peterscb8d3682001-05-05 21:05:01 +00002098/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002099 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002100 */
2101int
2102PySequence_Contains(PyObject *seq, PyObject *ob)
2103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 Py_ssize_t result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002105 PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 if (sqm != NULL && sqm->sq_contains != NULL)
2107 return (*sqm->sq_contains)(seq, ob);
2108 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2109 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002110}
2111
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002112/* Backwards compatibility */
2113#undef PySequence_In
2114int
Fred Drake79912472000-07-09 04:06:11 +00002115PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002118}
2119
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002120Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002121PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002124}
2125
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002126/* Operations on mappings */
2127
2128int
Fred Drake79912472000-07-09 04:06:11 +00002129PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002130{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002131 return o && Py_TYPE(o)->tp_as_mapping &&
2132 Py_TYPE(o)->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002133}
2134
Martin v. Löwis18e16552006-02-15 17:27:45 +00002135Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002136PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 if (o == NULL) {
2141 null_error();
2142 return -1;
2143 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002144
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002145 m = Py_TYPE(o)->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002146 if (m && m->mp_length) {
2147 Py_ssize_t len = m->mp_length(o);
2148 assert(len >= 0 || PyErr_Occurred());
2149 return len;
2150 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002151
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002152 if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03002153 type_error("%.200s is not a mapping", o);
2154 return -1;
2155 }
2156 /* PyMapping_Size() can be called from PyObject_Size(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 type_error("object of type '%.200s' has no len()", o);
2158 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002159}
2160
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002161#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002162Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002163PyMapping_Length(PyObject *o)
2164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002166}
2167#define PyMapping_Length PyMapping_Size
2168
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002169PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002170PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002173
Victor Stinner71aea8e2016-08-19 16:59:55 +02002174 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002176 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 okey = PyUnicode_FromString(key);
2179 if (okey == NULL)
2180 return NULL;
2181 r = PyObject_GetItem(o, okey);
2182 Py_DECREF(okey);
2183 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002184}
2185
2186int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002187PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 PyObject *okey;
2190 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 if (key == NULL) {
2193 null_error();
2194 return -1;
2195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 okey = PyUnicode_FromString(key);
2198 if (okey == NULL)
2199 return -1;
2200 r = PyObject_SetItem(o, okey, value);
2201 Py_DECREF(okey);
2202 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002203}
2204
2205int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002206PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002208 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 v = PyMapping_GetItemString(o, key);
2211 if (v) {
2212 Py_DECREF(v);
2213 return 1;
2214 }
2215 PyErr_Clear();
2216 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002217}
2218
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002219int
Fred Drake79912472000-07-09 04:06:11 +00002220PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 v = PyObject_GetItem(o, key);
2225 if (v) {
2226 Py_DECREF(v);
2227 return 1;
2228 }
2229 PyErr_Clear();
2230 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002231}
2232
Oren Milman0ccc0f62017-10-08 11:17:46 +03002233/* This function is quite similar to PySequence_Fast(), but specialized to be
2234 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2235 */
2236static PyObject *
2237method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2238{
2239 PyObject *it, *result, *meth_output;
2240
2241 assert(o != NULL);
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002242 meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002243 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2244 return meth_output;
2245 }
2246 it = PyObject_GetIter(meth_output);
2247 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002248 PyThreadState *tstate = _PyThreadState_GET();
2249 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2250 _PyErr_Format(tstate, PyExc_TypeError,
2251 "%.200s.%U() returned a non-iterable (type %.200s)",
2252 Py_TYPE(o)->tp_name,
2253 _PyUnicode_FromId(meth_id),
2254 Py_TYPE(meth_output)->tp_name);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002255 }
2256 Py_DECREF(meth_output);
2257 return NULL;
2258 }
2259 Py_DECREF(meth_output);
2260 result = PySequence_List(it);
2261 Py_DECREF(it);
2262 return result;
2263}
2264
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002265PyObject *
2266PyMapping_Keys(PyObject *o)
2267{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002268 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002269
Oren Milman0ccc0f62017-10-08 11:17:46 +03002270 if (o == NULL) {
2271 return null_error();
2272 }
2273 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002275 }
2276 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002277}
2278
2279PyObject *
2280PyMapping_Items(PyObject *o)
2281{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002282 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002283
Oren Milman0ccc0f62017-10-08 11:17:46 +03002284 if (o == NULL) {
2285 return null_error();
2286 }
2287 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002289 }
2290 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002291}
2292
2293PyObject *
2294PyMapping_Values(PyObject *o)
2295{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002296 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002297
Oren Milman0ccc0f62017-10-08 11:17:46 +03002298 if (o == NULL) {
2299 return null_error();
2300 }
2301 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002303 }
2304 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002305}
2306
Guido van Rossum823649d2001-03-21 18:40:58 +00002307/* isinstance(), issubclass() */
2308
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002309/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002310 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002311 * 1. getattr(cls, '__bases__') could raise an AttributeError
2312 * 2. getattr(cls, '__bases__') could raise some other exception
2313 * 3. getattr(cls, '__bases__') could return a tuple
2314 * 4. getattr(cls, '__bases__') could return something other than a tuple
2315 *
2316 * Only state #3 is a non-error state and only it returns a non-NULL object
2317 * (it returns the retrieved tuple).
2318 *
2319 * Any raised AttributeErrors are masked by clearing the exception and
2320 * returning NULL. If an object other than a tuple comes out of __bases__,
2321 * then again, the return value is NULL. So yes, these two situations
2322 * produce exactly the same results: NULL is returned and no error is set.
2323 *
2324 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002326 * exception to be propagated along.
2327 *
2328 * Callers are expected to test for PyErr_Occurred() when the return value
2329 * is NULL to decide whether a valid exception should be propagated or not.
2330 * When there's no exception to propagate, it's customary for the caller to
2331 * set a TypeError.
2332 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002333static PyObject *
2334abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002335{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002336 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002338
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002339 (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002340 if (bases != NULL && !PyTuple_Check(bases)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 Py_DECREF(bases);
2342 return NULL;
2343 }
2344 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002345}
2346
2347
2348static int
2349abstract_issubclass(PyObject *derived, PyObject *cls)
2350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *bases = NULL;
2352 Py_ssize_t i, n;
2353 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 while (1) {
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002356 if (derived == cls) {
2357 Py_XDECREF(bases); /* See below comment */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358 return 1;
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002359 }
2360 /* Use XSETREF to drop bases reference *after* finishing with
2361 derived; bases might be the only reference to it.
2362 XSETREF is used instead of SETREF, because bases is NULL on the
2363 first iteration of the loop.
2364 */
2365 Py_XSETREF(bases, abstract_get_bases(derived));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 if (bases == NULL) {
2367 if (PyErr_Occurred())
2368 return -1;
2369 return 0;
2370 }
2371 n = PyTuple_GET_SIZE(bases);
2372 if (n == 0) {
2373 Py_DECREF(bases);
2374 return 0;
2375 }
2376 /* Avoid recursivity in the single inheritance case */
2377 if (n == 1) {
2378 derived = PyTuple_GET_ITEM(bases, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 continue;
2380 }
2381 for (i = 0; i < n; i++) {
2382 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2383 if (r != 0)
2384 break;
2385 }
2386 Py_DECREF(bases);
2387 return r;
2388 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002389}
2390
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002391static int
2392check_class(PyObject *cls, const char *error)
2393{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 PyObject *bases = abstract_get_bases(cls);
2395 if (bases == NULL) {
2396 /* Do not mask errors. */
Victor Stinner61b64922020-06-23 15:55:06 +02002397 PyThreadState *tstate = _PyThreadState_GET();
2398 if (!_PyErr_Occurred(tstate)) {
2399 _PyErr_SetString(tstate, PyExc_TypeError, error);
2400 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 return 0;
2402 }
2403 Py_DECREF(bases);
2404 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002405}
2406
Brett Cannon4f653312004-03-20 22:52:14 +00002407static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002408object_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 PyObject *icls;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002411 int retval;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002412 _Py_IDENTIFIER(__class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 if (PyType_Check(cls)) {
2414 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2415 if (retval == 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002416 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2417 if (icls != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002418 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 retval = PyType_IsSubtype(
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002420 (PyTypeObject *)icls,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 (PyTypeObject *)cls);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002422 }
2423 else {
2424 retval = 0;
2425 }
2426 Py_DECREF(icls);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 }
2428 }
2429 }
2430 else {
2431 if (!check_class(cls,
Maggie Moss1b4552c2020-09-09 13:23:24 -07002432 "isinstance() arg 2 must be a type, a tuple of types or a union"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 return -1;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002434 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2435 if (icls != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 retval = abstract_issubclass(icls, cls);
2437 Py_DECREF(icls);
2438 }
2439 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002442}
2443
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002444static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002445object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002446{
Benjamin Petersonce798522012-01-22 11:24:29 -05002447 _Py_IDENTIFIER(__instancecheck__);
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 /* Quick test for an exact match */
Andy Lesterdffe4c02020-03-04 07:15:20 -06002450 if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 return 1;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002452 }
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002453
Georg Brandl72b8a802014-10-03 09:26:37 +02002454 /* We know what type's __instancecheck__ does. */
2455 if (PyType_CheckExact(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002456 return object_isinstance(inst, cls);
Georg Brandl72b8a802014-10-03 09:26:37 +02002457 }
2458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 if (PyTuple_Check(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002460 /* Not a general sequence -- that opens up the road to
2461 recursion and stack overflow. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002462 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002464 }
2465 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2466 int r = 0;
2467 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002469 r = object_recursive_isinstance(tstate, inst, item);
2470 if (r != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 /* either found it, or got an error */
2472 break;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002473 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002475 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 return r;
2477 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002478
Victor Stinner850a4bd2020-02-04 13:42:13 +01002479 PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 if (checker != NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002481 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002483 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002485
Petr Viktorinffd97532020-02-11 17:46:57 +01002486 PyObject *res = PyObject_CallOneArg(checker, inst);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002487 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002489
2490 if (res == NULL) {
2491 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002493 int ok = PyObject_IsTrue(res);
2494 Py_DECREF(res);
2495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 return ok;
2497 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002498 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002500 }
2501
Victor Stinner850a4bd2020-02-04 13:42:13 +01002502 /* cls has no __instancecheck__() method */
2503 return object_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002504}
2505
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002506
2507int
2508PyObject_IsInstance(PyObject *inst, PyObject *cls)
2509{
2510 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner850a4bd2020-02-04 13:42:13 +01002511 return object_recursive_isinstance(tstate, inst, cls);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002512}
2513
2514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002516recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 if (PyType_Check(cls) && PyType_Check(derived)) {
2519 /* Fast path (non-recursive) */
2520 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2521 }
2522 if (!check_class(derived,
2523 "issubclass() arg 1 must be a class"))
2524 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002525
2526 PyTypeObject *type = Py_TYPE(cls);
2527 int is_union = (PyType_Check(type) && type == &_Py_UnionType);
2528 if (!is_union && !check_class(cls,
2529 "issubclass() arg 2 must be a class,"
2530 " a tuple of classes, or a union.")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002532 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002535}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002536
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002537static int
2538object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002539{
Benjamin Petersonce798522012-01-22 11:24:29 -05002540 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002542
Georg Brandl72b8a802014-10-03 09:26:37 +02002543 /* We know what type's __subclasscheck__ does. */
2544 if (PyType_CheckExact(cls)) {
2545 /* Quick test for an exact match */
2546 if (derived == cls)
2547 return 1;
2548 return recursive_issubclass(derived, cls);
2549 }
2550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 if (PyTuple_Check(cls)) {
Antoine Pitrouec569b72008-08-26 22:40:48 +00002552
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002553 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002555 }
2556 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2557 int r = 0;
2558 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002560 r = object_issubclass(tstate, derived, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 if (r != 0)
2562 /* either found it, or got an error */
2563 break;
2564 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002565 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 return r;
2567 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002568
Benjamin Petersonce798522012-01-22 11:24:29 -05002569 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 if (checker != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 int ok = -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002572 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 Py_DECREF(checker);
2574 return ok;
2575 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002576 PyObject *res = PyObject_CallOneArg(checker, derived);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002577 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 Py_DECREF(checker);
2579 if (res != NULL) {
2580 ok = PyObject_IsTrue(res);
2581 Py_DECREF(res);
2582 }
2583 return ok;
2584 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002585 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002587 }
2588
Georg Brandl72b8a802014-10-03 09:26:37 +02002589 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002591}
2592
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002593
2594int
2595PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2596{
2597 PyThreadState *tstate = _PyThreadState_GET();
2598 return object_issubclass(tstate, derived, cls);
2599}
2600
2601
Antoine Pitrouec569b72008-08-26 22:40:48 +00002602int
2603_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2604{
Victor Stinner850a4bd2020-02-04 13:42:13 +01002605 return object_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002606}
2607
2608int
2609_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002612}
2613
2614
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002615PyObject *
2616PyObject_GetIter(PyObject *o)
2617{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002618 PyTypeObject *t = Py_TYPE(o);
Victor Stinner14e6d092016-12-09 17:08:59 +01002619 getiterfunc f;
2620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 f = t->tp_iter;
2622 if (f == NULL) {
2623 if (PySequence_Check(o))
2624 return PySeqIter_New(o);
2625 return type_error("'%.200s' object is not iterable", o);
2626 }
2627 else {
2628 PyObject *res = (*f)(o);
2629 if (res != NULL && !PyIter_Check(res)) {
2630 PyErr_Format(PyExc_TypeError,
2631 "iter() returned non-iterator "
2632 "of type '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002633 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 Py_DECREF(res);
2635 res = NULL;
2636 }
2637 return res;
2638 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002639}
2640
Christian Tismerea62ce72018-06-09 20:32:25 +02002641#undef PyIter_Check
Christian Tismer83987132018-06-11 00:48:28 +02002642
Christian Tismerea62ce72018-06-09 20:32:25 +02002643int PyIter_Check(PyObject *obj)
2644{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002645 return Py_TYPE(obj)->tp_iternext != NULL &&
2646 Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented;
Christian Tismerea62ce72018-06-09 20:32:25 +02002647}
2648
Tim Petersf4848da2001-05-05 00:14:56 +00002649/* Return next item.
2650 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2651 * If the iteration terminates normally, return NULL and clear the
2652 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2653 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002655 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002656PyObject *
2657PyIter_Next(PyObject *iter)
2658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyObject *result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002660 result = (*Py_TYPE(iter)->tp_iternext)(iter);
Victor Stinner61b64922020-06-23 15:55:06 +02002661 if (result == NULL) {
2662 PyThreadState *tstate = _PyThreadState_GET();
2663 if (_PyErr_Occurred(tstate)
2664 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2665 {
2666 _PyErr_Clear(tstate);
2667 }
2668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002670}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002671
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002672PySendResult
2673PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
2674{
2675 _Py_IDENTIFIER(send);
2676 assert(arg != NULL);
2677 assert(result != NULL);
2678 if (PyType_HasFeature(Py_TYPE(iter), Py_TPFLAGS_HAVE_AM_SEND)) {
2679 assert (Py_TYPE(iter)->tp_as_async != NULL);
2680 assert (Py_TYPE(iter)->tp_as_async->am_send != NULL);
2681 return Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
2682 }
2683 if (arg == Py_None && PyIter_Check(iter)) {
2684 *result = Py_TYPE(iter)->tp_iternext(iter);
2685 }
2686 else {
2687 *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg);
2688 }
2689 if (*result != NULL) {
2690 return PYGEN_NEXT;
2691 }
2692 if (_PyGen_FetchStopIterationValue(result) == 0) {
2693 return PYGEN_RETURN;
2694 }
2695 return PYGEN_ERROR;
2696}
2697
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002698/*
2699 * Flatten a sequence of bytes() objects into a C array of
2700 * NULL terminated string pointers with a NULL char* terminating the array.
2701 * (ie: an argv or env list)
2702 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002703 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2704 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002705 */
2706char *const *
2707_PySequence_BytesToCharpArray(PyObject* self)
2708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 char **array;
2710 Py_ssize_t i, argc;
2711 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002712 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 argc = PySequence_Size(self);
2715 if (argc == -1)
2716 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002717
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002718 assert(argc >= 0);
2719
2720 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2721 PyErr_NoMemory();
2722 return NULL;
2723 }
2724
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002725 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 if (array == NULL) {
2727 PyErr_NoMemory();
2728 return NULL;
2729 }
2730 for (i = 0; i < argc; ++i) {
2731 char *data;
2732 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002733 if (item == NULL) {
2734 /* NULL terminate before freeing. */
2735 array[i] = NULL;
2736 goto fail;
2737 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002738 /* check for embedded null bytes */
2739 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 /* NULL terminate before freeing. */
2741 array[i] = NULL;
2742 goto fail;
2743 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002744 size = PyBytes_GET_SIZE(item) + 1;
2745 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 if (!array[i]) {
2747 PyErr_NoMemory();
2748 goto fail;
2749 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002750 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 Py_DECREF(item);
2752 }
2753 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002756
2757fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 Py_XDECREF(item);
2759 _Py_FreeCharPArray(array);
2760 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002761}
2762
2763
2764/* Free's a NULL terminated char** array of C strings. */
2765void
2766_Py_FreeCharPArray(char *const array[])
2767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002768 Py_ssize_t i;
2769 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002770 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002772 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002773}