blob: fcfe2dbe483f4f3d22d475b73ddc0aea33e814b6 [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 Stinnerc9b8e9c2021-01-27 17:39:16 +01006#include "pycore_object.h" // _Py_CheckSlotResult()
Victor Stinner61b64922020-06-23 15:55:06 +02007#include "pycore_pyerrors.h" // _PyErr_Occurred()
Victor Stinner4a21e572020-04-15 02:35:41 +02008#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01009#include "pycore_unionobject.h" // _Py_UnionType && _Py_Union()
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000010#include <ctype.h>
Victor Stinner4a21e572020-04-15 02:35:41 +020011#include <stddef.h> // offsetof()
Tim Peters64b5ce32001-09-10 20:52:51 +000012#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +000013
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000014
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000017
18static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000020{
Victor Stinner0d76d2b2020-02-07 01:53:23 +010021 PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000023}
24
Guido van Rossum052b7e11996-11-11 15:08:19 +000025static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000026null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000027{
Victor Stinner61b64922020-06-23 15:55:06 +020028 PyThreadState *tstate = _PyThreadState_GET();
29 if (!_PyErr_Occurred(tstate)) {
30 _PyErr_SetString(tstate, PyExc_SystemError,
31 "null argument to internal routine");
32 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000034}
35
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036/* Operations on any object */
37
Guido van Rossume15dee51995-07-18 14:12:02 +000038PyObject *
Fred Drake79912472000-07-09 04:06:11 +000039PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000042
Victor Stinner71aea8e2016-08-19 16:59:55 +020043 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020045 }
46
Victor Stinner0d76d2b2020-02-07 01:53:23 +010047 v = (PyObject *)Py_TYPE(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 Py_INCREF(v);
49 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000050}
51
Martin v. Löwis18e16552006-02-15 17:27:45 +000052Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000053PyObject_Size(PyObject *o)
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 Stinnera6192632021-01-29 16:53:03 +010060 PySequenceMethods *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);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010063 assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +030064 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{
Victor Stinner71aea8e2016-08-19 16:59:55 +0200152 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200154 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000155
Victor Stinnera6192632021-01-29 16:53:03 +0100156 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100157 if (m && m->mp_subscript) {
158 PyObject *item = m->mp_subscript(o, key);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +0100159 assert(_Py_CheckSlotResult(o, "__getitem__", item != NULL));
Victor Stinnere20310f2015-11-05 13:56:58 +0100160 return item;
161 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000162
Victor Stinnera6192632021-01-29 16:53:03 +0100163 PySequenceMethods *ms = Py_TYPE(o)->tp_as_sequence;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000164 if (ms && ms->sq_item) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200165 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 Py_ssize_t key_value;
167 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
168 if (key_value == -1 && PyErr_Occurred())
169 return NULL;
170 return PySequence_GetItem(o, key_value);
171 }
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000172 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 return type_error("sequence index must "
174 "be integer, not '%.200s'", key);
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000175 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000177
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100178 if (PyType_Check(o)) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200179 PyObject *meth, *result;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100180 _Py_IDENTIFIER(__class_getitem__);
Victor Stinnera15e2602020-04-08 02:01:56 +0200181
Guido van Rossum48b069a2020-04-07 09:50:06 -0700182 // Special case type[int], but disallow other types so str[int] fails
183 if ((PyTypeObject*)o == &PyType_Type) {
184 return Py_GenericAlias(o, key);
185 }
186
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200187 if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) {
188 return NULL;
189 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100190 if (meth) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100191 result = PyObject_CallOneArg(meth, key);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100192 Py_DECREF(meth);
193 return result;
194 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100195 }
196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000198}
199
200int
Fred Drake79912472000-07-09 04:06:11 +0000201PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 if (o == NULL || key == NULL || value == NULL) {
204 null_error();
205 return -1;
206 }
Victor Stinnera6192632021-01-29 16:53:03 +0100207
208 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
209 if (m && m->mp_ass_subscript) {
210 int res = m->mp_ass_subscript(o, key, value);
211 assert(_Py_CheckSlotResult(o, "__setitem__", res >= 0));
212 return res;
213 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000214
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100215 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200216 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 Py_ssize_t key_value;
218 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
219 if (key_value == -1 && PyErr_Occurred())
220 return -1;
221 return PySequence_SetItem(o, key_value, value);
222 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100223 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 type_error("sequence index must be "
225 "integer, not '%.200s'", key);
226 return -1;
227 }
228 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 type_error("'%.200s' object does not support item assignment", o);
231 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000232}
233
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000234int
Fred Drake79912472000-07-09 04:06:11 +0000235PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 if (o == NULL || key == NULL) {
238 null_error();
239 return -1;
240 }
Victor Stinnera6192632021-01-29 16:53:03 +0100241
242 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
243 if (m && m->mp_ass_subscript) {
244 int res = m->mp_ass_subscript(o, key, (PyObject*)NULL);
245 assert(_Py_CheckSlotResult(o, "__delitem__", res >= 0));
246 return res;
247 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000248
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100249 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200250 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_ssize_t key_value;
252 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
253 if (key_value == -1 && PyErr_Occurred())
254 return -1;
255 return PySequence_DelItem(o, key_value);
256 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100257 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 type_error("sequence index must be "
259 "integer, not '%.200s'", key);
260 return -1;
261 }
262 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 type_error("'%.200s' object does not support item deletion", o);
265 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000266}
267
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000268int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300269PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyObject *okey;
272 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 if (o == NULL || key == NULL) {
275 null_error();
276 return -1;
277 }
278 okey = PyUnicode_FromString(key);
279 if (okey == NULL)
280 return -1;
281 ret = PyObject_DelItem(o, okey);
282 Py_DECREF(okey);
283 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000284}
285
Victor Stinneref5c6152020-04-08 01:13:53 +0200286
287/* Return 1 if the getbuffer function is available, otherwise return 0. */
288int
289PyObject_CheckBuffer(PyObject *obj)
290{
291 PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
292 return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
293}
294
295
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000296/* Buffer C-API for Python 3.0 */
297
298int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000299PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000300{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100301 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200302
303 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400305 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_TYPE(obj)->tp_name);
307 return -1;
308 }
Victor Stinnera6192632021-01-29 16:53:03 +0100309 int res = (*pb->bf_getbuffer)(obj, view, flags);
310 assert(_Py_CheckSlotResult(obj, "getbuffer", res >= 0));
311 return res;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000312}
313
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000314static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100315_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 Py_ssize_t sd, dim;
318 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000319
Stefan Krah363af442015-02-01 14:53:54 +0100320 /* 1) len = product(shape) * itemsize
321 2) itemsize > 0
322 3) len = 0 <==> exists i: shape[i] = 0 */
323 if (view->len == 0) return 1;
324 if (view->strides == NULL) { /* C-contiguous by definition */
325 /* Trivially F-contiguous */
326 if (view->ndim <= 1) return 1;
327
328 /* ndim > 1 implies shape != NULL */
329 assert(view->shape != NULL);
330
331 /* Effectively 1-d */
332 sd = 0;
333 for (i=0; i<view->ndim; i++) {
334 if (view->shape[i] > 1) sd += 1;
335 }
336 return sd <= 1;
337 }
338
339 /* strides != NULL implies both of these */
340 assert(view->ndim > 0);
341 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 for (i=0; i<view->ndim; i++) {
345 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100346 if (dim > 1 && view->strides[i] != sd) {
347 return 0;
348 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 sd *= dim;
350 }
351 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000352}
353
354static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100355_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 Py_ssize_t sd, dim;
358 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000359
Stefan Krah363af442015-02-01 14:53:54 +0100360 /* 1) len = product(shape) * itemsize
361 2) itemsize > 0
362 3) len = 0 <==> exists i: shape[i] = 0 */
363 if (view->len == 0) return 1;
364 if (view->strides == NULL) return 1; /* C-contiguous by definition */
365
366 /* strides != NULL implies both of these */
367 assert(view->ndim > 0);
368 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 for (i=view->ndim-1; i>=0; i--) {
372 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100373 if (dim > 1 && view->strides[i] != sd) {
374 return 0;
375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 sd *= dim;
377 }
378 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000379}
380
381int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100382PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000383{
384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000386
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100387 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100389 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100391 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 return (_IsCContiguous(view) || _IsFortranContiguous(view));
393 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000394}
395
396
Guido van Rossum98297ee2007-11-06 21:34:58 +0000397void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000398PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 char* pointer;
401 int i;
402 pointer = (char *)view->buf;
403 for (i = 0; i < view->ndim; i++) {
404 pointer += view->strides[i]*indices[i];
405 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
406 pointer = *((char**)pointer) + view->suboffsets[i];
407 }
408 }
409 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000410}
411
412
Guido van Rossum98297ee2007-11-06 21:34:58 +0000413void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000414_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 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 for (k=0; k<nd; k++) {
419 if (index[k] < shape[k]-1) {
420 index[k]++;
421 break;
422 }
423 else {
424 index[k] = 0;
425 }
426 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000427}
428
Guido van Rossum98297ee2007-11-06 21:34:58 +0000429void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000430_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 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 for (k=nd-1; k>=0; k--) {
435 if (index[k] < shape[k]-1) {
436 index[k]++;
437 break;
438 }
439 else {
440 index[k] = 0;
441 }
442 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000443}
444
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300445Py_ssize_t
446PyBuffer_SizeFromFormat(const char *format)
447{
448 PyObject *structmodule = NULL;
449 PyObject *calcsize = NULL;
450 PyObject *res = NULL;
451 PyObject *fmt = NULL;
452 Py_ssize_t itemsize = -1;
453
454 structmodule = PyImport_ImportModule("struct");
455 if (structmodule == NULL) {
456 return itemsize;
457 }
458
459 calcsize = PyObject_GetAttrString(structmodule, "calcsize");
460 if (calcsize == NULL) {
461 goto done;
462 }
463
464 fmt = PyUnicode_FromString(format);
465 if (fmt == NULL) {
466 goto done;
467 }
468
469 res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
470 if (res == NULL) {
471 goto done;
472 }
473
474 itemsize = PyLong_AsSsize_t(res);
475 if (itemsize < 0) {
476 goto done;
477 }
478
479done:
480 Py_DECREF(structmodule);
481 Py_XDECREF(calcsize);
482 Py_XDECREF(fmt);
483 Py_XDECREF(res);
484 return itemsize;
485}
486
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000487int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000488PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000491 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 Py_ssize_t *indices, elements;
493 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (len > view->len) {
496 len = view->len;
497 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 if (PyBuffer_IsContiguous(view, fort)) {
500 /* simplest copy is all that is needed */
501 memcpy(view->buf, buf, len);
502 return 0;
503 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000506
Stefan Krah7213fcc2015-02-01 16:19:23 +0100507 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
509 if (indices == NULL) {
510 PyErr_NoMemory();
511 return -1;
512 }
513 for (k=0; k<view->ndim;k++) {
514 indices[k] = 0;
515 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000518 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 }
520 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000521 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 }
523 src = buf;
524 /* XXX : This is not going to be the fastest code in the world
525 several optimizations are possible.
526 */
527 elements = len / view->itemsize;
528 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 ptr = PyBuffer_GetPointer(view, indices);
530 memcpy(ptr, src, view->itemsize);
531 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100532 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 PyMem_Free(indices);
536 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000537}
538
Guido van Rossum98297ee2007-11-06 21:34:58 +0000539int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 Py_buffer view_dest, view_src;
542 int k;
543 Py_ssize_t *indices, elements;
544 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (!PyObject_CheckBuffer(dest) ||
547 !PyObject_CheckBuffer(src)) {
548 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400549 "both destination and source must be "\
550 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return -1;
552 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
555 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
556 PyBuffer_Release(&view_dest);
557 return -1;
558 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 if (view_dest.len < view_src.len) {
561 PyErr_SetString(PyExc_BufferError,
562 "destination is too small to receive data from source");
563 PyBuffer_Release(&view_dest);
564 PyBuffer_Release(&view_src);
565 return -1;
566 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
569 PyBuffer_IsContiguous(&view_src, 'C')) ||
570 (PyBuffer_IsContiguous(&view_dest, 'F') &&
571 PyBuffer_IsContiguous(&view_src, 'F'))) {
572 /* simplest copy is all that is needed */
573 memcpy(view_dest.buf, view_src.buf, view_src.len);
574 PyBuffer_Release(&view_dest);
575 PyBuffer_Release(&view_src);
576 return 0;
577 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 /* XXX(nnorwitz): need to check for overflow! */
582 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
583 if (indices == NULL) {
584 PyErr_NoMemory();
585 PyBuffer_Release(&view_dest);
586 PyBuffer_Release(&view_src);
587 return -1;
588 }
589 for (k=0; k<view_src.ndim;k++) {
590 indices[k] = 0;
591 }
592 elements = 1;
593 for (k=0; k<view_src.ndim; k++) {
594 /* XXX(nnorwitz): can this overflow? */
595 elements *= view_src.shape[k];
596 }
597 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000598 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 dptr = PyBuffer_GetPointer(&view_dest, indices);
600 sptr = PyBuffer_GetPointer(&view_src, indices);
601 memcpy(dptr, sptr, view_src.itemsize);
602 }
603 PyMem_Free(indices);
604 PyBuffer_Release(&view_dest);
605 PyBuffer_Release(&view_src);
606 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000607}
608
609void
610PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 Py_ssize_t *strides, int itemsize,
612 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 int k;
615 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 sd = itemsize;
618 if (fort == 'F') {
619 for (k=0; k<nd; k++) {
620 strides[k] = sd;
621 sd *= shape[k];
622 }
623 }
624 else {
625 for (k=nd-1; k>=0; k--) {
626 strides[k] = sd;
627 sd *= shape[k];
628 }
629 }
630 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000631}
632
633int
Martin v. Löwis423be952008-08-13 15:53:07 +0000634PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100635 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000636{
Stefan Krah5178d912015-02-03 16:57:21 +0100637 if (view == NULL) {
638 PyErr_SetString(PyExc_BufferError,
Victor Stinner61b64922020-06-23 15:55:06 +0200639 "PyBuffer_FillInfo: view==NULL argument is obsolete");
Stefan Krah5178d912015-02-03 16:57:21 +0100640 return -1;
641 }
642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
644 (readonly == 1)) {
645 PyErr_SetString(PyExc_BufferError,
646 "Object is not writable.");
647 return -1;
648 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 view->obj = obj;
651 if (obj)
652 Py_INCREF(obj);
653 view->buf = buf;
654 view->len = len;
655 view->readonly = readonly;
656 view->itemsize = 1;
657 view->format = NULL;
658 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
659 view->format = "B";
660 view->ndim = 1;
661 view->shape = NULL;
662 if ((flags & PyBUF_ND) == PyBUF_ND)
663 view->shape = &(view->len);
664 view->strides = NULL;
665 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
666 view->strides = &(view->itemsize);
667 view->suboffsets = NULL;
668 view->internal = NULL;
669 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000670}
671
Martin v. Löwis423be952008-08-13 15:53:07 +0000672void
673PyBuffer_Release(Py_buffer *view)
674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200676 PyBufferProcs *pb;
677 if (obj == NULL)
678 return;
679 pb = Py_TYPE(obj)->tp_as_buffer;
Victor Stinnera6192632021-01-29 16:53:03 +0100680 if (pb && pb->bf_releasebuffer) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200681 pb->bf_releasebuffer(obj, view);
Victor Stinnera6192632021-01-29 16:53:03 +0100682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200684 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000685}
686
Eric Smith8fd3eba2008-02-17 19:48:00 +0000687PyObject *
688PyObject_Format(PyObject *obj, PyObject *format_spec)
689{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000690 PyObject *meth;
691 PyObject *empty = NULL;
692 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500693 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000694
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300695 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
696 PyErr_Format(PyExc_SystemError,
697 "Format specifier must be a string, not %.200s",
698 Py_TYPE(format_spec)->tp_name);
699 return NULL;
700 }
701
702 /* Fast path for common types. */
703 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
704 if (PyUnicode_CheckExact(obj)) {
705 Py_INCREF(obj);
706 return obj;
707 }
708 if (PyLong_CheckExact(obj)) {
709 return PyObject_Str(obj);
710 }
711 }
712
Eric Smith8fd3eba2008-02-17 19:48:00 +0000713 /* If no format_spec is provided, use an empty string */
714 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100715 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000716 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000717 }
718
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300719 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500720 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000721 if (meth == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200722 PyThreadState *tstate = _PyThreadState_GET();
723 if (!_PyErr_Occurred(tstate)) {
724 _PyErr_Format(tstate, PyExc_TypeError,
725 "Type %.100s doesn't define __format__",
726 Py_TYPE(obj)->tp_name);
727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000729 }
730
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000731 /* And call it. */
Petr Viktorinffd97532020-02-11 17:46:57 +0100732 result = PyObject_CallOneArg(meth, format_spec);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000733 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000734
735 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800736 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +0200737 "__format__ must return a str, not %.200s",
738 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000739 Py_DECREF(result);
740 result = NULL;
741 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000742 }
743
744done:
745 Py_XDECREF(empty);
746 return result;
747}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000748/* Operations on numbers */
749
750int
Fred Drake79912472000-07-09 04:06:11 +0000751PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000752{
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300753 if (o == NULL)
754 return 0;
755 PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
756 return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
Guido van Rossume15dee51995-07-18 14:12:02 +0000757}
758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000760
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761#define NB_SLOT(x) offsetof(PyNumberMethods, x)
762#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766
767/*
768 Calling scheme used for binary operations:
769
Neal Norwitz4886cc32006-08-21 17:06:07 +0000770 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000772
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100773 [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
774 Py_TYPE(v)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000775 */
776
777static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +0100778binary_op1(PyObject *v, PyObject *w, const int op_slot
779#ifndef NDEBUG
780 , const char *op_name
781#endif
782 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000783{
Victor Stinnera6192632021-01-29 16:53:03 +0100784 binaryfunc slotv;
785 if (Py_TYPE(v)->tp_as_number != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100786 slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 }
Victor Stinnera6192632021-01-29 16:53:03 +0100788 else {
789 slotv = NULL;
790 }
791
792 binaryfunc slotw;
793 if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) {
794 slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
795 if (slotw == slotv) {
796 slotw = NULL;
797 }
798 }
799 else {
800 slotw = NULL;
801 }
802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100804 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100805 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 x = slotw(v, w);
807 if (x != Py_NotImplemented)
808 return x;
809 Py_DECREF(x); /* can't do it */
810 slotw = NULL;
811 }
812 x = slotv(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +0100813 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
814 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100816 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 Py_DECREF(x); /* can't do it */
818 }
819 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +0100820 PyObject *x = slotw(v, w);
821 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
822 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 Py_DECREF(x); /* can't do it */
826 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500827 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000828}
Guido van Rossum77660912002-04-16 16:32:50 +0000829
Victor Stinnera6192632021-01-29 16:53:03 +0100830#ifdef NDEBUG
831# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot)
832#else
833# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot, op_name)
834#endif
835
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000836static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000837binop_type_error(PyObject *v, PyObject *w, const char *op_name)
838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 PyErr_Format(PyExc_TypeError,
840 "unsupported operand type(s) for %.100s: "
841 "'%.100s' and '%.100s'",
842 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100843 Py_TYPE(v)->tp_name,
844 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000846}
847
848static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000849binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
850{
Victor Stinnera6192632021-01-29 16:53:03 +0100851 PyObject *result = BINARY_OP1(v, w, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 if (result == Py_NotImplemented) {
853 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530854
855 if (op_slot == NB_SLOT(nb_rshift) &&
scoder4c9ea092020-05-12 16:12:41 +0200856 PyCFunction_CheckExact(v) &&
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530857 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
858 {
859 PyErr_Format(PyExc_TypeError,
860 "unsupported operand type(s) for %.100s: "
861 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530862 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530863 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100864 Py_TYPE(v)->tp_name,
865 Py_TYPE(w)->tp_name);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530866 return NULL;
867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return binop_type_error(v, w, op_name);
869 }
870 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000871}
872
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873
874/*
875 Calling scheme used for ternary operations:
876
Neal Norwitz4886cc32006-08-21 17:06:07 +0000877 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000879 */
880
881static PyObject *
882ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 PyObject *w,
884 PyObject *z,
Alexcc02b4f2021-02-26 21:58:39 +0200885 const int op_slot,
886 const char *op_name
Victor Stinnera6192632021-01-29 16:53:03 +0100887 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000888{
Victor Stinnera6192632021-01-29 16:53:03 +0100889 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
890 PyNumberMethods *mw = Py_TYPE(w)->tp_as_number;
Guido van Rossum77660912002-04-16 16:32:50 +0000891
Victor Stinnera6192632021-01-29 16:53:03 +0100892 ternaryfunc slotv;
893 if (mv != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 slotv = NB_TERNOP(mv, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100895 }
896 else {
897 slotv = NULL;
898 }
899
900 ternaryfunc slotw;
Andy Lester55728702020-03-06 16:53:17 -0600901 if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 slotw = NB_TERNOP(mw, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100903 if (slotw == slotv) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 slotw = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100905 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 }
Victor Stinnera6192632021-01-29 16:53:03 +0100907 else {
908 slotw = NULL;
909 }
910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100912 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100913 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 x = slotw(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +0100915 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100917 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 Py_DECREF(x); /* can't do it */
919 slotw = NULL;
920 }
921 x = slotv(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +0100922 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
923 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100925 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 Py_DECREF(x); /* can't do it */
927 }
928 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +0100929 PyObject *x = slotw(v, w, z);
930 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
931 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100933 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 Py_DECREF(x); /* can't do it */
935 }
Victor Stinnera6192632021-01-29 16:53:03 +0100936
937 PyNumberMethods *mz = Py_TYPE(z)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 if (mz != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +0100939 ternaryfunc slotz = NB_TERNOP(mz, op_slot);
940 if (slotz == slotv || slotz == slotw) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 slotz = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100942 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 if (slotz) {
Victor Stinnera6192632021-01-29 16:53:03 +0100944 PyObject *x = slotz(v, w, z);
945 assert(_Py_CheckSlotResult(z, op_name, x != NULL));
946 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100948 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 Py_DECREF(x); /* can't do it */
950 }
951 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000952
Victor Stinnera6192632021-01-29 16:53:03 +0100953 if (z == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 PyErr_Format(
955 PyExc_TypeError,
Alexcc02b4f2021-02-26 21:58:39 +0200956 "unsupported operand type(s) for %.100s: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 "'%.100s' and '%.100s'",
Alexcc02b4f2021-02-26 21:58:39 +0200958 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100959 Py_TYPE(v)->tp_name,
960 Py_TYPE(w)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +0100961 }
962 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 PyErr_Format(
964 PyExc_TypeError,
Alexcc02b4f2021-02-26 21:58:39 +0200965 "unsupported operand type(s) for %.100s: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 "'%.100s', '%.100s', '%.100s'",
Alexcc02b4f2021-02-26 21:58:39 +0200967 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100968 Py_TYPE(v)->tp_name,
969 Py_TYPE(w)->tp_name,
970 Py_TYPE(z)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +0100971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973}
974
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000975#define BINARY_FUNC(func, op, op_name) \
976 PyObject * \
977 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000979 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000980
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000981BINARY_FUNC(PyNumber_Or, nb_or, "|")
982BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
983BINARY_FUNC(PyNumber_And, nb_and, "&")
984BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
985BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
986BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000987BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000988
989PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000990PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000991{
Victor Stinnera6192632021-01-29 16:53:03 +0100992 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+");
993 if (result != Py_NotImplemented) {
994 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 }
Victor Stinnera6192632021-01-29 16:53:03 +0100996 Py_DECREF(result);
997
998 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
999 if (m && m->sq_concat) {
1000 result = (*m->sq_concat)(v, w);
1001 assert(_Py_CheckSlotResult(v, "+", result != NULL));
1002 return result;
1003 }
1004
1005 return binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001006}
1007
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001008static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001009sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 Py_ssize_t count;
Victor Stinnera15e2602020-04-08 02:01:56 +02001012 if (_PyIndex_Check(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Victor Stinnera6192632021-01-29 16:53:03 +01001014 if (count == -1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001016 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 }
1018 else {
1019 return type_error("can't multiply sequence by "
1020 "non-int of type '%.200s'", n);
1021 }
Victor Stinnera6192632021-01-29 16:53:03 +01001022 PyObject *res = (*repeatfunc)(seq, count);
1023 assert(_Py_CheckSlotResult(seq, "*", res != NULL));
1024 return res;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001025}
1026
1027PyObject *
1028PyNumber_Multiply(PyObject *v, PyObject *w)
1029{
Victor Stinnera6192632021-01-29 16:53:03 +01001030 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001032 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1033 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 Py_DECREF(result);
1035 if (mv && mv->sq_repeat) {
1036 return sequence_repeat(mv->sq_repeat, v, w);
1037 }
1038 else if (mw && mw->sq_repeat) {
1039 return sequence_repeat(mw->sq_repeat, w, v);
1040 }
1041 result = binop_type_error(v, w, "*");
1042 }
1043 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001044}
1045
Guido van Rossume15dee51995-07-18 14:12:02 +00001046PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001047PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
1048{
1049 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
1050}
1051
1052PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001053PyNumber_FloorDivide(PyObject *v, PyObject *w)
1054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001056}
1057
1058PyObject *
1059PyNumber_TrueDivide(PyObject *v, PyObject *w)
1060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001062}
1063
1064PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001065PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001068}
1069
1070PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001071PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001072{
Alexcc02b4f2021-02-26 21:58:39 +02001073 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001074}
1075
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001076/* Binary in-place operators */
1077
1078/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001079 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001080
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001081 - If the left hand object has the appropriate struct members, and
1082 they are filled, call the appropriate function and return the
1083 result. No coercion is done on the arguments; the left-hand object
1084 is the one the operation is performed on, and it's up to the
1085 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001086
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001087 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001088 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001089
1090 */
1091
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001092static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +01001093binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot
1094#ifndef NDEBUG
1095 , const char *op_name
1096#endif
1097 )
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001098{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001099 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 if (mv != NULL) {
1101 binaryfunc slot = NB_BINOP(mv, iop_slot);
1102 if (slot) {
1103 PyObject *x = (slot)(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +01001104 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 if (x != Py_NotImplemented) {
1106 return x;
1107 }
1108 Py_DECREF(x);
1109 }
1110 }
Victor Stinnera6192632021-01-29 16:53:03 +01001111#ifdef NDEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 return binary_op1(v, w, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +01001113#else
1114 return binary_op1(v, w, op_slot, op_name);
1115#endif
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001116}
1117
Victor Stinnera6192632021-01-29 16:53:03 +01001118#ifdef NDEBUG
1119# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot)
1120#else
1121# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot, op_name)
1122#endif
1123
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001124static PyObject *
1125binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001127{
Victor Stinnera6192632021-01-29 16:53:03 +01001128 PyObject *result = BINARY_IOP1(v, w, iop_slot, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 if (result == Py_NotImplemented) {
1130 Py_DECREF(result);
1131 return binop_type_error(v, w, op_name);
1132 }
1133 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001134}
1135
Alexcc02b4f2021-02-26 21:58:39 +02001136static PyObject *
1137ternary_iop(PyObject *v, PyObject *w, PyObject *z, const int iop_slot, const int op_slot,
1138 const char *op_name)
1139{
1140 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
1141 if (mv != NULL) {
1142 ternaryfunc slot = NB_TERNOP(mv, iop_slot);
1143 if (slot) {
1144 PyObject *x = (slot)(v, w, z);
1145 if (x != Py_NotImplemented) {
1146 return x;
1147 }
1148 Py_DECREF(x);
1149 }
1150 }
1151 return ternary_op(v, w, z, op_slot, op_name);
1152}
1153
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001154#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 PyObject * \
1156 func(PyObject *v, PyObject *w) { \
1157 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1158 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001159
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001160INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1161INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1162INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1163INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1164INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1165INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001166INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001167
1168PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001169PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1172 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001173}
1174
1175PyObject *
1176PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1179 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001180}
1181
1182PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001183PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1184{
Victor Stinnera6192632021-01-29 16:53:03 +01001185 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add),
1186 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001188 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 Py_DECREF(result);
1190 if (m != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +01001191 binaryfunc func = m->sq_inplace_concat;
1192 if (func == NULL)
1193 func = m->sq_concat;
1194 if (func != NULL) {
1195 result = func(v, w);
1196 assert(_Py_CheckSlotResult(v, "+=", result != NULL));
1197 return result;
1198 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 }
1200 result = binop_type_error(v, w, "+=");
1201 }
1202 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001203}
1204
1205PyObject *
1206PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1207{
Victor Stinnera6192632021-01-29 16:53:03 +01001208 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply),
1209 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 if (result == Py_NotImplemented) {
1211 ssizeargfunc f = NULL;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001212 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1213 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 Py_DECREF(result);
1215 if (mv != NULL) {
1216 f = mv->sq_inplace_repeat;
1217 if (f == NULL)
1218 f = mv->sq_repeat;
1219 if (f != NULL)
1220 return sequence_repeat(f, v, w);
1221 }
1222 else if (mw != NULL) {
1223 /* Note that the right hand operand should not be
1224 * mutated in this case so sq_inplace_repeat is not
1225 * used. */
1226 if (mw->sq_repeat)
1227 return sequence_repeat(mw->sq_repeat, w, v);
1228 }
1229 result = binop_type_error(v, w, "*=");
1230 }
1231 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001232}
1233
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001234PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001235PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1236{
1237 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1238 NB_SLOT(nb_matrix_multiply), "@=");
1239}
1240
1241PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001242PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1245 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001246}
1247
1248PyObject *
1249PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1250{
Alexcc02b4f2021-02-26 21:58:39 +02001251 return ternary_iop(v, w, z, NB_SLOT(nb_inplace_power),
1252 NB_SLOT(nb_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001253}
1254
1255
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001256/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001257
1258PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001259PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001260{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001261 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001263 }
1264
Victor Stinnera6192632021-01-29 16:53:03 +01001265 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1266 if (m && m->nb_negative) {
1267 PyObject *res = (*m->nb_negative)(o);
1268 assert(_Py_CheckSlotResult(o, "__neg__", res != NULL));
1269 return res;
1270 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001273}
1274
1275PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001276PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001277{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001278 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001280 }
1281
Victor Stinnera6192632021-01-29 16:53:03 +01001282 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1283 if (m && m->nb_positive) {
1284 PyObject *res = (*m->nb_positive)(o);
1285 assert(_Py_CheckSlotResult(o, "__pos__", res != NULL));
1286 return res;
1287 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001290}
1291
1292PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001293PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001294{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001295 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001297 }
1298
Victor Stinnera6192632021-01-29 16:53:03 +01001299 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1300 if (m && m->nb_invert) {
1301 PyObject *res = (*m->nb_invert)(o);
1302 assert(_Py_CheckSlotResult(o, "__invert__", res != NULL));
1303 return res;
1304 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001307}
1308
1309PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001310PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001311{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001312 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001314 }
1315
Victor Stinnera6192632021-01-29 16:53:03 +01001316 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1317 if (m && m->nb_absolute) {
1318 PyObject *res = m->nb_absolute(o);
1319 assert(_Py_CheckSlotResult(o, "__abs__", res != NULL));
1320 return res;
1321 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001324}
1325
Victor Stinnera15e2602020-04-08 02:01:56 +02001326
Christian Tismerea62ce72018-06-09 20:32:25 +02001327int
1328PyIndex_Check(PyObject *obj)
1329{
Victor Stinnera15e2602020-04-08 02:01:56 +02001330 return _PyIndex_Check(obj);
Christian Tismerea62ce72018-06-09 20:32:25 +02001331}
1332
Victor Stinnera15e2602020-04-08 02:01:56 +02001333
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001334/* Return a Python int from the object item.
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001335 Can return an instance of int subclass.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001336 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001337 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001338*/
1339PyObject *
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001340_PyNumber_Index(PyObject *item)
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001341{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001342 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001344 }
1345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 if (PyLong_Check(item)) {
1347 Py_INCREF(item);
1348 return item;
1349 }
Victor Stinnera15e2602020-04-08 02:01:56 +02001350 if (!_PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 PyErr_Format(PyExc_TypeError,
1352 "'%.200s' object cannot be interpreted "
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001353 "as an integer", Py_TYPE(item)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001354 return NULL;
1355 }
Victor Stinnera6192632021-01-29 16:53:03 +01001356
1357 PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
1358 assert(_Py_CheckSlotResult(item, "__index__", result != NULL));
1359 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001360 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001361 }
1362
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001363 if (!PyLong_Check(result)) {
1364 PyErr_Format(PyExc_TypeError,
1365 "__index__ returned non-int (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001366 Py_TYPE(result)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001367 Py_DECREF(result);
1368 return NULL;
1369 }
1370 /* Issue #17576: warn if 'result' not of exact type int. */
1371 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1372 "__index__ returned non-int (type %.200s). "
1373 "The ability to return an instance of a strict subclass of int "
1374 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001375 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001376 Py_DECREF(result);
1377 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 }
1379 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001380}
1381
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001382/* Return an exact Python int from the object item.
1383 Raise TypeError if the result is not an int
1384 or if the object cannot be interpreted as an index.
1385*/
1386PyObject *
1387PyNumber_Index(PyObject *item)
1388{
1389 PyObject *result = _PyNumber_Index(item);
1390 if (result != NULL && !PyLong_CheckExact(result)) {
1391 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1392 }
1393 return result;
1394}
1395
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001396/* Return an error on Overflow only if err is not NULL*/
1397
1398Py_ssize_t
1399PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 Py_ssize_t result;
1402 PyObject *runerr;
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001403 PyObject *value = _PyNumber_Index(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (value == NULL)
1405 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 /* We're done if PyLong_AsSsize_t() returns without error. */
1408 result = PyLong_AsSsize_t(value);
Victor Stinner61b64922020-06-23 15:55:06 +02001409 if (result != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001411
Victor Stinner61b64922020-06-23 15:55:06 +02001412 PyThreadState *tstate = _PyThreadState_GET();
1413 runerr = _PyErr_Occurred(tstate);
1414 if (!runerr) {
1415 goto finish;
1416 }
1417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 /* Error handling code -- only manage OverflowError differently */
Victor Stinner61b64922020-06-23 15:55:06 +02001419 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 goto finish;
Victor Stinner61b64922020-06-23 15:55:06 +02001421 }
1422 _PyErr_Clear(tstate);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* If no error-handling desired then the default clipping
Victor Stinner61b64922020-06-23 15:55:06 +02001425 is sufficient. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 if (!err) {
1427 assert(PyLong_Check(value));
1428 /* Whether or not it is less than or equal to
1429 zero is determined by the sign of ob_size
1430 */
1431 if (_PyLong_Sign(value) < 0)
1432 result = PY_SSIZE_T_MIN;
1433 else
1434 result = PY_SSIZE_T_MAX;
1435 }
1436 else {
1437 /* Otherwise replace the error with caller's error object. */
Victor Stinner61b64922020-06-23 15:55:06 +02001438 _PyErr_Format(tstate, err,
1439 "cannot fit '%.200s' into an index-sized integer",
1440 Py_TYPE(item)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001442
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001443 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 Py_DECREF(value);
1445 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001446}
1447
1448
Guido van Rossume15dee51995-07-18 14:12:02 +00001449PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001450PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001451{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001452 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001455 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001456 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001457
Victor Stinner71aea8e2016-08-19 16:59:55 +02001458 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001460 }
1461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 if (PyLong_CheckExact(o)) {
1463 Py_INCREF(o);
1464 return o;
1465 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001466 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001468 /* Convert using the nb_int slot, which should return something
1469 of exact type int. */
1470 result = m->nb_int(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001471 assert(_Py_CheckSlotResult(o, "__int__", result != NULL));
1472 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001473 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001474 }
1475
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001476 if (!PyLong_Check(result)) {
1477 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +02001478 "__int__ returned non-int (type %.200s)",
Victor Stinner8182cc22020-07-10 12:40:38 +02001479 Py_TYPE(result)->tp_name);
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001480 Py_DECREF(result);
1481 return NULL;
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001482 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001483 /* Issue #17576: warn if 'result' not of exact type int. */
1484 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1485 "__int__ returned non-int (type %.200s). "
1486 "The ability to return an instance of a strict subclass of int "
1487 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner8182cc22020-07-10 12:40:38 +02001488 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001489 Py_DECREF(result);
1490 return NULL;
1491 }
1492 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001493 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 }
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001495 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001496 return PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001497 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001498 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001500 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001502 if (result == NULL || PyLong_CheckExact(result)) {
1503 return result;
1504 }
1505 if (PyLong_Check(result)) {
1506 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1507 return result;
1508 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001510 but int() needs to return an int. */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001511 if (!PyIndex_Check(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001512 PyErr_Format(
1513 PyExc_TypeError,
1514 "__trunc__ returned non-Integral (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001515 Py_TYPE(result)->tp_name);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001516 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001517 return NULL;
1518 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001519 Py_SETREF(result, PyNumber_Index(result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001520 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001522 if (PyErr_Occurred())
1523 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001524
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001525 if (PyUnicode_Check(o))
Inada Naokie4f1fe62020-06-29 13:00:43 +09001526 /* The below check is done in PyLong_FromUnicodeObject(). */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001527 return PyLong_FromUnicodeObject(o, 10);
1528
Martin Pantereeb896c2015-11-07 02:32:21 +00001529 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001531 * doesn't do. In particular int('9\x005') must raise an
1532 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001534 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1535 PyBytes_GET_SIZE(o), 10);
1536
1537 if (PyByteArray_Check(o))
1538 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1539 PyByteArray_GET_SIZE(o), 10);
1540
1541 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001542 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001543
1544 /* Copy to NUL-terminated buffer. */
1545 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1546 if (bytes == NULL) {
1547 PyBuffer_Release(&view);
1548 return NULL;
1549 }
1550 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1551 PyBytes_GET_SIZE(bytes), 10);
1552 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001553 PyBuffer_Release(&view);
1554 return result;
1555 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001556
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001557 return type_error("int() argument must be a string, a bytes-like object "
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +03001558 "or a real number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001559}
1560
1561PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001562PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001563{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001564 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001566 }
1567
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001568 if (PyFloat_CheckExact(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001569 return Py_NewRef(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001570 }
Victor Stinnera6192632021-01-29 16:53:03 +01001571
1572 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 if (m && m->nb_float) { /* This should include subclasses of float */
1574 PyObject *res = m->nb_float(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001575 assert(_Py_CheckSlotResult(o, "__float__", res != NULL));
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001576 if (!res || PyFloat_CheckExact(res)) {
1577 return res;
1578 }
Victor Stinnera6192632021-01-29 16:53:03 +01001579
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001580 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001582 "%.50s.__float__ returned non-float (type %.50s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001583 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001584 Py_DECREF(res);
1585 return NULL;
1586 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001587 /* Issue #26983: warn if 'res' not of exact type float. */
1588 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1589 "%.50s.__float__ returned non-float (type %.50s). "
1590 "The ability to return an instance of a strict subclass of float "
1591 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001592 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001593 Py_DECREF(res);
1594 return NULL;
1595 }
Victor Stinnera6192632021-01-29 16:53:03 +01001596 double val = PyFloat_AS_DOUBLE(res);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001597 Py_DECREF(res);
1598 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 }
Victor Stinnera6192632021-01-29 16:53:03 +01001600
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001601 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001602 PyObject *res = _PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001603 if (!res) {
1604 return NULL;
1605 }
1606 double val = PyLong_AsDouble(res);
1607 Py_DECREF(res);
1608 if (val == -1.0 && PyErr_Occurred()) {
1609 return NULL;
1610 }
1611 return PyFloat_FromDouble(val);
1612 }
Victor Stinnera6192632021-01-29 16:53:03 +01001613
1614 /* A float subclass with nb_float == NULL */
1615 if (PyFloat_Check(o)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001616 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 }
1618 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001619}
1620
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001621
1622PyObject *
1623PyNumber_ToBase(PyObject *n, int base)
1624{
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001625 if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
1626 PyErr_SetString(PyExc_SystemError,
1627 "PyNumber_ToBase: base must be 2, 8, 10 or 16");
1628 return NULL;
1629 }
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001630 PyObject *index = _PyNumber_Index(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 if (!index)
1632 return NULL;
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001633 PyObject *res = _PyLong_Format(index, base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 Py_DECREF(index);
1635 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001636}
1637
1638
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001639/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001640
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001641int
Fred Drake79912472000-07-09 04:06:11 +00001642PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 if (PyDict_Check(s))
1645 return 0;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001646 return Py_TYPE(s)->tp_as_sequence &&
1647 Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001648}
1649
Martin v. Löwis18e16552006-02-15 17:27:45 +00001650Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001651PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (s == NULL) {
1654 null_error();
1655 return -1;
1656 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001657
Victor Stinnera6192632021-01-29 16:53:03 +01001658 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001659 if (m && m->sq_length) {
1660 Py_ssize_t len = m->sq_length(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001661 assert(_Py_CheckSlotResult(s, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001662 return len;
1663 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001664
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001665 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001666 type_error("%.200s is not a sequence", s);
1667 return -1;
1668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 type_error("object of type '%.200s' has no len()", s);
1670 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001671}
1672
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001673#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001674Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001675PySequence_Length(PyObject *s)
1676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001677 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001678}
1679#define PySequence_Length PySequence_Size
1680
Guido van Rossume15dee51995-07-18 14:12:02 +00001681PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001682PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001683{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001684 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001686 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001687
Victor Stinnera6192632021-01-29 16:53:03 +01001688 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1689 if (m && m->sq_concat) {
1690 PyObject *res = m->sq_concat(s, o);
1691 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1692 return res;
1693 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 /* Instances of user classes defining an __add__() method only
1696 have an nb_add slot, not an sq_concat slot. So we fall back
1697 to nb_add if both arguments appear to be sequences. */
1698 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001699 PyObject *result = BINARY_OP1(s, o, NB_SLOT(nb_add), "+");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 if (result != Py_NotImplemented)
1701 return result;
1702 Py_DECREF(result);
1703 }
1704 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001705}
1706
1707PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001708PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001709{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001710 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001712 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001713
Victor Stinnera6192632021-01-29 16:53:03 +01001714 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1715 if (m && m->sq_repeat) {
1716 PyObject *res = m->sq_repeat(o, count);
1717 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1718 return res;
1719 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 /* Instances of user classes defining a __mul__() method only
1722 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1723 to nb_multiply if o appears to be a sequence. */
1724 if (PySequence_Check(o)) {
1725 PyObject *n, *result;
1726 n = PyLong_FromSsize_t(count);
1727 if (n == NULL)
1728 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001729 result = BINARY_OP1(o, n, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 Py_DECREF(n);
1731 if (result != Py_NotImplemented)
1732 return result;
1733 Py_DECREF(result);
1734 }
1735 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001736}
1737
1738PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001739PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1740{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001741 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001743 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001744
Victor Stinnera6192632021-01-29 16:53:03 +01001745 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1746 if (m && m->sq_inplace_concat) {
1747 PyObject *res = m->sq_inplace_concat(s, o);
1748 assert(_Py_CheckSlotResult(s, "+=", res != NULL));
1749 return res;
1750 }
1751 if (m && m->sq_concat) {
1752 PyObject *res = m->sq_concat(s, o);
1753 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1754 return res;
1755 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001758 PyObject *result = BINARY_IOP1(s, o, NB_SLOT(nb_inplace_add),
1759 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 if (result != Py_NotImplemented)
1761 return result;
1762 Py_DECREF(result);
1763 }
1764 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001765}
1766
1767PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001768PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001769{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001770 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001772 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001773
Victor Stinnera6192632021-01-29 16:53:03 +01001774 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1775 if (m && m->sq_inplace_repeat) {
1776 PyObject *res = m->sq_inplace_repeat(o, count);
1777 assert(_Py_CheckSlotResult(o, "*=", res != NULL));
1778 return res;
1779 }
1780 if (m && m->sq_repeat) {
1781 PyObject *res = m->sq_repeat(o, count);
1782 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1783 return res;
1784 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 if (PySequence_Check(o)) {
1787 PyObject *n, *result;
1788 n = PyLong_FromSsize_t(count);
1789 if (n == NULL)
1790 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001791 result = BINARY_IOP1(o, n, NB_SLOT(nb_inplace_multiply),
1792 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 Py_DECREF(n);
1794 if (result != Py_NotImplemented)
1795 return result;
1796 Py_DECREF(result);
1797 }
1798 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001799}
1800
1801PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001802PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001803{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001804 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001806 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001807
Victor Stinnera6192632021-01-29 16:53:03 +01001808 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 if (m && m->sq_item) {
1810 if (i < 0) {
1811 if (m->sq_length) {
1812 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001813 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Victor Stinnere20310f2015-11-05 13:56:58 +01001814 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001816 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 i += l;
1818 }
1819 }
Victor Stinnera6192632021-01-29 16:53:03 +01001820 PyObject *res = m->sq_item(s, i);
1821 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
1822 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001824
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001825 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001826 return type_error("%.200s is not a sequence", s);
1827 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001829}
1830
1831PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001832PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001833{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001834 if (!s) {
1835 return null_error();
1836 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001837
Victor Stinnera6192632021-01-29 16:53:03 +01001838 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001839 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01001841 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001843 }
1844 PyObject *res = mp->mp_subscript(s, slice);
1845 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 Py_DECREF(slice);
1847 return res;
1848 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001851}
1852
1853int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001854PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (s == NULL) {
1857 null_error();
1858 return -1;
1859 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001860
Victor Stinnera6192632021-01-29 16:53:03 +01001861 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 if (m && m->sq_ass_item) {
1863 if (i < 0) {
1864 if (m->sq_length) {
1865 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001866 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001867 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001869 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 i += l;
1871 }
1872 }
Victor Stinnera6192632021-01-29 16:53:03 +01001873 int res = m->sq_ass_item(s, i, o);
1874 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
1875 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001877
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001878 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001879 type_error("%.200s is not a sequence", s);
1880 return -1;
1881 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001882 type_error("'%.200s' object does not support item assignment", s);
1883 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001884}
1885
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001886int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (s == NULL) {
1890 null_error();
1891 return -1;
1892 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001893
Victor Stinnera6192632021-01-29 16:53:03 +01001894 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 if (m && m->sq_ass_item) {
1896 if (i < 0) {
1897 if (m->sq_length) {
1898 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001899 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001900 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001902 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 i += l;
1904 }
1905 }
Victor Stinnera6192632021-01-29 16:53:03 +01001906 int res = m->sq_ass_item(s, i, (PyObject *)NULL);
1907 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
1908 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001910
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001911 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001912 type_error("%.200s is not a sequence", s);
1913 return -1;
1914 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 type_error("'%.200s' object doesn't support item deletion", s);
1916 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001917}
1918
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001919int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001920PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 if (s == NULL) {
1923 null_error();
1924 return -1;
1925 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001926
Victor Stinnera6192632021-01-29 16:53:03 +01001927 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001928 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 PyObject *slice = _PySlice_FromIndices(i1, i2);
1930 if (!slice)
1931 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01001932 int res = mp->mp_ass_subscript(s, slice, o);
1933 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 Py_DECREF(slice);
1935 return res;
1936 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 type_error("'%.200s' object doesn't support slice assignment", s);
1939 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001940}
1941
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001942int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001943PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 if (s == NULL) {
1946 null_error();
1947 return -1;
1948 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001949
Victor Stinnera6192632021-01-29 16:53:03 +01001950 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001951 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01001953 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001954 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01001955 }
1956 int res = mp->mp_ass_subscript(s, slice, NULL);
1957 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 Py_DECREF(slice);
1959 return res;
1960 }
1961 type_error("'%.200s' object doesn't support slice deletion", s);
1962 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001963}
1964
Guido van Rossume15dee51995-07-18 14:12:02 +00001965PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001966PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 PyObject *it; /* iter(v) */
1969 Py_ssize_t n; /* guess for result tuple size */
1970 PyObject *result = NULL;
1971 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001972
Victor Stinner71aea8e2016-08-19 16:59:55 +02001973 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001975 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 /* Special-case the common tuple and list cases, for efficiency. */
1978 if (PyTuple_CheckExact(v)) {
1979 /* Note that we can't know whether it's safe to return
1980 a tuple *subclass* instance as-is, hence the restriction
1981 to exact tuples here. In contrast, lists always make
1982 a copy, so there's no need for exactness below. */
1983 Py_INCREF(v);
1984 return v;
1985 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001986 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 /* Get iterator. */
1990 it = PyObject_GetIter(v);
1991 if (it == NULL)
1992 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001995 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 if (n == -1)
1997 goto Fail;
1998 result = PyTuple_New(n);
1999 if (result == NULL)
2000 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 /* Fill the tuple. */
2003 for (j = 0; ; ++j) {
2004 PyObject *item = PyIter_Next(it);
2005 if (item == NULL) {
2006 if (PyErr_Occurred())
2007 goto Fail;
2008 break;
2009 }
2010 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00002011 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002012 /* The over-allocation strategy can grow a bit faster
2013 than for lists because unlike lists the
2014 over-allocation isn't permanent -- we reclaim
2015 the excess before the end of this routine.
2016 So, grow by ten and then add 25%.
2017 */
Martin Pantere8db8612016-07-25 02:30:05 +00002018 newn += 10u;
2019 newn += newn >> 2;
2020 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* Check for overflow */
2022 PyErr_NoMemory();
2023 Py_DECREF(item);
2024 goto Fail;
2025 }
Martin Pantere8db8612016-07-25 02:30:05 +00002026 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 if (_PyTuple_Resize(&result, n) != 0) {
2028 Py_DECREF(item);
2029 goto Fail;
2030 }
2031 }
2032 PyTuple_SET_ITEM(result, j, item);
2033 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 /* Cut tuple back if guess was too large. */
2036 if (j < n &&
2037 _PyTuple_Resize(&result, j) != 0)
2038 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 Py_DECREF(it);
2041 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00002042
2043Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 Py_XDECREF(result);
2045 Py_DECREF(it);
2046 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002047}
2048
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002049PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002050PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 PyObject *result; /* result list */
2053 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002054
Victor Stinner71aea8e2016-08-19 16:59:55 +02002055 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002057 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002059 result = PyList_New(0);
2060 if (result == NULL)
2061 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00002062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 rv = _PyList_Extend((PyListObject *)result, v);
2064 if (rv == NULL) {
2065 Py_DECREF(result);
2066 return NULL;
2067 }
2068 Py_DECREF(rv);
2069 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002070}
2071
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002072PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002073PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002076
Victor Stinner71aea8e2016-08-19 16:59:55 +02002077 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002078 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002079 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
2082 Py_INCREF(v);
2083 return v;
2084 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 it = PyObject_GetIter(v);
2087 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002088 PyThreadState *tstate = _PyThreadState_GET();
2089 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2090 _PyErr_SetString(tstate, PyExc_TypeError, m);
2091 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 return NULL;
2093 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 v = PySequence_List(it);
2096 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002099}
2100
Tim Peters16a77ad2001-09-08 04:00:12 +00002101/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2103 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
2104 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00002105 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2106*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002107Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002108_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002109{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 Py_ssize_t n;
2111 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2112 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 if (seq == NULL || obj == NULL) {
2115 null_error();
2116 return -1;
2117 }
Tim Peters75f8e352001-05-05 11:33:43 +00002118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 it = PyObject_GetIter(seq);
2120 if (it == NULL) {
Serhiy Storchakacafe1b62020-06-22 10:43:35 +03002121 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2122 type_error("argument of type '%.200s' is not iterable", seq);
2123 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002124 return -1;
2125 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 n = wrapped = 0;
2128 for (;;) {
2129 int cmp;
2130 PyObject *item = PyIter_Next(it);
2131 if (item == NULL) {
2132 if (PyErr_Occurred())
2133 goto Fail;
2134 break;
2135 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002136
Serhiy Storchaka18b711c2019-08-04 14:12:48 +03002137 cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 Py_DECREF(item);
2139 if (cmp < 0)
2140 goto Fail;
2141 if (cmp > 0) {
2142 switch (operation) {
2143 case PY_ITERSEARCH_COUNT:
2144 if (n == PY_SSIZE_T_MAX) {
2145 PyErr_SetString(PyExc_OverflowError,
2146 "count exceeds C integer size");
2147 goto Fail;
2148 }
2149 ++n;
2150 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 case PY_ITERSEARCH_INDEX:
2153 if (wrapped) {
2154 PyErr_SetString(PyExc_OverflowError,
2155 "index exceeds C integer size");
2156 goto Fail;
2157 }
2158 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 case PY_ITERSEARCH_CONTAINS:
2161 n = 1;
2162 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002164 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07002165 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 }
2167 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 if (operation == PY_ITERSEARCH_INDEX) {
2170 if (n == PY_SSIZE_T_MAX)
2171 wrapped = 1;
2172 ++n;
2173 }
2174 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 if (operation != PY_ITERSEARCH_INDEX)
2177 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 PyErr_SetString(PyExc_ValueError,
2180 "sequence.index(x): x not in sequence");
2181 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002182Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 n = -1;
2184 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002185Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002186 Py_DECREF(it);
2187 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002188
Guido van Rossume15dee51995-07-18 14:12:02 +00002189}
2190
Tim Peters16a77ad2001-09-08 04:00:12 +00002191/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002192Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002193PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002195 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002196}
2197
Tim Peterscb8d3682001-05-05 21:05:01 +00002198/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002199 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002200 */
2201int
2202PySequence_Contains(PyObject *seq, PyObject *ob)
2203{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002204 PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
Victor Stinnera6192632021-01-29 16:53:03 +01002205 if (sqm != NULL && sqm->sq_contains != NULL) {
2206 int res = (*sqm->sq_contains)(seq, ob);
2207 assert(_Py_CheckSlotResult(seq, "__contains__", res >= 0));
2208 return res;
2209 }
2210 Py_ssize_t result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002212}
2213
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002214/* Backwards compatibility */
2215#undef PySequence_In
2216int
Fred Drake79912472000-07-09 04:06:11 +00002217PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002220}
2221
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002222Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002223PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002225 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002226}
2227
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002228/* Operations on mappings */
2229
2230int
Fred Drake79912472000-07-09 04:06:11 +00002231PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002232{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002233 return o && Py_TYPE(o)->tp_as_mapping &&
2234 Py_TYPE(o)->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002235}
2236
Martin v. Löwis18e16552006-02-15 17:27:45 +00002237Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002238PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 if (o == NULL) {
2241 null_error();
2242 return -1;
2243 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002244
Victor Stinnera6192632021-01-29 16:53:03 +01002245 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002246 if (m && m->mp_length) {
2247 Py_ssize_t len = m->mp_length(o);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01002248 assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002249 return len;
2250 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002251
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002252 if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03002253 type_error("%.200s is not a mapping", o);
2254 return -1;
2255 }
2256 /* PyMapping_Size() can be called from PyObject_Size(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 type_error("object of type '%.200s' has no len()", o);
2258 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002259}
2260
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002261#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002262Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002263PyMapping_Length(PyObject *o)
2264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002266}
2267#define PyMapping_Length PyMapping_Size
2268
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002269PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002270PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002273
Victor Stinner71aea8e2016-08-19 16:59:55 +02002274 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002276 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002278 okey = PyUnicode_FromString(key);
2279 if (okey == NULL)
2280 return NULL;
2281 r = PyObject_GetItem(o, okey);
2282 Py_DECREF(okey);
2283 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002284}
2285
2286int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002287PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002288{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 PyObject *okey;
2290 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 if (key == NULL) {
2293 null_error();
2294 return -1;
2295 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 okey = PyUnicode_FromString(key);
2298 if (okey == NULL)
2299 return -1;
2300 r = PyObject_SetItem(o, okey, value);
2301 Py_DECREF(okey);
2302 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002303}
2304
2305int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002306PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 v = PyMapping_GetItemString(o, key);
2311 if (v) {
2312 Py_DECREF(v);
2313 return 1;
2314 }
2315 PyErr_Clear();
2316 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002317}
2318
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002319int
Fred Drake79912472000-07-09 04:06:11 +00002320PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 v = PyObject_GetItem(o, key);
2325 if (v) {
2326 Py_DECREF(v);
2327 return 1;
2328 }
2329 PyErr_Clear();
2330 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002331}
2332
Oren Milman0ccc0f62017-10-08 11:17:46 +03002333/* This function is quite similar to PySequence_Fast(), but specialized to be
2334 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2335 */
2336static PyObject *
2337method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2338{
2339 PyObject *it, *result, *meth_output;
2340
2341 assert(o != NULL);
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002342 meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002343 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2344 return meth_output;
2345 }
2346 it = PyObject_GetIter(meth_output);
2347 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002348 PyThreadState *tstate = _PyThreadState_GET();
2349 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2350 _PyErr_Format(tstate, PyExc_TypeError,
2351 "%.200s.%U() returned a non-iterable (type %.200s)",
2352 Py_TYPE(o)->tp_name,
2353 _PyUnicode_FromId(meth_id),
2354 Py_TYPE(meth_output)->tp_name);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002355 }
2356 Py_DECREF(meth_output);
2357 return NULL;
2358 }
2359 Py_DECREF(meth_output);
2360 result = PySequence_List(it);
2361 Py_DECREF(it);
2362 return result;
2363}
2364
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002365PyObject *
2366PyMapping_Keys(PyObject *o)
2367{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002368 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002369
Oren Milman0ccc0f62017-10-08 11:17:46 +03002370 if (o == NULL) {
2371 return null_error();
2372 }
2373 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002375 }
2376 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002377}
2378
2379PyObject *
2380PyMapping_Items(PyObject *o)
2381{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002382 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002383
Oren Milman0ccc0f62017-10-08 11:17:46 +03002384 if (o == NULL) {
2385 return null_error();
2386 }
2387 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002389 }
2390 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002391}
2392
2393PyObject *
2394PyMapping_Values(PyObject *o)
2395{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002396 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002397
Oren Milman0ccc0f62017-10-08 11:17:46 +03002398 if (o == NULL) {
2399 return null_error();
2400 }
2401 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002402 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002403 }
2404 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002405}
2406
Guido van Rossum823649d2001-03-21 18:40:58 +00002407/* isinstance(), issubclass() */
2408
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002409/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002410 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002411 * 1. getattr(cls, '__bases__') could raise an AttributeError
2412 * 2. getattr(cls, '__bases__') could raise some other exception
2413 * 3. getattr(cls, '__bases__') could return a tuple
2414 * 4. getattr(cls, '__bases__') could return something other than a tuple
2415 *
2416 * Only state #3 is a non-error state and only it returns a non-NULL object
2417 * (it returns the retrieved tuple).
2418 *
2419 * Any raised AttributeErrors are masked by clearing the exception and
2420 * returning NULL. If an object other than a tuple comes out of __bases__,
2421 * then again, the return value is NULL. So yes, these two situations
2422 * produce exactly the same results: NULL is returned and no error is set.
2423 *
2424 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002426 * exception to be propagated along.
2427 *
2428 * Callers are expected to test for PyErr_Occurred() when the return value
2429 * is NULL to decide whether a valid exception should be propagated or not.
2430 * When there's no exception to propagate, it's customary for the caller to
2431 * set a TypeError.
2432 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002433static PyObject *
2434abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002435{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002436 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002438
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002439 (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002440 if (bases != NULL && !PyTuple_Check(bases)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 Py_DECREF(bases);
2442 return NULL;
2443 }
2444 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002445}
2446
2447
2448static int
2449abstract_issubclass(PyObject *derived, PyObject *cls)
2450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 PyObject *bases = NULL;
2452 Py_ssize_t i, n;
2453 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 while (1) {
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002456 if (derived == cls) {
2457 Py_XDECREF(bases); /* See below comment */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 return 1;
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002459 }
2460 /* Use XSETREF to drop bases reference *after* finishing with
2461 derived; bases might be the only reference to it.
2462 XSETREF is used instead of SETREF, because bases is NULL on the
2463 first iteration of the loop.
2464 */
2465 Py_XSETREF(bases, abstract_get_bases(derived));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 if (bases == NULL) {
2467 if (PyErr_Occurred())
2468 return -1;
2469 return 0;
2470 }
2471 n = PyTuple_GET_SIZE(bases);
2472 if (n == 0) {
2473 Py_DECREF(bases);
2474 return 0;
2475 }
2476 /* Avoid recursivity in the single inheritance case */
2477 if (n == 1) {
2478 derived = PyTuple_GET_ITEM(bases, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 continue;
2480 }
2481 for (i = 0; i < n; i++) {
2482 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2483 if (r != 0)
2484 break;
2485 }
2486 Py_DECREF(bases);
2487 return r;
2488 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002489}
2490
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002491static int
2492check_class(PyObject *cls, const char *error)
2493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 PyObject *bases = abstract_get_bases(cls);
2495 if (bases == NULL) {
2496 /* Do not mask errors. */
Victor Stinner61b64922020-06-23 15:55:06 +02002497 PyThreadState *tstate = _PyThreadState_GET();
2498 if (!_PyErr_Occurred(tstate)) {
2499 _PyErr_SetString(tstate, PyExc_TypeError, error);
2500 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 return 0;
2502 }
2503 Py_DECREF(bases);
2504 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002505}
2506
Brett Cannon4f653312004-03-20 22:52:14 +00002507static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002508object_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 PyObject *icls;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002511 int retval;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002512 _Py_IDENTIFIER(__class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 if (PyType_Check(cls)) {
2514 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2515 if (retval == 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002516 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2517 if (icls != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002518 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 retval = PyType_IsSubtype(
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002520 (PyTypeObject *)icls,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 (PyTypeObject *)cls);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002522 }
2523 else {
2524 retval = 0;
2525 }
2526 Py_DECREF(icls);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 }
2528 }
2529 }
2530 else {
2531 if (!check_class(cls,
Maggie Moss1b4552c2020-09-09 13:23:24 -07002532 "isinstance() arg 2 must be a type, a tuple of types or a union"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 return -1;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002534 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2535 if (icls != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 retval = abstract_issubclass(icls, cls);
2537 Py_DECREF(icls);
2538 }
2539 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002542}
2543
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002544static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002545object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002546{
Benjamin Petersonce798522012-01-22 11:24:29 -05002547 _Py_IDENTIFIER(__instancecheck__);
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 /* Quick test for an exact match */
Andy Lesterdffe4c02020-03-04 07:15:20 -06002550 if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 return 1;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002552 }
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002553
Georg Brandl72b8a802014-10-03 09:26:37 +02002554 /* We know what type's __instancecheck__ does. */
2555 if (PyType_CheckExact(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002556 return object_isinstance(inst, cls);
Georg Brandl72b8a802014-10-03 09:26:37 +02002557 }
2558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (PyTuple_Check(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002560 /* Not a general sequence -- that opens up the road to
2561 recursion and stack overflow. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002562 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002564 }
2565 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2566 int r = 0;
2567 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002569 r = object_recursive_isinstance(tstate, inst, item);
2570 if (r != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 /* either found it, or got an error */
2572 break;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002573 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002575 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 return r;
2577 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002578
Victor Stinner850a4bd2020-02-04 13:42:13 +01002579 PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 if (checker != NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002581 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002583 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002585
Petr Viktorinffd97532020-02-11 17:46:57 +01002586 PyObject *res = PyObject_CallOneArg(checker, inst);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002587 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002589
2590 if (res == NULL) {
2591 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002593 int ok = PyObject_IsTrue(res);
2594 Py_DECREF(res);
2595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 return ok;
2597 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002598 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002600 }
2601
Victor Stinner850a4bd2020-02-04 13:42:13 +01002602 /* cls has no __instancecheck__() method */
2603 return object_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002604}
2605
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002606
2607int
2608PyObject_IsInstance(PyObject *inst, PyObject *cls)
2609{
2610 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner850a4bd2020-02-04 13:42:13 +01002611 return object_recursive_isinstance(tstate, inst, cls);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002612}
2613
2614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002616recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002618 if (PyType_Check(cls) && PyType_Check(derived)) {
2619 /* Fast path (non-recursive) */
2620 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2621 }
2622 if (!check_class(derived,
2623 "issubclass() arg 1 must be a class"))
2624 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002625
2626 PyTypeObject *type = Py_TYPE(cls);
2627 int is_union = (PyType_Check(type) && type == &_Py_UnionType);
2628 if (!is_union && !check_class(cls,
2629 "issubclass() arg 2 must be a class,"
2630 " a tuple of classes, or a union.")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002632 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002635}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002636
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002637static int
2638object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002639{
Benjamin Petersonce798522012-01-22 11:24:29 -05002640 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002641 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002642
Georg Brandl72b8a802014-10-03 09:26:37 +02002643 /* We know what type's __subclasscheck__ does. */
2644 if (PyType_CheckExact(cls)) {
2645 /* Quick test for an exact match */
2646 if (derived == cls)
2647 return 1;
2648 return recursive_issubclass(derived, cls);
2649 }
2650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 if (PyTuple_Check(cls)) {
Antoine Pitrouec569b72008-08-26 22:40:48 +00002652
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002653 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002655 }
2656 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2657 int r = 0;
2658 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002660 r = object_issubclass(tstate, derived, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 if (r != 0)
2662 /* either found it, or got an error */
2663 break;
2664 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002665 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 return r;
2667 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002668
Benjamin Petersonce798522012-01-22 11:24:29 -05002669 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 if (checker != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 int ok = -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002672 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 Py_DECREF(checker);
2674 return ok;
2675 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002676 PyObject *res = PyObject_CallOneArg(checker, derived);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002677 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 Py_DECREF(checker);
2679 if (res != NULL) {
2680 ok = PyObject_IsTrue(res);
2681 Py_DECREF(res);
2682 }
2683 return ok;
2684 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002685 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002687 }
2688
Georg Brandl72b8a802014-10-03 09:26:37 +02002689 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002691}
2692
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002693
2694int
2695PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2696{
2697 PyThreadState *tstate = _PyThreadState_GET();
2698 return object_issubclass(tstate, derived, cls);
2699}
2700
2701
Antoine Pitrouec569b72008-08-26 22:40:48 +00002702int
2703_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2704{
Victor Stinner850a4bd2020-02-04 13:42:13 +01002705 return object_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002706}
2707
2708int
2709_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002712}
2713
2714
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002715PyObject *
2716PyObject_GetIter(PyObject *o)
2717{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002718 PyTypeObject *t = Py_TYPE(o);
Victor Stinner14e6d092016-12-09 17:08:59 +01002719 getiterfunc f;
2720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 f = t->tp_iter;
2722 if (f == NULL) {
2723 if (PySequence_Check(o))
2724 return PySeqIter_New(o);
2725 return type_error("'%.200s' object is not iterable", o);
2726 }
2727 else {
2728 PyObject *res = (*f)(o);
2729 if (res != NULL && !PyIter_Check(res)) {
2730 PyErr_Format(PyExc_TypeError,
2731 "iter() returned non-iterator "
2732 "of type '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002733 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 Py_DECREF(res);
2735 res = NULL;
2736 }
2737 return res;
2738 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002739}
2740
Joshua Bronsonf0a6fde2021-03-23 18:47:21 -04002741PyObject *
2742PyObject_GetAiter(PyObject *o) {
2743 PyTypeObject *t = Py_TYPE(o);
2744 unaryfunc f;
2745
2746 if (t->tp_as_async == NULL || t->tp_as_async->am_aiter == NULL) {
2747 return type_error("'%.200s' object is not an AsyncIterable", o);
2748 }
2749 f = t->tp_as_async->am_aiter;
2750 PyObject *it = (*f)(o);
2751 if (it != NULL && !PyAiter_Check(it)) {
2752 PyErr_Format(PyExc_TypeError,
2753 "aiter() returned non-AsyncIterator of type '%.100s'",
2754 Py_TYPE(it)->tp_name);
2755 Py_DECREF(it);
2756 it = NULL;
2757 }
2758 return it;
2759}
2760
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002761int
2762PyIter_Check(PyObject *obj)
Christian Tismerea62ce72018-06-09 20:32:25 +02002763{
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002764 PyTypeObject *tp = Py_TYPE(obj);
2765 return (tp->tp_iternext != NULL &&
2766 tp->tp_iternext != &_PyObject_NextNotImplemented);
Christian Tismerea62ce72018-06-09 20:32:25 +02002767}
2768
Joshua Bronsonf0a6fde2021-03-23 18:47:21 -04002769int
2770PyAiter_Check(PyObject *obj)
2771{
2772 PyTypeObject *tp = Py_TYPE(obj);
2773 return (tp->tp_as_async != NULL &&
2774 tp->tp_as_async->am_aiter != NULL &&
2775 tp->tp_as_async->am_aiter != &_PyObject_NextNotImplemented &&
2776 tp->tp_as_async->am_anext != NULL &&
2777 tp->tp_as_async->am_anext != &_PyObject_NextNotImplemented);
2778}
2779
Tim Petersf4848da2001-05-05 00:14:56 +00002780/* Return next item.
2781 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2782 * If the iteration terminates normally, return NULL and clear the
2783 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2784 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002786 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002787PyObject *
2788PyIter_Next(PyObject *iter)
2789{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 PyObject *result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002791 result = (*Py_TYPE(iter)->tp_iternext)(iter);
Victor Stinner61b64922020-06-23 15:55:06 +02002792 if (result == NULL) {
2793 PyThreadState *tstate = _PyThreadState_GET();
2794 if (_PyErr_Occurred(tstate)
2795 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2796 {
2797 _PyErr_Clear(tstate);
2798 }
2799 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002801}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002802
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002803PySendResult
2804PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
2805{
2806 _Py_IDENTIFIER(send);
2807 assert(arg != NULL);
2808 assert(result != NULL);
2809 if (PyType_HasFeature(Py_TYPE(iter), Py_TPFLAGS_HAVE_AM_SEND)) {
2810 assert (Py_TYPE(iter)->tp_as_async != NULL);
2811 assert (Py_TYPE(iter)->tp_as_async->am_send != NULL);
Victor Stinnera6192632021-01-29 16:53:03 +01002812 PySendResult res = Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
2813 assert(_Py_CheckSlotResult(iter, "am_send", res != PYGEN_ERROR));
2814 return res;
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002815 }
2816 if (arg == Py_None && PyIter_Check(iter)) {
2817 *result = Py_TYPE(iter)->tp_iternext(iter);
2818 }
2819 else {
2820 *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg);
2821 }
2822 if (*result != NULL) {
2823 return PYGEN_NEXT;
2824 }
2825 if (_PyGen_FetchStopIterationValue(result) == 0) {
2826 return PYGEN_RETURN;
2827 }
2828 return PYGEN_ERROR;
2829}
2830
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002831/*
2832 * Flatten a sequence of bytes() objects into a C array of
2833 * NULL terminated string pointers with a NULL char* terminating the array.
2834 * (ie: an argv or env list)
2835 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002836 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2837 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002838 */
2839char *const *
2840_PySequence_BytesToCharpArray(PyObject* self)
2841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 char **array;
2843 Py_ssize_t i, argc;
2844 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002845 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 argc = PySequence_Size(self);
2848 if (argc == -1)
2849 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002850
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002851 assert(argc >= 0);
2852
2853 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2854 PyErr_NoMemory();
2855 return NULL;
2856 }
2857
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002858 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 if (array == NULL) {
2860 PyErr_NoMemory();
2861 return NULL;
2862 }
2863 for (i = 0; i < argc; ++i) {
2864 char *data;
2865 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002866 if (item == NULL) {
2867 /* NULL terminate before freeing. */
2868 array[i] = NULL;
2869 goto fail;
2870 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002871 /* check for embedded null bytes */
2872 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 /* NULL terminate before freeing. */
2874 array[i] = NULL;
2875 goto fail;
2876 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002877 size = PyBytes_GET_SIZE(item) + 1;
2878 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 if (!array[i]) {
2880 PyErr_NoMemory();
2881 goto fail;
2882 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002883 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 Py_DECREF(item);
2885 }
2886 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002889
2890fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 Py_XDECREF(item);
2892 _Py_FreeCharPArray(array);
2893 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002894}
2895
2896
2897/* Free's a NULL terminated char** array of C strings. */
2898void
2899_Py_FreeCharPArray(char *const array[])
2900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 Py_ssize_t i;
2902 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002903 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002905 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002906}