blob: 7bd72c9b5dcc26985989a85fd5c5ff9bd85db56b [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"
Victor Stinner4a21e572020-04-15 02:35:41 +02004#include "pycore_abstract.h" // _PyIndex_Check()
5#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
Victor Stinner61b64922020-06-23 15:55:06 +02006#include "pycore_pyerrors.h" // _PyErr_Occurred()
Victor Stinner4a21e572020-04-15 02:35:41 +02007#include "pycore_pystate.h" // _PyThreadState_GET()
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00008#include <ctype.h>
Victor Stinner4a21e572020-04-15 02:35:41 +02009#include <stddef.h> // offsetof()
Tim Peters64b5ce32001-09-10 20:52:51 +000010#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +000011
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000012
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000013
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000014/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000015
16static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000017type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000018{
Victor Stinner0d76d2b2020-02-07 01:53:23 +010019 PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000021}
22
Guido van Rossum052b7e11996-11-11 15:08:19 +000023static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000024null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000025{
Victor Stinner61b64922020-06-23 15:55:06 +020026 PyThreadState *tstate = _PyThreadState_GET();
27 if (!_PyErr_Occurred(tstate)) {
28 _PyErr_SetString(tstate, PyExc_SystemError,
29 "null argument to internal routine");
30 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000032}
33
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000034/* Operations on any object */
35
Guido van Rossume15dee51995-07-18 14:12:02 +000036PyObject *
Fred Drake79912472000-07-09 04:06:11 +000037PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000040
Victor Stinner71aea8e2016-08-19 16:59:55 +020041 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020043 }
44
Victor Stinner0d76d2b2020-02-07 01:53:23 +010045 v = (PyObject *)Py_TYPE(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 Py_INCREF(v);
47 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000048}
49
Martin v. Löwis18e16552006-02-15 17:27:45 +000050Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000051PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 if (o == NULL) {
56 null_error();
57 return -1;
58 }
Guido van Rossume15dee51995-07-18 14:12:02 +000059
Victor Stinner0d76d2b2020-02-07 01:53:23 +010060 m = Py_TYPE(o)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +030061 if (m && m->sq_length) {
62 Py_ssize_t len = m->sq_length(o);
63 assert(len >= 0 || PyErr_Occurred());
64 return len;
65 }
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000068}
69
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000070#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000071Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000072PyObject_Length(PyObject *o)
73{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000075}
76#define PyObject_Length PyObject_Size
77
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020078int
79_PyObject_HasLen(PyObject *o) {
80 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
81 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
82}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000083
Christian Heimes255f53b2007-12-08 15:33:56 +000084/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020085 or o.__length_hint__(). If those methods aren't found the defaultvalue is
86 returned. If one of the calls fails with an exception other than TypeError
87 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000088*/
89
90Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020091PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000092{
Christian Heimesb70e8a12012-10-06 17:16:39 +020093 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020094 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050095 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030096 if (_PyObject_HasLen(o)) {
97 res = PyObject_Length(o);
Serhiy Storchaka813f9432017-04-16 09:21:44 +030098 if (res < 0) {
Victor Stinner61b64922020-06-23 15:55:06 +020099 PyThreadState *tstate = _PyThreadState_GET();
100 assert(_PyErr_Occurred(tstate));
101 if (!_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300102 return -1;
103 }
Victor Stinner61b64922020-06-23 15:55:06 +0200104 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200105 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300106 else {
107 return res;
108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 }
Christian Heimes6314d162012-10-06 17:13:29 +0200110 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200111 if (hint == NULL) {
112 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200114 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 return defaultvalue;
116 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100117 result = _PyObject_CallNoArg(hint);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200118 Py_DECREF(hint);
119 if (result == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200120 PyThreadState *tstate = _PyThreadState_GET();
121 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
122 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200123 return defaultvalue;
124 }
125 return -1;
126 }
127 else if (result == Py_NotImplemented) {
128 Py_DECREF(result);
129 return defaultvalue;
130 }
131 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200132 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200133 Py_TYPE(result)->tp_name);
134 Py_DECREF(result);
135 return -1;
136 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200137 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200138 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200139 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200140 return -1;
141 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200142 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200143 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
144 return -1;
145 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200146 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000147}
148
Guido van Rossume15dee51995-07-18 14:12:02 +0000149PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000150PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyMappingMethods *m;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000153 PySequenceMethods *ms;
Guido van Rossume15dee51995-07-18 14:12:02 +0000154
Victor Stinner71aea8e2016-08-19 16:59:55 +0200155 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200157 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000158
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100159 m = Py_TYPE(o)->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100160 if (m && m->mp_subscript) {
161 PyObject *item = m->mp_subscript(o, key);
162 assert((item != NULL) ^ (PyErr_Occurred() != NULL));
163 return item;
164 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000165
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100166 ms = Py_TYPE(o)->tp_as_sequence;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000167 if (ms && ms->sq_item) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200168 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 Py_ssize_t key_value;
170 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
171 if (key_value == -1 && PyErr_Occurred())
172 return NULL;
173 return PySequence_GetItem(o, key_value);
174 }
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000175 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 return type_error("sequence index must "
177 "be integer, not '%.200s'", key);
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000178 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000179 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000180
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100181 if (PyType_Check(o)) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200182 PyObject *meth, *result;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100183 _Py_IDENTIFIER(__class_getitem__);
Victor Stinnera15e2602020-04-08 02:01:56 +0200184
Guido van Rossum48b069a2020-04-07 09:50:06 -0700185 // Special case type[int], but disallow other types so str[int] fails
186 if ((PyTypeObject*)o == &PyType_Type) {
187 return Py_GenericAlias(o, key);
188 }
189
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200190 if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) {
191 return NULL;
192 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100193 if (meth) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100194 result = PyObject_CallOneArg(meth, key);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100195 Py_DECREF(meth);
196 return result;
197 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100198 }
199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000201}
202
203int
Fred Drake79912472000-07-09 04:06:11 +0000204PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 if (o == NULL || key == NULL || value == NULL) {
209 null_error();
210 return -1;
211 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100212 m = Py_TYPE(o)->tp_as_mapping;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (m && m->mp_ass_subscript)
214 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000215
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100216 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200217 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 Py_ssize_t key_value;
219 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
220 if (key_value == -1 && PyErr_Occurred())
221 return -1;
222 return PySequence_SetItem(o, key_value, value);
223 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100224 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 type_error("sequence index must be "
226 "integer, not '%.200s'", key);
227 return -1;
228 }
229 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 type_error("'%.200s' object does not support item assignment", o);
232 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000233}
234
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000235int
Fred Drake79912472000-07-09 04:06:11 +0000236PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 if (o == NULL || key == NULL) {
241 null_error();
242 return -1;
243 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100244 m = Py_TYPE(o)->tp_as_mapping;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 if (m && m->mp_ass_subscript)
246 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000247
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100248 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200249 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 Py_ssize_t key_value;
251 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
252 if (key_value == -1 && PyErr_Occurred())
253 return -1;
254 return PySequence_DelItem(o, key_value);
255 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100256 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 type_error("sequence index must be "
258 "integer, not '%.200s'", key);
259 return -1;
260 }
261 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 type_error("'%.200s' object does not support item deletion", o);
264 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000265}
266
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000267int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300268PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 PyObject *okey;
271 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 if (o == NULL || key == NULL) {
274 null_error();
275 return -1;
276 }
277 okey = PyUnicode_FromString(key);
278 if (okey == NULL)
279 return -1;
280 ret = PyObject_DelItem(o, okey);
281 Py_DECREF(okey);
282 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000283}
284
Victor Stinneref5c6152020-04-08 01:13:53 +0200285
286/* Return 1 if the getbuffer function is available, otherwise return 0. */
287int
288PyObject_CheckBuffer(PyObject *obj)
289{
290 PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
291 return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
292}
293
294
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000295/* Buffer C-API for Python 3.0 */
296
297int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000298PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000299{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100300 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200301
302 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000303 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400304 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 Py_TYPE(obj)->tp_name);
306 return -1;
307 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200308 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000309}
310
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000311static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100312_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 Py_ssize_t sd, dim;
315 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000316
Stefan Krah363af442015-02-01 14:53:54 +0100317 /* 1) len = product(shape) * itemsize
318 2) itemsize > 0
319 3) len = 0 <==> exists i: shape[i] = 0 */
320 if (view->len == 0) return 1;
321 if (view->strides == NULL) { /* C-contiguous by definition */
322 /* Trivially F-contiguous */
323 if (view->ndim <= 1) return 1;
324
325 /* ndim > 1 implies shape != NULL */
326 assert(view->shape != NULL);
327
328 /* Effectively 1-d */
329 sd = 0;
330 for (i=0; i<view->ndim; i++) {
331 if (view->shape[i] > 1) sd += 1;
332 }
333 return sd <= 1;
334 }
335
336 /* strides != NULL implies both of these */
337 assert(view->ndim > 0);
338 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 for (i=0; i<view->ndim; i++) {
342 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100343 if (dim > 1 && view->strides[i] != sd) {
344 return 0;
345 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 sd *= dim;
347 }
348 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000349}
350
351static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100352_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 Py_ssize_t sd, dim;
355 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000356
Stefan Krah363af442015-02-01 14:53:54 +0100357 /* 1) len = product(shape) * itemsize
358 2) itemsize > 0
359 3) len = 0 <==> exists i: shape[i] = 0 */
360 if (view->len == 0) return 1;
361 if (view->strides == NULL) return 1; /* C-contiguous by definition */
362
363 /* strides != NULL implies both of these */
364 assert(view->ndim > 0);
365 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 for (i=view->ndim-1; i>=0; i--) {
369 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100370 if (dim > 1 && view->strides[i] != sd) {
371 return 0;
372 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 sd *= dim;
374 }
375 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000376}
377
378int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100379PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000380{
381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000383
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100384 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100386 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100388 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 return (_IsCContiguous(view) || _IsFortranContiguous(view));
390 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000391}
392
393
Guido van Rossum98297ee2007-11-06 21:34:58 +0000394void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000395PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 char* pointer;
398 int i;
399 pointer = (char *)view->buf;
400 for (i = 0; i < view->ndim; i++) {
401 pointer += view->strides[i]*indices[i];
402 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
403 pointer = *((char**)pointer) + view->suboffsets[i];
404 }
405 }
406 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000407}
408
409
Guido van Rossum98297ee2007-11-06 21:34:58 +0000410void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000411_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 +0000412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 for (k=0; k<nd; k++) {
416 if (index[k] < shape[k]-1) {
417 index[k]++;
418 break;
419 }
420 else {
421 index[k] = 0;
422 }
423 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000424}
425
Guido van Rossum98297ee2007-11-06 21:34:58 +0000426void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000427_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 +0000428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 for (k=nd-1; k>=0; k--) {
432 if (index[k] < shape[k]-1) {
433 index[k]++;
434 break;
435 }
436 else {
437 index[k] = 0;
438 }
439 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000440}
441
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300442Py_ssize_t
443PyBuffer_SizeFromFormat(const char *format)
444{
445 PyObject *structmodule = NULL;
446 PyObject *calcsize = NULL;
447 PyObject *res = NULL;
448 PyObject *fmt = NULL;
449 Py_ssize_t itemsize = -1;
450
451 structmodule = PyImport_ImportModule("struct");
452 if (structmodule == NULL) {
453 return itemsize;
454 }
455
456 calcsize = PyObject_GetAttrString(structmodule, "calcsize");
457 if (calcsize == NULL) {
458 goto done;
459 }
460
461 fmt = PyUnicode_FromString(format);
462 if (fmt == NULL) {
463 goto done;
464 }
465
466 res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
467 if (res == NULL) {
468 goto done;
469 }
470
471 itemsize = PyLong_AsSsize_t(res);
472 if (itemsize < 0) {
473 goto done;
474 }
475
476done:
477 Py_DECREF(structmodule);
478 Py_XDECREF(calcsize);
479 Py_XDECREF(fmt);
480 Py_XDECREF(res);
481 return itemsize;
482}
483
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000484int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000485PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000488 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 Py_ssize_t *indices, elements;
490 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (len > view->len) {
493 len = view->len;
494 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 if (PyBuffer_IsContiguous(view, fort)) {
497 /* simplest copy is all that is needed */
498 memcpy(view->buf, buf, len);
499 return 0;
500 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000503
Stefan Krah7213fcc2015-02-01 16:19:23 +0100504 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
506 if (indices == NULL) {
507 PyErr_NoMemory();
508 return -1;
509 }
510 for (k=0; k<view->ndim;k++) {
511 indices[k] = 0;
512 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000515 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 }
517 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000518 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 }
520 src = buf;
521 /* XXX : This is not going to be the fastest code in the world
522 several optimizations are possible.
523 */
524 elements = len / view->itemsize;
525 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 ptr = PyBuffer_GetPointer(view, indices);
527 memcpy(ptr, src, view->itemsize);
528 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100529 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 PyMem_Free(indices);
533 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000534}
535
Guido van Rossum98297ee2007-11-06 21:34:58 +0000536int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 Py_buffer view_dest, view_src;
539 int k;
540 Py_ssize_t *indices, elements;
541 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (!PyObject_CheckBuffer(dest) ||
544 !PyObject_CheckBuffer(src)) {
545 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400546 "both destination and source must be "\
547 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return -1;
549 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
552 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
553 PyBuffer_Release(&view_dest);
554 return -1;
555 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 if (view_dest.len < view_src.len) {
558 PyErr_SetString(PyExc_BufferError,
559 "destination is too small to receive data from source");
560 PyBuffer_Release(&view_dest);
561 PyBuffer_Release(&view_src);
562 return -1;
563 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
566 PyBuffer_IsContiguous(&view_src, 'C')) ||
567 (PyBuffer_IsContiguous(&view_dest, 'F') &&
568 PyBuffer_IsContiguous(&view_src, 'F'))) {
569 /* simplest copy is all that is needed */
570 memcpy(view_dest.buf, view_src.buf, view_src.len);
571 PyBuffer_Release(&view_dest);
572 PyBuffer_Release(&view_src);
573 return 0;
574 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 /* XXX(nnorwitz): need to check for overflow! */
579 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
580 if (indices == NULL) {
581 PyErr_NoMemory();
582 PyBuffer_Release(&view_dest);
583 PyBuffer_Release(&view_src);
584 return -1;
585 }
586 for (k=0; k<view_src.ndim;k++) {
587 indices[k] = 0;
588 }
589 elements = 1;
590 for (k=0; k<view_src.ndim; k++) {
591 /* XXX(nnorwitz): can this overflow? */
592 elements *= view_src.shape[k];
593 }
594 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000595 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 dptr = PyBuffer_GetPointer(&view_dest, indices);
597 sptr = PyBuffer_GetPointer(&view_src, indices);
598 memcpy(dptr, sptr, view_src.itemsize);
599 }
600 PyMem_Free(indices);
601 PyBuffer_Release(&view_dest);
602 PyBuffer_Release(&view_src);
603 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000604}
605
606void
607PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 Py_ssize_t *strides, int itemsize,
609 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 int k;
612 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 sd = itemsize;
615 if (fort == 'F') {
616 for (k=0; k<nd; k++) {
617 strides[k] = sd;
618 sd *= shape[k];
619 }
620 }
621 else {
622 for (k=nd-1; k>=0; k--) {
623 strides[k] = sd;
624 sd *= shape[k];
625 }
626 }
627 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000628}
629
630int
Martin v. Löwis423be952008-08-13 15:53:07 +0000631PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100632 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000633{
Stefan Krah5178d912015-02-03 16:57:21 +0100634 if (view == NULL) {
635 PyErr_SetString(PyExc_BufferError,
Victor Stinner61b64922020-06-23 15:55:06 +0200636 "PyBuffer_FillInfo: view==NULL argument is obsolete");
Stefan Krah5178d912015-02-03 16:57:21 +0100637 return -1;
638 }
639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
641 (readonly == 1)) {
642 PyErr_SetString(PyExc_BufferError,
643 "Object is not writable.");
644 return -1;
645 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 view->obj = obj;
648 if (obj)
649 Py_INCREF(obj);
650 view->buf = buf;
651 view->len = len;
652 view->readonly = readonly;
653 view->itemsize = 1;
654 view->format = NULL;
655 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
656 view->format = "B";
657 view->ndim = 1;
658 view->shape = NULL;
659 if ((flags & PyBUF_ND) == PyBUF_ND)
660 view->shape = &(view->len);
661 view->strides = NULL;
662 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
663 view->strides = &(view->itemsize);
664 view->suboffsets = NULL;
665 view->internal = NULL;
666 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000667}
668
Martin v. Löwis423be952008-08-13 15:53:07 +0000669void
670PyBuffer_Release(Py_buffer *view)
671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000672 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200673 PyBufferProcs *pb;
674 if (obj == NULL)
675 return;
676 pb = Py_TYPE(obj)->tp_as_buffer;
677 if (pb && pb->bf_releasebuffer)
678 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200680 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000681}
682
Eric Smith8fd3eba2008-02-17 19:48:00 +0000683PyObject *
684PyObject_Format(PyObject *obj, PyObject *format_spec)
685{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000686 PyObject *meth;
687 PyObject *empty = NULL;
688 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500689 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000690
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300691 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
692 PyErr_Format(PyExc_SystemError,
693 "Format specifier must be a string, not %.200s",
694 Py_TYPE(format_spec)->tp_name);
695 return NULL;
696 }
697
698 /* Fast path for common types. */
699 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
700 if (PyUnicode_CheckExact(obj)) {
701 Py_INCREF(obj);
702 return obj;
703 }
704 if (PyLong_CheckExact(obj)) {
705 return PyObject_Str(obj);
706 }
707 }
708
Eric Smith8fd3eba2008-02-17 19:48:00 +0000709 /* If no format_spec is provided, use an empty string */
710 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100711 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000712 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000713 }
714
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300715 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500716 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000717 if (meth == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200718 PyThreadState *tstate = _PyThreadState_GET();
719 if (!_PyErr_Occurred(tstate)) {
720 _PyErr_Format(tstate, PyExc_TypeError,
721 "Type %.100s doesn't define __format__",
722 Py_TYPE(obj)->tp_name);
723 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000725 }
726
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000727 /* And call it. */
Petr Viktorinffd97532020-02-11 17:46:57 +0100728 result = PyObject_CallOneArg(meth, format_spec);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000729 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000730
731 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800732 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +0200733 "__format__ must return a str, not %.200s",
734 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000735 Py_DECREF(result);
736 result = NULL;
737 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000738 }
739
740done:
741 Py_XDECREF(empty);
742 return result;
743}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000744/* Operations on numbers */
745
746int
Fred Drake79912472000-07-09 04:06:11 +0000747PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000748{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100749 return o && Py_TYPE(o)->tp_as_number &&
750 (Py_TYPE(o)->tp_as_number->nb_index ||
751 Py_TYPE(o)->tp_as_number->nb_int ||
752 Py_TYPE(o)->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000753}
754
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000755/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000756
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000757#define NB_SLOT(x) offsetof(PyNumberMethods, x)
758#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000760#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762
763/*
764 Calling scheme used for binary operations:
765
Neal Norwitz4886cc32006-08-21 17:06:07 +0000766 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000768
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100769 [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
770 Py_TYPE(v)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000771 */
772
773static PyObject *
774binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 PyObject *x;
777 binaryfunc slotv = NULL;
778 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000779
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100780 if (Py_TYPE(v)->tp_as_number != NULL)
781 slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
Andy Lester55728702020-03-06 16:53:17 -0600782 if (!Py_IS_TYPE(w, Py_TYPE(v)) &&
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100783 Py_TYPE(w)->tp_as_number != NULL) {
784 slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 if (slotw == slotv)
786 slotw = NULL;
787 }
788 if (slotv) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100789 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 x = slotw(v, w);
791 if (x != Py_NotImplemented)
792 return x;
793 Py_DECREF(x); /* can't do it */
794 slotw = NULL;
795 }
796 x = slotv(v, w);
797 if (x != Py_NotImplemented)
798 return x;
799 Py_DECREF(x); /* can't do it */
800 }
801 if (slotw) {
802 x = slotw(v, w);
803 if (x != Py_NotImplemented)
804 return x;
805 Py_DECREF(x); /* can't do it */
806 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500807 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000808}
Guido van Rossum77660912002-04-16 16:32:50 +0000809
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000810static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000811binop_type_error(PyObject *v, PyObject *w, const char *op_name)
812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 PyErr_Format(PyExc_TypeError,
814 "unsupported operand type(s) for %.100s: "
815 "'%.100s' and '%.100s'",
816 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100817 Py_TYPE(v)->tp_name,
818 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000820}
821
822static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000823binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 PyObject *result = binary_op1(v, w, op_slot);
826 if (result == Py_NotImplemented) {
827 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530828
829 if (op_slot == NB_SLOT(nb_rshift) &&
scoder4c9ea092020-05-12 16:12:41 +0200830 PyCFunction_CheckExact(v) &&
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530831 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
832 {
833 PyErr_Format(PyExc_TypeError,
834 "unsupported operand type(s) for %.100s: "
835 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530836 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530837 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100838 Py_TYPE(v)->tp_name,
839 Py_TYPE(w)->tp_name);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530840 return NULL;
841 }
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 "
1464 "or a 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 Py_ALLOW_RECURSION
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002340 (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002341 Py_END_ALLOW_RECURSION
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002342 if (bases != NULL && !PyTuple_Check(bases)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 Py_DECREF(bases);
2344 return NULL;
2345 }
2346 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002347}
2348
2349
2350static int
2351abstract_issubclass(PyObject *derived, PyObject *cls)
2352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 PyObject *bases = NULL;
2354 Py_ssize_t i, n;
2355 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 while (1) {
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002358 if (derived == cls) {
2359 Py_XDECREF(bases); /* See below comment */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 return 1;
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002361 }
2362 /* Use XSETREF to drop bases reference *after* finishing with
2363 derived; bases might be the only reference to it.
2364 XSETREF is used instead of SETREF, because bases is NULL on the
2365 first iteration of the loop.
2366 */
2367 Py_XSETREF(bases, abstract_get_bases(derived));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 if (bases == NULL) {
2369 if (PyErr_Occurred())
2370 return -1;
2371 return 0;
2372 }
2373 n = PyTuple_GET_SIZE(bases);
2374 if (n == 0) {
2375 Py_DECREF(bases);
2376 return 0;
2377 }
2378 /* Avoid recursivity in the single inheritance case */
2379 if (n == 1) {
2380 derived = PyTuple_GET_ITEM(bases, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 continue;
2382 }
2383 for (i = 0; i < n; i++) {
2384 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2385 if (r != 0)
2386 break;
2387 }
2388 Py_DECREF(bases);
2389 return r;
2390 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002391}
2392
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002393static int
2394check_class(PyObject *cls, const char *error)
2395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 PyObject *bases = abstract_get_bases(cls);
2397 if (bases == NULL) {
2398 /* Do not mask errors. */
Victor Stinner61b64922020-06-23 15:55:06 +02002399 PyThreadState *tstate = _PyThreadState_GET();
2400 if (!_PyErr_Occurred(tstate)) {
2401 _PyErr_SetString(tstate, PyExc_TypeError, error);
2402 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 return 0;
2404 }
2405 Py_DECREF(bases);
2406 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002407}
2408
Brett Cannon4f653312004-03-20 22:52:14 +00002409static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002410object_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002412 PyObject *icls;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002413 int retval;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002414 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 if (PyType_Check(cls)) {
2417 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2418 if (retval == 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002419 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2420 if (icls != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002421 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 retval = PyType_IsSubtype(
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002423 (PyTypeObject *)icls,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 (PyTypeObject *)cls);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002425 }
2426 else {
2427 retval = 0;
2428 }
2429 Py_DECREF(icls);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002430 }
2431 }
2432 }
2433 else {
2434 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002435 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 return -1;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002437 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2438 if (icls != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 retval = abstract_issubclass(icls, cls);
2440 Py_DECREF(icls);
2441 }
2442 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002445}
2446
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002447static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002448object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002449{
Benjamin Petersonce798522012-01-22 11:24:29 -05002450 _Py_IDENTIFIER(__instancecheck__);
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 /* Quick test for an exact match */
Andy Lesterdffe4c02020-03-04 07:15:20 -06002453 if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return 1;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002455 }
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002456
Georg Brandl72b8a802014-10-03 09:26:37 +02002457 /* We know what type's __instancecheck__ does. */
2458 if (PyType_CheckExact(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002459 return object_isinstance(inst, cls);
Georg Brandl72b8a802014-10-03 09:26:37 +02002460 }
2461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (PyTuple_Check(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002463 /* Not a general sequence -- that opens up the road to
2464 recursion and stack overflow. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002465 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002467 }
2468 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2469 int r = 0;
2470 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002472 r = object_recursive_isinstance(tstate, inst, item);
2473 if (r != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 /* either found it, or got an error */
2475 break;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002476 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002478 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 return r;
2480 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002481
Victor Stinner850a4bd2020-02-04 13:42:13 +01002482 PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 if (checker != NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002484 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002486 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002488
Petr Viktorinffd97532020-02-11 17:46:57 +01002489 PyObject *res = PyObject_CallOneArg(checker, inst);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002490 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002492
2493 if (res == NULL) {
2494 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002496 int ok = PyObject_IsTrue(res);
2497 Py_DECREF(res);
2498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 return ok;
2500 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002501 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002503 }
2504
Victor Stinner850a4bd2020-02-04 13:42:13 +01002505 /* cls has no __instancecheck__() method */
2506 return object_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002507}
2508
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002509
2510int
2511PyObject_IsInstance(PyObject *inst, PyObject *cls)
2512{
2513 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner850a4bd2020-02-04 13:42:13 +01002514 return object_recursive_isinstance(tstate, inst, cls);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002515}
2516
2517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002519recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002520{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 if (PyType_Check(cls) && PyType_Check(derived)) {
2522 /* Fast path (non-recursive) */
2523 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2524 }
2525 if (!check_class(derived,
2526 "issubclass() arg 1 must be a class"))
2527 return -1;
2528 if (!check_class(cls,
2529 "issubclass() arg 2 must be a class"
2530 " or tuple of classes"))
2531 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002534}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002535
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002536static int
2537object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002538{
Benjamin Petersonce798522012-01-22 11:24:29 -05002539 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002541
Georg Brandl72b8a802014-10-03 09:26:37 +02002542 /* We know what type's __subclasscheck__ does. */
2543 if (PyType_CheckExact(cls)) {
2544 /* Quick test for an exact match */
2545 if (derived == cls)
2546 return 1;
2547 return recursive_issubclass(derived, cls);
2548 }
2549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 if (PyTuple_Check(cls)) {
Antoine Pitrouec569b72008-08-26 22:40:48 +00002551
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002552 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002554 }
2555 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2556 int r = 0;
2557 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002559 r = object_issubclass(tstate, derived, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 if (r != 0)
2561 /* either found it, or got an error */
2562 break;
2563 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002564 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 return r;
2566 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002567
Benjamin Petersonce798522012-01-22 11:24:29 -05002568 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 if (checker != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 int ok = -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002571 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 Py_DECREF(checker);
2573 return ok;
2574 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002575 PyObject *res = PyObject_CallOneArg(checker, derived);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002576 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 Py_DECREF(checker);
2578 if (res != NULL) {
2579 ok = PyObject_IsTrue(res);
2580 Py_DECREF(res);
2581 }
2582 return ok;
2583 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002584 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002586 }
2587
Georg Brandl72b8a802014-10-03 09:26:37 +02002588 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002590}
2591
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002592
2593int
2594PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2595{
2596 PyThreadState *tstate = _PyThreadState_GET();
2597 return object_issubclass(tstate, derived, cls);
2598}
2599
2600
Antoine Pitrouec569b72008-08-26 22:40:48 +00002601int
2602_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2603{
Victor Stinner850a4bd2020-02-04 13:42:13 +01002604 return object_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002605}
2606
2607int
2608_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002611}
2612
2613
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002614PyObject *
2615PyObject_GetIter(PyObject *o)
2616{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002617 PyTypeObject *t = Py_TYPE(o);
Victor Stinner14e6d092016-12-09 17:08:59 +01002618 getiterfunc f;
2619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 f = t->tp_iter;
2621 if (f == NULL) {
2622 if (PySequence_Check(o))
2623 return PySeqIter_New(o);
2624 return type_error("'%.200s' object is not iterable", o);
2625 }
2626 else {
2627 PyObject *res = (*f)(o);
2628 if (res != NULL && !PyIter_Check(res)) {
2629 PyErr_Format(PyExc_TypeError,
2630 "iter() returned non-iterator "
2631 "of type '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002632 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 Py_DECREF(res);
2634 res = NULL;
2635 }
2636 return res;
2637 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002638}
2639
Christian Tismerea62ce72018-06-09 20:32:25 +02002640#undef PyIter_Check
Christian Tismer83987132018-06-11 00:48:28 +02002641
Christian Tismerea62ce72018-06-09 20:32:25 +02002642int PyIter_Check(PyObject *obj)
2643{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002644 return Py_TYPE(obj)->tp_iternext != NULL &&
2645 Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented;
Christian Tismerea62ce72018-06-09 20:32:25 +02002646}
2647
Tim Petersf4848da2001-05-05 00:14:56 +00002648/* Return next item.
2649 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2650 * If the iteration terminates normally, return NULL and clear the
2651 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2652 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002654 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002655PyObject *
2656PyIter_Next(PyObject *iter)
2657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 PyObject *result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002659 result = (*Py_TYPE(iter)->tp_iternext)(iter);
Victor Stinner61b64922020-06-23 15:55:06 +02002660 if (result == NULL) {
2661 PyThreadState *tstate = _PyThreadState_GET();
2662 if (_PyErr_Occurred(tstate)
2663 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2664 {
2665 _PyErr_Clear(tstate);
2666 }
2667 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002669}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002670
2671
2672/*
2673 * Flatten a sequence of bytes() objects into a C array of
2674 * NULL terminated string pointers with a NULL char* terminating the array.
2675 * (ie: an argv or env list)
2676 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002677 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2678 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002679 */
2680char *const *
2681_PySequence_BytesToCharpArray(PyObject* self)
2682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 char **array;
2684 Py_ssize_t i, argc;
2685 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002686 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 argc = PySequence_Size(self);
2689 if (argc == -1)
2690 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002691
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002692 assert(argc >= 0);
2693
2694 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2695 PyErr_NoMemory();
2696 return NULL;
2697 }
2698
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002699 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 if (array == NULL) {
2701 PyErr_NoMemory();
2702 return NULL;
2703 }
2704 for (i = 0; i < argc; ++i) {
2705 char *data;
2706 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002707 if (item == NULL) {
2708 /* NULL terminate before freeing. */
2709 array[i] = NULL;
2710 goto fail;
2711 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002712 /* check for embedded null bytes */
2713 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002714 /* NULL terminate before freeing. */
2715 array[i] = NULL;
2716 goto fail;
2717 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002718 size = PyBytes_GET_SIZE(item) + 1;
2719 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002720 if (!array[i]) {
2721 PyErr_NoMemory();
2722 goto fail;
2723 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002724 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 Py_DECREF(item);
2726 }
2727 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002730
2731fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 Py_XDECREF(item);
2733 _Py_FreeCharPArray(array);
2734 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002735}
2736
2737
2738/* Free's a NULL terminated char** array of C strings. */
2739void
2740_Py_FreeCharPArray(char *const array[])
2741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 Py_ssize_t i;
2743 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002744 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002746 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002747}