blob: 8ad1910fb1b0ef892df7235054a116901d338dfc [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()
Miss Islington (bot)03aad302021-07-17 14:10:21 -07009#include "pycore_unionobject.h" // _PyUnion_Check()
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
Miss Islington (bot)6b922da2021-07-29 04:31:42 -0700296/* We release the buffer right after use of this function which could
297 cause issues later on. Don't use these functions in new code.
298 */
299int
300PyObject_CheckReadBuffer(PyObject *obj)
301{
302 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
303 Py_buffer view;
304
305 if (pb == NULL ||
306 pb->bf_getbuffer == NULL)
307 return 0;
308 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
309 PyErr_Clear();
310 return 0;
311 }
312 PyBuffer_Release(&view);
313 return 1;
314}
315
316static int
317as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
318{
319 Py_buffer view;
320
321 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
322 null_error();
323 return -1;
324 }
325 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
326 return -1;
327
328 *buffer = view.buf;
329 *buffer_len = view.len;
330 PyBuffer_Release(&view);
331 return 0;
332}
333
334int
335PyObject_AsCharBuffer(PyObject *obj,
336 const char **buffer,
337 Py_ssize_t *buffer_len)
338{
339 return as_read_buffer(obj, (const void **)buffer, buffer_len);
340}
341
342int PyObject_AsReadBuffer(PyObject *obj,
343 const void **buffer,
344 Py_ssize_t *buffer_len)
345{
346 return as_read_buffer(obj, buffer, buffer_len);
347}
348
349int PyObject_AsWriteBuffer(PyObject *obj,
350 void **buffer,
351 Py_ssize_t *buffer_len)
352{
353 PyBufferProcs *pb;
354 Py_buffer view;
355
356 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
357 null_error();
358 return -1;
359 }
360 pb = Py_TYPE(obj)->tp_as_buffer;
361 if (pb == NULL ||
362 pb->bf_getbuffer == NULL ||
363 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
364 PyErr_SetString(PyExc_TypeError,
365 "expected a writable bytes-like object");
366 return -1;
367 }
368
369 *buffer = view.buf;
370 *buffer_len = view.len;
371 PyBuffer_Release(&view);
372 return 0;
373}
374
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000375/* Buffer C-API for Python 3.0 */
376
377int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000378PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000379{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100380 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200381
382 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400384 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 Py_TYPE(obj)->tp_name);
386 return -1;
387 }
Victor Stinnera6192632021-01-29 16:53:03 +0100388 int res = (*pb->bf_getbuffer)(obj, view, flags);
389 assert(_Py_CheckSlotResult(obj, "getbuffer", res >= 0));
390 return res;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000391}
392
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000393static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100394_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 Py_ssize_t sd, dim;
397 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000398
Stefan Krah363af442015-02-01 14:53:54 +0100399 /* 1) len = product(shape) * itemsize
400 2) itemsize > 0
401 3) len = 0 <==> exists i: shape[i] = 0 */
402 if (view->len == 0) return 1;
403 if (view->strides == NULL) { /* C-contiguous by definition */
404 /* Trivially F-contiguous */
405 if (view->ndim <= 1) return 1;
406
407 /* ndim > 1 implies shape != NULL */
408 assert(view->shape != NULL);
409
410 /* Effectively 1-d */
411 sd = 0;
412 for (i=0; i<view->ndim; i++) {
413 if (view->shape[i] > 1) sd += 1;
414 }
415 return sd <= 1;
416 }
417
418 /* strides != NULL implies both of these */
419 assert(view->ndim > 0);
420 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 for (i=0; i<view->ndim; i++) {
424 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100425 if (dim > 1 && view->strides[i] != sd) {
426 return 0;
427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 sd *= dim;
429 }
430 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431}
432
433static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100434_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 Py_ssize_t sd, dim;
437 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000438
Stefan Krah363af442015-02-01 14:53:54 +0100439 /* 1) len = product(shape) * itemsize
440 2) itemsize > 0
441 3) len = 0 <==> exists i: shape[i] = 0 */
442 if (view->len == 0) return 1;
443 if (view->strides == NULL) return 1; /* C-contiguous by definition */
444
445 /* strides != NULL implies both of these */
446 assert(view->ndim > 0);
447 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 for (i=view->ndim-1; i>=0; i--) {
451 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100452 if (dim > 1 && view->strides[i] != sd) {
453 return 0;
454 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 sd *= dim;
456 }
457 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000458}
459
460int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100461PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000462{
463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000465
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100466 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100468 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100470 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 return (_IsCContiguous(view) || _IsFortranContiguous(view));
472 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000473}
474
475
Guido van Rossum98297ee2007-11-06 21:34:58 +0000476void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000477PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 char* pointer;
480 int i;
481 pointer = (char *)view->buf;
482 for (i = 0; i < view->ndim; i++) {
483 pointer += view->strides[i]*indices[i];
484 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
485 pointer = *((char**)pointer) + view->suboffsets[i];
486 }
487 }
488 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000489}
490
491
Guido van Rossum98297ee2007-11-06 21:34:58 +0000492void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000493_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 +0000494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 for (k=0; k<nd; k++) {
498 if (index[k] < shape[k]-1) {
499 index[k]++;
500 break;
501 }
502 else {
503 index[k] = 0;
504 }
505 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000506}
507
Guido van Rossum98297ee2007-11-06 21:34:58 +0000508void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000509_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 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 for (k=nd-1; k>=0; k--) {
514 if (index[k] < shape[k]-1) {
515 index[k]++;
516 break;
517 }
518 else {
519 index[k] = 0;
520 }
521 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000522}
523
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300524Py_ssize_t
525PyBuffer_SizeFromFormat(const char *format)
526{
527 PyObject *structmodule = NULL;
528 PyObject *calcsize = NULL;
529 PyObject *res = NULL;
530 PyObject *fmt = NULL;
531 Py_ssize_t itemsize = -1;
532
533 structmodule = PyImport_ImportModule("struct");
534 if (structmodule == NULL) {
535 return itemsize;
536 }
537
538 calcsize = PyObject_GetAttrString(structmodule, "calcsize");
539 if (calcsize == NULL) {
540 goto done;
541 }
542
543 fmt = PyUnicode_FromString(format);
544 if (fmt == NULL) {
545 goto done;
546 }
547
548 res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
549 if (res == NULL) {
550 goto done;
551 }
552
553 itemsize = PyLong_AsSsize_t(res);
554 if (itemsize < 0) {
555 goto done;
556 }
557
558done:
559 Py_DECREF(structmodule);
560 Py_XDECREF(calcsize);
561 Py_XDECREF(fmt);
562 Py_XDECREF(res);
563 return itemsize;
564}
565
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000566int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000567PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000570 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 Py_ssize_t *indices, elements;
572 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (len > view->len) {
575 len = view->len;
576 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if (PyBuffer_IsContiguous(view, fort)) {
579 /* simplest copy is all that is needed */
580 memcpy(view->buf, buf, len);
581 return 0;
582 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000585
Stefan Krah7213fcc2015-02-01 16:19:23 +0100586 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
588 if (indices == NULL) {
589 PyErr_NoMemory();
590 return -1;
591 }
592 for (k=0; k<view->ndim;k++) {
593 indices[k] = 0;
594 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000597 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 }
599 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000600 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 }
602 src = buf;
603 /* XXX : This is not going to be the fastest code in the world
604 several optimizations are possible.
605 */
606 elements = len / view->itemsize;
607 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 ptr = PyBuffer_GetPointer(view, indices);
609 memcpy(ptr, src, view->itemsize);
610 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100611 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 PyMem_Free(indices);
615 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000616}
617
Guido van Rossum98297ee2007-11-06 21:34:58 +0000618int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 Py_buffer view_dest, view_src;
621 int k;
622 Py_ssize_t *indices, elements;
623 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (!PyObject_CheckBuffer(dest) ||
626 !PyObject_CheckBuffer(src)) {
627 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400628 "both destination and source must be "\
629 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 return -1;
631 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
634 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
635 PyBuffer_Release(&view_dest);
636 return -1;
637 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 if (view_dest.len < view_src.len) {
640 PyErr_SetString(PyExc_BufferError,
641 "destination is too small to receive data from source");
642 PyBuffer_Release(&view_dest);
643 PyBuffer_Release(&view_src);
644 return -1;
645 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
648 PyBuffer_IsContiguous(&view_src, 'C')) ||
649 (PyBuffer_IsContiguous(&view_dest, 'F') &&
650 PyBuffer_IsContiguous(&view_src, 'F'))) {
651 /* simplest copy is all that is needed */
652 memcpy(view_dest.buf, view_src.buf, view_src.len);
653 PyBuffer_Release(&view_dest);
654 PyBuffer_Release(&view_src);
655 return 0;
656 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 /* XXX(nnorwitz): need to check for overflow! */
661 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
662 if (indices == NULL) {
663 PyErr_NoMemory();
664 PyBuffer_Release(&view_dest);
665 PyBuffer_Release(&view_src);
666 return -1;
667 }
668 for (k=0; k<view_src.ndim;k++) {
669 indices[k] = 0;
670 }
671 elements = 1;
672 for (k=0; k<view_src.ndim; k++) {
673 /* XXX(nnorwitz): can this overflow? */
674 elements *= view_src.shape[k];
675 }
676 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000677 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 dptr = PyBuffer_GetPointer(&view_dest, indices);
679 sptr = PyBuffer_GetPointer(&view_src, indices);
680 memcpy(dptr, sptr, view_src.itemsize);
681 }
682 PyMem_Free(indices);
683 PyBuffer_Release(&view_dest);
684 PyBuffer_Release(&view_src);
685 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000686}
687
688void
689PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 Py_ssize_t *strides, int itemsize,
691 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 int k;
694 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 sd = itemsize;
697 if (fort == 'F') {
698 for (k=0; k<nd; k++) {
699 strides[k] = sd;
700 sd *= shape[k];
701 }
702 }
703 else {
704 for (k=nd-1; k>=0; k--) {
705 strides[k] = sd;
706 sd *= shape[k];
707 }
708 }
709 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000710}
711
712int
Martin v. Löwis423be952008-08-13 15:53:07 +0000713PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100714 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000715{
Stefan Krah5178d912015-02-03 16:57:21 +0100716 if (view == NULL) {
717 PyErr_SetString(PyExc_BufferError,
Victor Stinner61b64922020-06-23 15:55:06 +0200718 "PyBuffer_FillInfo: view==NULL argument is obsolete");
Stefan Krah5178d912015-02-03 16:57:21 +0100719 return -1;
720 }
721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
723 (readonly == 1)) {
724 PyErr_SetString(PyExc_BufferError,
725 "Object is not writable.");
726 return -1;
727 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 view->obj = obj;
730 if (obj)
731 Py_INCREF(obj);
732 view->buf = buf;
733 view->len = len;
734 view->readonly = readonly;
735 view->itemsize = 1;
736 view->format = NULL;
737 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
738 view->format = "B";
739 view->ndim = 1;
740 view->shape = NULL;
741 if ((flags & PyBUF_ND) == PyBUF_ND)
742 view->shape = &(view->len);
743 view->strides = NULL;
744 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
745 view->strides = &(view->itemsize);
746 view->suboffsets = NULL;
747 view->internal = NULL;
748 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000749}
750
Martin v. Löwis423be952008-08-13 15:53:07 +0000751void
752PyBuffer_Release(Py_buffer *view)
753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200755 PyBufferProcs *pb;
756 if (obj == NULL)
757 return;
758 pb = Py_TYPE(obj)->tp_as_buffer;
Victor Stinnera6192632021-01-29 16:53:03 +0100759 if (pb && pb->bf_releasebuffer) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200760 pb->bf_releasebuffer(obj, view);
Victor Stinnera6192632021-01-29 16:53:03 +0100761 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200763 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000764}
765
Eric Smith8fd3eba2008-02-17 19:48:00 +0000766PyObject *
767PyObject_Format(PyObject *obj, PyObject *format_spec)
768{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000769 PyObject *meth;
770 PyObject *empty = NULL;
771 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500772 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000773
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300774 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
775 PyErr_Format(PyExc_SystemError,
776 "Format specifier must be a string, not %.200s",
777 Py_TYPE(format_spec)->tp_name);
778 return NULL;
779 }
780
781 /* Fast path for common types. */
782 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
783 if (PyUnicode_CheckExact(obj)) {
784 Py_INCREF(obj);
785 return obj;
786 }
787 if (PyLong_CheckExact(obj)) {
788 return PyObject_Str(obj);
789 }
790 }
791
Eric Smith8fd3eba2008-02-17 19:48:00 +0000792 /* If no format_spec is provided, use an empty string */
793 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100794 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000795 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000796 }
797
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300798 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500799 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000800 if (meth == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200801 PyThreadState *tstate = _PyThreadState_GET();
802 if (!_PyErr_Occurred(tstate)) {
803 _PyErr_Format(tstate, PyExc_TypeError,
804 "Type %.100s doesn't define __format__",
805 Py_TYPE(obj)->tp_name);
806 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000808 }
809
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000810 /* And call it. */
Petr Viktorinffd97532020-02-11 17:46:57 +0100811 result = PyObject_CallOneArg(meth, format_spec);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000812 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000813
814 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800815 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +0200816 "__format__ must return a str, not %.200s",
817 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000818 Py_DECREF(result);
819 result = NULL;
820 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000821 }
822
823done:
824 Py_XDECREF(empty);
825 return result;
826}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000827/* Operations on numbers */
828
829int
Fred Drake79912472000-07-09 04:06:11 +0000830PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000831{
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300832 if (o == NULL)
833 return 0;
834 PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
835 return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
Guido van Rossume15dee51995-07-18 14:12:02 +0000836}
837
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000838/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000839
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000840#define NB_SLOT(x) offsetof(PyNumberMethods, x)
841#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000843#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000845
846/*
847 Calling scheme used for binary operations:
848
Neal Norwitz4886cc32006-08-21 17:06:07 +0000849 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000851
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100852 [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
853 Py_TYPE(v)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000854 */
855
856static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +0100857binary_op1(PyObject *v, PyObject *w, const int op_slot
858#ifndef NDEBUG
859 , const char *op_name
860#endif
861 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000862{
Victor Stinnera6192632021-01-29 16:53:03 +0100863 binaryfunc slotv;
864 if (Py_TYPE(v)->tp_as_number != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100865 slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 }
Victor Stinnera6192632021-01-29 16:53:03 +0100867 else {
868 slotv = NULL;
869 }
870
871 binaryfunc slotw;
872 if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) {
873 slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
874 if (slotw == slotv) {
875 slotw = NULL;
876 }
877 }
878 else {
879 slotw = NULL;
880 }
881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100883 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100884 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 x = slotw(v, w);
886 if (x != Py_NotImplemented)
887 return x;
888 Py_DECREF(x); /* can't do it */
889 slotw = NULL;
890 }
891 x = slotv(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +0100892 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
893 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100895 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 Py_DECREF(x); /* can't do it */
897 }
898 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +0100899 PyObject *x = slotw(v, w);
900 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
901 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100903 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 Py_DECREF(x); /* can't do it */
905 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500906 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000907}
Guido van Rossum77660912002-04-16 16:32:50 +0000908
Victor Stinnera6192632021-01-29 16:53:03 +0100909#ifdef NDEBUG
910# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot)
911#else
912# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot, op_name)
913#endif
914
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000915static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000916binop_type_error(PyObject *v, PyObject *w, const char *op_name)
917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 PyErr_Format(PyExc_TypeError,
919 "unsupported operand type(s) for %.100s: "
920 "'%.100s' and '%.100s'",
921 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100922 Py_TYPE(v)->tp_name,
923 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000925}
926
927static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000928binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
929{
Victor Stinnera6192632021-01-29 16:53:03 +0100930 PyObject *result = BINARY_OP1(v, w, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 if (result == Py_NotImplemented) {
932 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530933
934 if (op_slot == NB_SLOT(nb_rshift) &&
scoder4c9ea092020-05-12 16:12:41 +0200935 PyCFunction_CheckExact(v) &&
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530936 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
937 {
938 PyErr_Format(PyExc_TypeError,
939 "unsupported operand type(s) for %.100s: "
940 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530941 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530942 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100943 Py_TYPE(v)->tp_name,
944 Py_TYPE(w)->tp_name);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530945 return NULL;
946 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 return binop_type_error(v, w, op_name);
948 }
949 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000950}
951
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000952
953/*
954 Calling scheme used for ternary operations:
955
Neal Norwitz4886cc32006-08-21 17:06:07 +0000956 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000958 */
959
960static PyObject *
961ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 PyObject *w,
963 PyObject *z,
Alexcc02b4f2021-02-26 21:58:39 +0200964 const int op_slot,
965 const char *op_name
Victor Stinnera6192632021-01-29 16:53:03 +0100966 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000967{
Victor Stinnera6192632021-01-29 16:53:03 +0100968 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
969 PyNumberMethods *mw = Py_TYPE(w)->tp_as_number;
Guido van Rossum77660912002-04-16 16:32:50 +0000970
Victor Stinnera6192632021-01-29 16:53:03 +0100971 ternaryfunc slotv;
972 if (mv != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 slotv = NB_TERNOP(mv, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100974 }
975 else {
976 slotv = NULL;
977 }
978
979 ternaryfunc slotw;
Andy Lester55728702020-03-06 16:53:17 -0600980 if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 slotw = NB_TERNOP(mw, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100982 if (slotw == slotv) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 slotw = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100984 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 }
Victor Stinnera6192632021-01-29 16:53:03 +0100986 else {
987 slotw = NULL;
988 }
989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100991 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100992 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 x = slotw(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +0100994 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100996 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 Py_DECREF(x); /* can't do it */
998 slotw = NULL;
999 }
1000 x = slotv(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +01001001 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
1002 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 return x;
Victor Stinnera6192632021-01-29 16:53:03 +01001004 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 Py_DECREF(x); /* can't do it */
1006 }
1007 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +01001008 PyObject *x = slotw(v, w, z);
1009 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
1010 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 return x;
Victor Stinnera6192632021-01-29 16:53:03 +01001012 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 Py_DECREF(x); /* can't do it */
1014 }
Victor Stinnera6192632021-01-29 16:53:03 +01001015
1016 PyNumberMethods *mz = Py_TYPE(z)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 if (mz != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +01001018 ternaryfunc slotz = NB_TERNOP(mz, op_slot);
1019 if (slotz == slotv || slotz == slotw) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 slotz = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001021 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 if (slotz) {
Victor Stinnera6192632021-01-29 16:53:03 +01001023 PyObject *x = slotz(v, w, z);
1024 assert(_Py_CheckSlotResult(z, op_name, x != NULL));
1025 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 return x;
Victor Stinnera6192632021-01-29 16:53:03 +01001027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 Py_DECREF(x); /* can't do it */
1029 }
1030 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001031
Victor Stinnera6192632021-01-29 16:53:03 +01001032 if (z == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 PyErr_Format(
1034 PyExc_TypeError,
Alexcc02b4f2021-02-26 21:58:39 +02001035 "unsupported operand type(s) for %.100s: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 "'%.100s' and '%.100s'",
Alexcc02b4f2021-02-26 21:58:39 +02001037 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001038 Py_TYPE(v)->tp_name,
1039 Py_TYPE(w)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +01001040 }
1041 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 PyErr_Format(
1043 PyExc_TypeError,
Alexcc02b4f2021-02-26 21:58:39 +02001044 "unsupported operand type(s) for %.100s: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 "'%.100s', '%.100s', '%.100s'",
Alexcc02b4f2021-02-26 21:58:39 +02001046 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001047 Py_TYPE(v)->tp_name,
1048 Py_TYPE(w)->tp_name,
1049 Py_TYPE(z)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +01001050 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001052}
1053
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001054#define BINARY_FUNC(func, op, op_name) \
1055 PyObject * \
1056 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001058 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001059
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001060BINARY_FUNC(PyNumber_Or, nb_or, "|")
1061BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
1062BINARY_FUNC(PyNumber_And, nb_and, "&")
1063BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
1064BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
1065BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001066BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +00001067
1068PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001069PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001070{
Victor Stinnera6192632021-01-29 16:53:03 +01001071 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+");
1072 if (result != Py_NotImplemented) {
1073 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 }
Victor Stinnera6192632021-01-29 16:53:03 +01001075 Py_DECREF(result);
1076
1077 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
1078 if (m && m->sq_concat) {
1079 result = (*m->sq_concat)(v, w);
1080 assert(_Py_CheckSlotResult(v, "+", result != NULL));
1081 return result;
1082 }
1083
1084 return binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001085}
1086
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001087static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001088sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 Py_ssize_t count;
Victor Stinnera15e2602020-04-08 02:01:56 +02001091 if (_PyIndex_Check(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Victor Stinnera6192632021-01-29 16:53:03 +01001093 if (count == -1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001095 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 }
1097 else {
1098 return type_error("can't multiply sequence by "
1099 "non-int of type '%.200s'", n);
1100 }
Victor Stinnera6192632021-01-29 16:53:03 +01001101 PyObject *res = (*repeatfunc)(seq, count);
1102 assert(_Py_CheckSlotResult(seq, "*", res != NULL));
1103 return res;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001104}
1105
1106PyObject *
1107PyNumber_Multiply(PyObject *v, PyObject *w)
1108{
Victor Stinnera6192632021-01-29 16:53:03 +01001109 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001111 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1112 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 Py_DECREF(result);
1114 if (mv && mv->sq_repeat) {
1115 return sequence_repeat(mv->sq_repeat, v, w);
1116 }
1117 else if (mw && mw->sq_repeat) {
1118 return sequence_repeat(mw->sq_repeat, w, v);
1119 }
1120 result = binop_type_error(v, w, "*");
1121 }
1122 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001123}
1124
Guido van Rossume15dee51995-07-18 14:12:02 +00001125PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001126PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
1127{
1128 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
1129}
1130
1131PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001132PyNumber_FloorDivide(PyObject *v, PyObject *w)
1133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001135}
1136
1137PyObject *
1138PyNumber_TrueDivide(PyObject *v, PyObject *w)
1139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001141}
1142
1143PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001144PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001147}
1148
1149PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001150PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001151{
Alexcc02b4f2021-02-26 21:58:39 +02001152 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001153}
1154
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001155/* Binary in-place operators */
1156
1157/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001158 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001159
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001160 - If the left hand object has the appropriate struct members, and
1161 they are filled, call the appropriate function and return the
1162 result. No coercion is done on the arguments; the left-hand object
1163 is the one the operation is performed on, and it's up to the
1164 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001165
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001166 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001167 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001168
1169 */
1170
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001171static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +01001172binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot
1173#ifndef NDEBUG
1174 , const char *op_name
1175#endif
1176 )
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001177{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001178 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 if (mv != NULL) {
1180 binaryfunc slot = NB_BINOP(mv, iop_slot);
1181 if (slot) {
1182 PyObject *x = (slot)(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +01001183 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (x != Py_NotImplemented) {
1185 return x;
1186 }
1187 Py_DECREF(x);
1188 }
1189 }
Victor Stinnera6192632021-01-29 16:53:03 +01001190#ifdef NDEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 return binary_op1(v, w, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +01001192#else
1193 return binary_op1(v, w, op_slot, op_name);
1194#endif
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001195}
1196
Victor Stinnera6192632021-01-29 16:53:03 +01001197#ifdef NDEBUG
1198# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot)
1199#else
1200# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot, op_name)
1201#endif
1202
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001203static PyObject *
1204binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001206{
Victor Stinnera6192632021-01-29 16:53:03 +01001207 PyObject *result = BINARY_IOP1(v, w, iop_slot, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (result == Py_NotImplemented) {
1209 Py_DECREF(result);
1210 return binop_type_error(v, w, op_name);
1211 }
1212 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001213}
1214
Alexcc02b4f2021-02-26 21:58:39 +02001215static PyObject *
1216ternary_iop(PyObject *v, PyObject *w, PyObject *z, const int iop_slot, const int op_slot,
1217 const char *op_name)
1218{
1219 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
1220 if (mv != NULL) {
1221 ternaryfunc slot = NB_TERNOP(mv, iop_slot);
1222 if (slot) {
1223 PyObject *x = (slot)(v, w, z);
1224 if (x != Py_NotImplemented) {
1225 return x;
1226 }
1227 Py_DECREF(x);
1228 }
1229 }
1230 return ternary_op(v, w, z, op_slot, op_name);
1231}
1232
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001233#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 PyObject * \
1235 func(PyObject *v, PyObject *w) { \
1236 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1237 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001238
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001239INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1240INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1241INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1242INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1243INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1244INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001245INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001246
1247PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001248PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1251 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001252}
1253
1254PyObject *
1255PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1258 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001259}
1260
1261PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001262PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1263{
Victor Stinnera6192632021-01-29 16:53:03 +01001264 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add),
1265 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001267 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 Py_DECREF(result);
1269 if (m != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +01001270 binaryfunc func = m->sq_inplace_concat;
1271 if (func == NULL)
1272 func = m->sq_concat;
1273 if (func != NULL) {
1274 result = func(v, w);
1275 assert(_Py_CheckSlotResult(v, "+=", result != NULL));
1276 return result;
1277 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 }
1279 result = binop_type_error(v, w, "+=");
1280 }
1281 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001282}
1283
1284PyObject *
1285PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1286{
Victor Stinnera6192632021-01-29 16:53:03 +01001287 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply),
1288 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 if (result == Py_NotImplemented) {
1290 ssizeargfunc f = NULL;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001291 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1292 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 Py_DECREF(result);
1294 if (mv != NULL) {
1295 f = mv->sq_inplace_repeat;
1296 if (f == NULL)
1297 f = mv->sq_repeat;
1298 if (f != NULL)
1299 return sequence_repeat(f, v, w);
1300 }
1301 else if (mw != NULL) {
1302 /* Note that the right hand operand should not be
1303 * mutated in this case so sq_inplace_repeat is not
1304 * used. */
1305 if (mw->sq_repeat)
1306 return sequence_repeat(mw->sq_repeat, w, v);
1307 }
1308 result = binop_type_error(v, w, "*=");
1309 }
1310 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001311}
1312
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001313PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001314PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1315{
1316 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1317 NB_SLOT(nb_matrix_multiply), "@=");
1318}
1319
1320PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001321PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1324 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001325}
1326
1327PyObject *
1328PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1329{
Alexcc02b4f2021-02-26 21:58:39 +02001330 return ternary_iop(v, w, z, NB_SLOT(nb_inplace_power),
1331 NB_SLOT(nb_power), "**=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001332}
1333
1334
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001335/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001336
1337PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001338PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001339{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001340 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001342 }
1343
Victor Stinnera6192632021-01-29 16:53:03 +01001344 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1345 if (m && m->nb_negative) {
1346 PyObject *res = (*m->nb_negative)(o);
1347 assert(_Py_CheckSlotResult(o, "__neg__", res != NULL));
1348 return res;
1349 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001352}
1353
1354PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001355PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001356{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001357 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001359 }
1360
Victor Stinnera6192632021-01-29 16:53:03 +01001361 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1362 if (m && m->nb_positive) {
1363 PyObject *res = (*m->nb_positive)(o);
1364 assert(_Py_CheckSlotResult(o, "__pos__", res != NULL));
1365 return res;
1366 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001369}
1370
1371PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001372PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001373{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001374 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001376 }
1377
Victor Stinnera6192632021-01-29 16:53:03 +01001378 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1379 if (m && m->nb_invert) {
1380 PyObject *res = (*m->nb_invert)(o);
1381 assert(_Py_CheckSlotResult(o, "__invert__", res != NULL));
1382 return res;
1383 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001386}
1387
1388PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001389PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001390{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001391 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001393 }
1394
Victor Stinnera6192632021-01-29 16:53:03 +01001395 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1396 if (m && m->nb_absolute) {
1397 PyObject *res = m->nb_absolute(o);
1398 assert(_Py_CheckSlotResult(o, "__abs__", res != NULL));
1399 return res;
1400 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001403}
1404
Victor Stinnera15e2602020-04-08 02:01:56 +02001405
Christian Tismerea62ce72018-06-09 20:32:25 +02001406int
1407PyIndex_Check(PyObject *obj)
1408{
Victor Stinnera15e2602020-04-08 02:01:56 +02001409 return _PyIndex_Check(obj);
Christian Tismerea62ce72018-06-09 20:32:25 +02001410}
1411
Victor Stinnera15e2602020-04-08 02:01:56 +02001412
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001413/* Return a Python int from the object item.
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001414 Can return an instance of int subclass.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001415 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001416 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001417*/
1418PyObject *
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001419_PyNumber_Index(PyObject *item)
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001420{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001421 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001423 }
1424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 if (PyLong_Check(item)) {
1426 Py_INCREF(item);
1427 return item;
1428 }
Victor Stinnera15e2602020-04-08 02:01:56 +02001429 if (!_PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 PyErr_Format(PyExc_TypeError,
1431 "'%.200s' object cannot be interpreted "
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001432 "as an integer", Py_TYPE(item)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001433 return NULL;
1434 }
Victor Stinnera6192632021-01-29 16:53:03 +01001435
1436 PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
1437 assert(_Py_CheckSlotResult(item, "__index__", result != NULL));
1438 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001439 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001440 }
1441
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001442 if (!PyLong_Check(result)) {
1443 PyErr_Format(PyExc_TypeError,
1444 "__index__ returned non-int (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001445 Py_TYPE(result)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001446 Py_DECREF(result);
1447 return NULL;
1448 }
1449 /* Issue #17576: warn if 'result' not of exact type int. */
1450 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1451 "__index__ returned non-int (type %.200s). "
1452 "The ability to return an instance of a strict subclass of int "
1453 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001454 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001455 Py_DECREF(result);
1456 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 }
1458 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001459}
1460
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001461/* Return an exact Python int from the object item.
1462 Raise TypeError if the result is not an int
1463 or if the object cannot be interpreted as an index.
1464*/
1465PyObject *
1466PyNumber_Index(PyObject *item)
1467{
1468 PyObject *result = _PyNumber_Index(item);
1469 if (result != NULL && !PyLong_CheckExact(result)) {
1470 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1471 }
1472 return result;
1473}
1474
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001475/* Return an error on Overflow only if err is not NULL*/
1476
1477Py_ssize_t
1478PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 Py_ssize_t result;
1481 PyObject *runerr;
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001482 PyObject *value = _PyNumber_Index(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (value == NULL)
1484 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 /* We're done if PyLong_AsSsize_t() returns without error. */
1487 result = PyLong_AsSsize_t(value);
Victor Stinner61b64922020-06-23 15:55:06 +02001488 if (result != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001490
Victor Stinner61b64922020-06-23 15:55:06 +02001491 PyThreadState *tstate = _PyThreadState_GET();
1492 runerr = _PyErr_Occurred(tstate);
1493 if (!runerr) {
1494 goto finish;
1495 }
1496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 /* Error handling code -- only manage OverflowError differently */
Victor Stinner61b64922020-06-23 15:55:06 +02001498 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 goto finish;
Victor Stinner61b64922020-06-23 15:55:06 +02001500 }
1501 _PyErr_Clear(tstate);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 /* If no error-handling desired then the default clipping
Victor Stinner61b64922020-06-23 15:55:06 +02001504 is sufficient. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 if (!err) {
1506 assert(PyLong_Check(value));
1507 /* Whether or not it is less than or equal to
1508 zero is determined by the sign of ob_size
1509 */
1510 if (_PyLong_Sign(value) < 0)
1511 result = PY_SSIZE_T_MIN;
1512 else
1513 result = PY_SSIZE_T_MAX;
1514 }
1515 else {
1516 /* Otherwise replace the error with caller's error object. */
Victor Stinner61b64922020-06-23 15:55:06 +02001517 _PyErr_Format(tstate, err,
1518 "cannot fit '%.200s' into an index-sized integer",
1519 Py_TYPE(item)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001521
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001522 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 Py_DECREF(value);
1524 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001525}
1526
1527
Guido van Rossume15dee51995-07-18 14:12:02 +00001528PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001529PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001530{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001531 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001534 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001535 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001536
Victor Stinner71aea8e2016-08-19 16:59:55 +02001537 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001539 }
1540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 if (PyLong_CheckExact(o)) {
1542 Py_INCREF(o);
1543 return o;
1544 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001545 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001547 /* Convert using the nb_int slot, which should return something
1548 of exact type int. */
1549 result = m->nb_int(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001550 assert(_Py_CheckSlotResult(o, "__int__", result != NULL));
1551 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001552 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001553 }
1554
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001555 if (!PyLong_Check(result)) {
1556 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +02001557 "__int__ returned non-int (type %.200s)",
Victor Stinner8182cc22020-07-10 12:40:38 +02001558 Py_TYPE(result)->tp_name);
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001559 Py_DECREF(result);
1560 return NULL;
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001561 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001562 /* Issue #17576: warn if 'result' not of exact type int. */
1563 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1564 "__int__ returned non-int (type %.200s). "
1565 "The ability to return an instance of a strict subclass of int "
1566 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner8182cc22020-07-10 12:40:38 +02001567 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001568 Py_DECREF(result);
1569 return NULL;
1570 }
1571 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001572 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 }
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001574 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001575 return PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001576 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001577 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001579 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001581 if (result == NULL || PyLong_CheckExact(result)) {
1582 return result;
1583 }
1584 if (PyLong_Check(result)) {
1585 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1586 return result;
1587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001589 but int() needs to return an int. */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001590 if (!PyIndex_Check(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001591 PyErr_Format(
1592 PyExc_TypeError,
1593 "__trunc__ returned non-Integral (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001594 Py_TYPE(result)->tp_name);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001595 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001596 return NULL;
1597 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001598 Py_SETREF(result, PyNumber_Index(result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001599 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001601 if (PyErr_Occurred())
1602 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001603
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001604 if (PyUnicode_Check(o))
Inada Naokie4f1fe62020-06-29 13:00:43 +09001605 /* The below check is done in PyLong_FromUnicodeObject(). */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001606 return PyLong_FromUnicodeObject(o, 10);
1607
Martin Pantereeb896c2015-11-07 02:32:21 +00001608 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001610 * doesn't do. In particular int('9\x005') must raise an
1611 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001613 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1614 PyBytes_GET_SIZE(o), 10);
1615
1616 if (PyByteArray_Check(o))
1617 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1618 PyByteArray_GET_SIZE(o), 10);
1619
1620 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001621 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001622
1623 /* Copy to NUL-terminated buffer. */
1624 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1625 if (bytes == NULL) {
1626 PyBuffer_Release(&view);
1627 return NULL;
1628 }
1629 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1630 PyBytes_GET_SIZE(bytes), 10);
1631 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001632 PyBuffer_Release(&view);
1633 return result;
1634 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001635
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001636 return type_error("int() argument must be a string, a bytes-like object "
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +03001637 "or a real number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001638}
1639
1640PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001641PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001642{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001643 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001645 }
1646
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001647 if (PyFloat_CheckExact(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001648 return Py_NewRef(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001649 }
Victor Stinnera6192632021-01-29 16:53:03 +01001650
1651 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 if (m && m->nb_float) { /* This should include subclasses of float */
1653 PyObject *res = m->nb_float(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001654 assert(_Py_CheckSlotResult(o, "__float__", res != NULL));
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001655 if (!res || PyFloat_CheckExact(res)) {
1656 return res;
1657 }
Victor Stinnera6192632021-01-29 16:53:03 +01001658
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001659 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001660 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001661 "%.50s.__float__ returned non-float (type %.50s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001662 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 Py_DECREF(res);
1664 return NULL;
1665 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001666 /* Issue #26983: warn if 'res' not of exact type float. */
1667 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1668 "%.50s.__float__ returned non-float (type %.50s). "
1669 "The ability to return an instance of a strict subclass of float "
1670 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001671 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001672 Py_DECREF(res);
1673 return NULL;
1674 }
Victor Stinnera6192632021-01-29 16:53:03 +01001675 double val = PyFloat_AS_DOUBLE(res);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001676 Py_DECREF(res);
1677 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 }
Victor Stinnera6192632021-01-29 16:53:03 +01001679
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001680 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001681 PyObject *res = _PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001682 if (!res) {
1683 return NULL;
1684 }
1685 double val = PyLong_AsDouble(res);
1686 Py_DECREF(res);
1687 if (val == -1.0 && PyErr_Occurred()) {
1688 return NULL;
1689 }
1690 return PyFloat_FromDouble(val);
1691 }
Victor Stinnera6192632021-01-29 16:53:03 +01001692
1693 /* A float subclass with nb_float == NULL */
1694 if (PyFloat_Check(o)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001695 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 }
1697 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001698}
1699
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001700
1701PyObject *
1702PyNumber_ToBase(PyObject *n, int base)
1703{
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001704 if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
1705 PyErr_SetString(PyExc_SystemError,
1706 "PyNumber_ToBase: base must be 2, 8, 10 or 16");
1707 return NULL;
1708 }
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001709 PyObject *index = _PyNumber_Index(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 if (!index)
1711 return NULL;
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001712 PyObject *res = _PyLong_Format(index, base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 Py_DECREF(index);
1714 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001715}
1716
1717
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001718/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001719
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001720int
Fred Drake79912472000-07-09 04:06:11 +00001721PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001723 if (PyDict_Check(s))
1724 return 0;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001725 return Py_TYPE(s)->tp_as_sequence &&
1726 Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001727}
1728
Martin v. Löwis18e16552006-02-15 17:27:45 +00001729Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001730PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 if (s == NULL) {
1733 null_error();
1734 return -1;
1735 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001736
Victor Stinnera6192632021-01-29 16:53:03 +01001737 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001738 if (m && m->sq_length) {
1739 Py_ssize_t len = m->sq_length(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001740 assert(_Py_CheckSlotResult(s, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001741 return len;
1742 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001743
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001744 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001745 type_error("%.200s is not a sequence", s);
1746 return -1;
1747 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 type_error("object of type '%.200s' has no len()", s);
1749 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001750}
1751
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001752#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001753Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001754PySequence_Length(PyObject *s)
1755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001757}
1758#define PySequence_Length PySequence_Size
1759
Guido van Rossume15dee51995-07-18 14:12:02 +00001760PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001761PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001762{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001763 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001765 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001766
Victor Stinnera6192632021-01-29 16:53:03 +01001767 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1768 if (m && m->sq_concat) {
1769 PyObject *res = m->sq_concat(s, o);
1770 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1771 return res;
1772 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 /* Instances of user classes defining an __add__() method only
1775 have an nb_add slot, not an sq_concat slot. So we fall back
1776 to nb_add if both arguments appear to be sequences. */
1777 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001778 PyObject *result = BINARY_OP1(s, o, NB_SLOT(nb_add), "+");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 if (result != Py_NotImplemented)
1780 return result;
1781 Py_DECREF(result);
1782 }
1783 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001784}
1785
1786PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001787PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001788{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001789 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001790 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001791 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001792
Victor Stinnera6192632021-01-29 16:53:03 +01001793 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1794 if (m && m->sq_repeat) {
1795 PyObject *res = m->sq_repeat(o, count);
1796 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1797 return res;
1798 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 /* Instances of user classes defining a __mul__() method only
1801 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1802 to nb_multiply if o appears to be a sequence. */
1803 if (PySequence_Check(o)) {
1804 PyObject *n, *result;
1805 n = PyLong_FromSsize_t(count);
1806 if (n == NULL)
1807 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001808 result = BINARY_OP1(o, n, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 Py_DECREF(n);
1810 if (result != Py_NotImplemented)
1811 return result;
1812 Py_DECREF(result);
1813 }
1814 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001815}
1816
1817PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001818PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1819{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001820 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001822 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001823
Victor Stinnera6192632021-01-29 16:53:03 +01001824 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1825 if (m && m->sq_inplace_concat) {
1826 PyObject *res = m->sq_inplace_concat(s, o);
1827 assert(_Py_CheckSlotResult(s, "+=", res != NULL));
1828 return res;
1829 }
1830 if (m && m->sq_concat) {
1831 PyObject *res = m->sq_concat(s, o);
1832 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1833 return res;
1834 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001837 PyObject *result = BINARY_IOP1(s, o, NB_SLOT(nb_inplace_add),
1838 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 if (result != Py_NotImplemented)
1840 return result;
1841 Py_DECREF(result);
1842 }
1843 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001844}
1845
1846PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001847PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001848{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001849 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001851 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001852
Victor Stinnera6192632021-01-29 16:53:03 +01001853 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1854 if (m && m->sq_inplace_repeat) {
1855 PyObject *res = m->sq_inplace_repeat(o, count);
1856 assert(_Py_CheckSlotResult(o, "*=", res != NULL));
1857 return res;
1858 }
1859 if (m && m->sq_repeat) {
1860 PyObject *res = m->sq_repeat(o, count);
1861 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1862 return res;
1863 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 if (PySequence_Check(o)) {
1866 PyObject *n, *result;
1867 n = PyLong_FromSsize_t(count);
1868 if (n == NULL)
1869 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001870 result = BINARY_IOP1(o, n, NB_SLOT(nb_inplace_multiply),
1871 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 Py_DECREF(n);
1873 if (result != Py_NotImplemented)
1874 return result;
1875 Py_DECREF(result);
1876 }
1877 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001878}
1879
1880PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001881PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001882{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001883 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001885 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Victor Stinnera6192632021-01-29 16:53:03 +01001887 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 if (m && m->sq_item) {
1889 if (i < 0) {
1890 if (m->sq_length) {
1891 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001892 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Victor Stinnere20310f2015-11-05 13:56:58 +01001893 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001895 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 i += l;
1897 }
1898 }
Victor Stinnera6192632021-01-29 16:53:03 +01001899 PyObject *res = m->sq_item(s, i);
1900 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
1901 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001903
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001904 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001905 return type_error("%.200s is not a sequence", s);
1906 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001908}
1909
1910PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001911PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001912{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001913 if (!s) {
1914 return null_error();
1915 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001916
Victor Stinnera6192632021-01-29 16:53:03 +01001917 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001918 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01001920 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001922 }
1923 PyObject *res = mp->mp_subscript(s, slice);
1924 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 Py_DECREF(slice);
1926 return res;
1927 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001930}
1931
1932int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001933PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001935 if (s == NULL) {
1936 null_error();
1937 return -1;
1938 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001939
Victor Stinnera6192632021-01-29 16:53:03 +01001940 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 if (m && m->sq_ass_item) {
1942 if (i < 0) {
1943 if (m->sq_length) {
1944 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001945 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001946 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001948 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 i += l;
1950 }
1951 }
Victor Stinnera6192632021-01-29 16:53:03 +01001952 int res = m->sq_ass_item(s, i, o);
1953 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
1954 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001956
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001957 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001958 type_error("%.200s is not a sequence", s);
1959 return -1;
1960 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 type_error("'%.200s' object does not support item assignment", s);
1962 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001963}
1964
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001965int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001966PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 if (s == NULL) {
1969 null_error();
1970 return -1;
1971 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001972
Victor Stinnera6192632021-01-29 16:53:03 +01001973 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 if (m && m->sq_ass_item) {
1975 if (i < 0) {
1976 if (m->sq_length) {
1977 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001978 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001979 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001981 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 i += l;
1983 }
1984 }
Victor Stinnera6192632021-01-29 16:53:03 +01001985 int res = m->sq_ass_item(s, i, (PyObject *)NULL);
1986 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
1987 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001989
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001990 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001991 type_error("%.200s is not a sequence", s);
1992 return -1;
1993 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 type_error("'%.200s' object doesn't support item deletion", s);
1995 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001996}
1997
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001998int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001999PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 if (s == NULL) {
2002 null_error();
2003 return -1;
2004 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002005
Victor Stinnera6192632021-01-29 16:53:03 +01002006 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00002007 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002008 PyObject *slice = _PySlice_FromIndices(i1, i2);
2009 if (!slice)
2010 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01002011 int res = mp->mp_ass_subscript(s, slice, o);
2012 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 Py_DECREF(slice);
2014 return res;
2015 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 type_error("'%.200s' object doesn't support slice assignment", s);
2018 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002019}
2020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021int
Martin v. Löwis18e16552006-02-15 17:27:45 +00002022PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 if (s == NULL) {
2025 null_error();
2026 return -1;
2027 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002028
Victor Stinnera6192632021-01-29 16:53:03 +01002029 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00002030 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01002032 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01002034 }
2035 int res = mp->mp_ass_subscript(s, slice, NULL);
2036 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 Py_DECREF(slice);
2038 return res;
2039 }
2040 type_error("'%.200s' object doesn't support slice deletion", s);
2041 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00002042}
2043
Guido van Rossume15dee51995-07-18 14:12:02 +00002044PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002045PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00002046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 PyObject *it; /* iter(v) */
2048 Py_ssize_t n; /* guess for result tuple size */
2049 PyObject *result = NULL;
2050 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00002051
Victor Stinner71aea8e2016-08-19 16:59:55 +02002052 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002054 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 /* Special-case the common tuple and list cases, for efficiency. */
2057 if (PyTuple_CheckExact(v)) {
2058 /* Note that we can't know whether it's safe to return
2059 a tuple *subclass* instance as-is, hence the restriction
2060 to exact tuples here. In contrast, lists always make
2061 a copy, so there's no need for exactness below. */
2062 Py_INCREF(v);
2063 return v;
2064 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07002065 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 /* Get iterator. */
2069 it = PyObject_GetIter(v);
2070 if (it == NULL)
2071 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02002074 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (n == -1)
2076 goto Fail;
2077 result = PyTuple_New(n);
2078 if (result == NULL)
2079 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002081 /* Fill the tuple. */
2082 for (j = 0; ; ++j) {
2083 PyObject *item = PyIter_Next(it);
2084 if (item == NULL) {
2085 if (PyErr_Occurred())
2086 goto Fail;
2087 break;
2088 }
2089 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00002090 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 /* The over-allocation strategy can grow a bit faster
2092 than for lists because unlike lists the
2093 over-allocation isn't permanent -- we reclaim
2094 the excess before the end of this routine.
2095 So, grow by ten and then add 25%.
2096 */
Martin Pantere8db8612016-07-25 02:30:05 +00002097 newn += 10u;
2098 newn += newn >> 2;
2099 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 /* Check for overflow */
2101 PyErr_NoMemory();
2102 Py_DECREF(item);
2103 goto Fail;
2104 }
Martin Pantere8db8612016-07-25 02:30:05 +00002105 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002106 if (_PyTuple_Resize(&result, n) != 0) {
2107 Py_DECREF(item);
2108 goto Fail;
2109 }
2110 }
2111 PyTuple_SET_ITEM(result, j, item);
2112 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 /* Cut tuple back if guess was too large. */
2115 if (j < n &&
2116 _PyTuple_Resize(&result, j) != 0)
2117 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002119 Py_DECREF(it);
2120 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00002121
2122Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 Py_XDECREF(result);
2124 Py_DECREF(it);
2125 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002126}
2127
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002128PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002129PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 PyObject *result; /* result list */
2132 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002133
Victor Stinner71aea8e2016-08-19 16:59:55 +02002134 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002136 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 result = PyList_New(0);
2139 if (result == NULL)
2140 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 rv = _PyList_Extend((PyListObject *)result, v);
2143 if (rv == NULL) {
2144 Py_DECREF(result);
2145 return NULL;
2146 }
2147 Py_DECREF(rv);
2148 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002149}
2150
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002151PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002152PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002155
Victor Stinner71aea8e2016-08-19 16:59:55 +02002156 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002158 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
2161 Py_INCREF(v);
2162 return v;
2163 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 it = PyObject_GetIter(v);
2166 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002167 PyThreadState *tstate = _PyThreadState_GET();
2168 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2169 _PyErr_SetString(tstate, PyExc_TypeError, m);
2170 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 return NULL;
2172 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002174 v = PySequence_List(it);
2175 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002178}
2179
Tim Peters16a77ad2001-09-08 04:00:12 +00002180/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2182 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
2183 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00002184 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2185*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002186Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002187_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 Py_ssize_t n;
2190 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2191 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 if (seq == NULL || obj == NULL) {
2194 null_error();
2195 return -1;
2196 }
Tim Peters75f8e352001-05-05 11:33:43 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 it = PyObject_GetIter(seq);
2199 if (it == NULL) {
Serhiy Storchakacafe1b62020-06-22 10:43:35 +03002200 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2201 type_error("argument of type '%.200s' is not iterable", seq);
2202 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 return -1;
2204 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 n = wrapped = 0;
2207 for (;;) {
2208 int cmp;
2209 PyObject *item = PyIter_Next(it);
2210 if (item == NULL) {
2211 if (PyErr_Occurred())
2212 goto Fail;
2213 break;
2214 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002215
Serhiy Storchaka18b711c2019-08-04 14:12:48 +03002216 cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 Py_DECREF(item);
2218 if (cmp < 0)
2219 goto Fail;
2220 if (cmp > 0) {
2221 switch (operation) {
2222 case PY_ITERSEARCH_COUNT:
2223 if (n == PY_SSIZE_T_MAX) {
2224 PyErr_SetString(PyExc_OverflowError,
2225 "count exceeds C integer size");
2226 goto Fail;
2227 }
2228 ++n;
2229 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 case PY_ITERSEARCH_INDEX:
2232 if (wrapped) {
2233 PyErr_SetString(PyExc_OverflowError,
2234 "index exceeds C integer size");
2235 goto Fail;
2236 }
2237 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 case PY_ITERSEARCH_CONTAINS:
2240 n = 1;
2241 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07002244 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002245 }
2246 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002248 if (operation == PY_ITERSEARCH_INDEX) {
2249 if (n == PY_SSIZE_T_MAX)
2250 wrapped = 1;
2251 ++n;
2252 }
2253 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (operation != PY_ITERSEARCH_INDEX)
2256 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002258 PyErr_SetString(PyExc_ValueError,
2259 "sequence.index(x): x not in sequence");
2260 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002261Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 n = -1;
2263 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002264Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 Py_DECREF(it);
2266 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002267
Guido van Rossume15dee51995-07-18 14:12:02 +00002268}
2269
Tim Peters16a77ad2001-09-08 04:00:12 +00002270/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002271Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002272PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002275}
2276
Tim Peterscb8d3682001-05-05 21:05:01 +00002277/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002278 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002279 */
2280int
2281PySequence_Contains(PyObject *seq, PyObject *ob)
2282{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002283 PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
Victor Stinnera6192632021-01-29 16:53:03 +01002284 if (sqm != NULL && sqm->sq_contains != NULL) {
2285 int res = (*sqm->sq_contains)(seq, ob);
2286 assert(_Py_CheckSlotResult(seq, "__contains__", res >= 0));
2287 return res;
2288 }
2289 Py_ssize_t result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002290 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002291}
2292
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002293/* Backwards compatibility */
2294#undef PySequence_In
2295int
Fred Drake79912472000-07-09 04:06:11 +00002296PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002299}
2300
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002301Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002302PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002305}
2306
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002307/* Operations on mappings */
2308
2309int
Fred Drake79912472000-07-09 04:06:11 +00002310PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002311{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002312 return o && Py_TYPE(o)->tp_as_mapping &&
2313 Py_TYPE(o)->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002314}
2315
Martin v. Löwis18e16552006-02-15 17:27:45 +00002316Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002317PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 if (o == NULL) {
2320 null_error();
2321 return -1;
2322 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002323
Victor Stinnera6192632021-01-29 16:53:03 +01002324 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002325 if (m && m->mp_length) {
2326 Py_ssize_t len = m->mp_length(o);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01002327 assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002328 return len;
2329 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002330
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002331 if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03002332 type_error("%.200s is not a mapping", o);
2333 return -1;
2334 }
2335 /* PyMapping_Size() can be called from PyObject_Size(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 type_error("object of type '%.200s' has no len()", o);
2337 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002338}
2339
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002340#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002341Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002342PyMapping_Length(PyObject *o)
2343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002345}
2346#define PyMapping_Length PyMapping_Size
2347
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002348PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002349PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002352
Victor Stinner71aea8e2016-08-19 16:59:55 +02002353 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002355 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 okey = PyUnicode_FromString(key);
2358 if (okey == NULL)
2359 return NULL;
2360 r = PyObject_GetItem(o, okey);
2361 Py_DECREF(okey);
2362 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002363}
2364
2365int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002366PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 PyObject *okey;
2369 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 if (key == NULL) {
2372 null_error();
2373 return -1;
2374 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 okey = PyUnicode_FromString(key);
2377 if (okey == NULL)
2378 return -1;
2379 r = PyObject_SetItem(o, okey, value);
2380 Py_DECREF(okey);
2381 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002382}
2383
2384int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002385PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 v = PyMapping_GetItemString(o, key);
2390 if (v) {
2391 Py_DECREF(v);
2392 return 1;
2393 }
2394 PyErr_Clear();
2395 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002396}
2397
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002398int
Fred Drake79912472000-07-09 04:06:11 +00002399PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002401 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 v = PyObject_GetItem(o, key);
2404 if (v) {
2405 Py_DECREF(v);
2406 return 1;
2407 }
2408 PyErr_Clear();
2409 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002410}
2411
Oren Milman0ccc0f62017-10-08 11:17:46 +03002412/* This function is quite similar to PySequence_Fast(), but specialized to be
2413 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2414 */
2415static PyObject *
2416method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2417{
2418 PyObject *it, *result, *meth_output;
2419
2420 assert(o != NULL);
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002421 meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002422 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2423 return meth_output;
2424 }
2425 it = PyObject_GetIter(meth_output);
2426 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002427 PyThreadState *tstate = _PyThreadState_GET();
2428 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2429 _PyErr_Format(tstate, PyExc_TypeError,
2430 "%.200s.%U() returned a non-iterable (type %.200s)",
2431 Py_TYPE(o)->tp_name,
2432 _PyUnicode_FromId(meth_id),
2433 Py_TYPE(meth_output)->tp_name);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002434 }
2435 Py_DECREF(meth_output);
2436 return NULL;
2437 }
2438 Py_DECREF(meth_output);
2439 result = PySequence_List(it);
2440 Py_DECREF(it);
2441 return result;
2442}
2443
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002444PyObject *
2445PyMapping_Keys(PyObject *o)
2446{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002447 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002448
Oren Milman0ccc0f62017-10-08 11:17:46 +03002449 if (o == NULL) {
2450 return null_error();
2451 }
2452 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002454 }
2455 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002456}
2457
2458PyObject *
2459PyMapping_Items(PyObject *o)
2460{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002461 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002462
Oren Milman0ccc0f62017-10-08 11:17:46 +03002463 if (o == NULL) {
2464 return null_error();
2465 }
2466 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002468 }
2469 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002470}
2471
2472PyObject *
2473PyMapping_Values(PyObject *o)
2474{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002475 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002476
Oren Milman0ccc0f62017-10-08 11:17:46 +03002477 if (o == NULL) {
2478 return null_error();
2479 }
2480 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002482 }
2483 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002484}
2485
Guido van Rossum823649d2001-03-21 18:40:58 +00002486/* isinstance(), issubclass() */
2487
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002488/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002489 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002490 * 1. getattr(cls, '__bases__') could raise an AttributeError
2491 * 2. getattr(cls, '__bases__') could raise some other exception
2492 * 3. getattr(cls, '__bases__') could return a tuple
2493 * 4. getattr(cls, '__bases__') could return something other than a tuple
2494 *
2495 * Only state #3 is a non-error state and only it returns a non-NULL object
2496 * (it returns the retrieved tuple).
2497 *
2498 * Any raised AttributeErrors are masked by clearing the exception and
2499 * returning NULL. If an object other than a tuple comes out of __bases__,
2500 * then again, the return value is NULL. So yes, these two situations
2501 * produce exactly the same results: NULL is returned and no error is set.
2502 *
2503 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002505 * exception to be propagated along.
2506 *
2507 * Callers are expected to test for PyErr_Occurred() when the return value
2508 * is NULL to decide whether a valid exception should be propagated or not.
2509 * When there's no exception to propagate, it's customary for the caller to
2510 * set a TypeError.
2511 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002512static PyObject *
2513abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002514{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002515 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002517
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002518 (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002519 if (bases != NULL && !PyTuple_Check(bases)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 Py_DECREF(bases);
2521 return NULL;
2522 }
2523 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002524}
2525
2526
2527static int
2528abstract_issubclass(PyObject *derived, PyObject *cls)
2529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 PyObject *bases = NULL;
2531 Py_ssize_t i, n;
2532 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 while (1) {
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002535 if (derived == cls) {
2536 Py_XDECREF(bases); /* See below comment */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 return 1;
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002538 }
2539 /* Use XSETREF to drop bases reference *after* finishing with
2540 derived; bases might be the only reference to it.
2541 XSETREF is used instead of SETREF, because bases is NULL on the
2542 first iteration of the loop.
2543 */
2544 Py_XSETREF(bases, abstract_get_bases(derived));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 if (bases == NULL) {
2546 if (PyErr_Occurred())
2547 return -1;
2548 return 0;
2549 }
2550 n = PyTuple_GET_SIZE(bases);
2551 if (n == 0) {
2552 Py_DECREF(bases);
2553 return 0;
2554 }
2555 /* Avoid recursivity in the single inheritance case */
2556 if (n == 1) {
2557 derived = PyTuple_GET_ITEM(bases, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 continue;
2559 }
2560 for (i = 0; i < n; i++) {
2561 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2562 if (r != 0)
2563 break;
2564 }
2565 Py_DECREF(bases);
2566 return r;
2567 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002568}
2569
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002570static int
2571check_class(PyObject *cls, const char *error)
2572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 PyObject *bases = abstract_get_bases(cls);
2574 if (bases == NULL) {
2575 /* Do not mask errors. */
Victor Stinner61b64922020-06-23 15:55:06 +02002576 PyThreadState *tstate = _PyThreadState_GET();
2577 if (!_PyErr_Occurred(tstate)) {
2578 _PyErr_SetString(tstate, PyExc_TypeError, error);
2579 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 return 0;
2581 }
2582 Py_DECREF(bases);
2583 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002584}
2585
Brett Cannon4f653312004-03-20 22:52:14 +00002586static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002587object_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002588{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 PyObject *icls;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002590 int retval;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002591 _Py_IDENTIFIER(__class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 if (PyType_Check(cls)) {
2593 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2594 if (retval == 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002595 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2596 if (icls != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002597 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 retval = PyType_IsSubtype(
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002599 (PyTypeObject *)icls,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 (PyTypeObject *)cls);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002601 }
2602 else {
2603 retval = 0;
2604 }
2605 Py_DECREF(icls);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 }
2607 }
2608 }
2609 else {
2610 if (!check_class(cls,
Maggie Moss1b4552c2020-09-09 13:23:24 -07002611 "isinstance() arg 2 must be a type, a tuple of types or a union"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 return -1;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002613 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2614 if (icls != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 retval = abstract_issubclass(icls, cls);
2616 Py_DECREF(icls);
2617 }
2618 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002621}
2622
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002623static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002624object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002625{
Benjamin Petersonce798522012-01-22 11:24:29 -05002626 _Py_IDENTIFIER(__instancecheck__);
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 /* Quick test for an exact match */
Andy Lesterdffe4c02020-03-04 07:15:20 -06002629 if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 return 1;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002631 }
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002632
Georg Brandl72b8a802014-10-03 09:26:37 +02002633 /* We know what type's __instancecheck__ does. */
2634 if (PyType_CheckExact(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002635 return object_isinstance(inst, cls);
Georg Brandl72b8a802014-10-03 09:26:37 +02002636 }
2637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 if (PyTuple_Check(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002639 /* Not a general sequence -- that opens up the road to
2640 recursion and stack overflow. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002641 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002643 }
2644 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2645 int r = 0;
2646 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002648 r = object_recursive_isinstance(tstate, inst, item);
2649 if (r != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 /* either found it, or got an error */
2651 break;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002652 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002654 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 return r;
2656 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002657
Victor Stinner850a4bd2020-02-04 13:42:13 +01002658 PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 if (checker != NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002660 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002662 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002664
Petr Viktorinffd97532020-02-11 17:46:57 +01002665 PyObject *res = PyObject_CallOneArg(checker, inst);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002666 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002668
2669 if (res == NULL) {
2670 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002672 int ok = PyObject_IsTrue(res);
2673 Py_DECREF(res);
2674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 return ok;
2676 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002677 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002679 }
2680
Victor Stinner850a4bd2020-02-04 13:42:13 +01002681 /* cls has no __instancecheck__() method */
2682 return object_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002683}
2684
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002685
2686int
2687PyObject_IsInstance(PyObject *inst, PyObject *cls)
2688{
2689 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner850a4bd2020-02-04 13:42:13 +01002690 return object_recursive_isinstance(tstate, inst, cls);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002691}
2692
2693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002695recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 if (PyType_Check(cls) && PyType_Check(derived)) {
2698 /* Fast path (non-recursive) */
2699 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2700 }
2701 if (!check_class(derived,
2702 "issubclass() arg 1 must be a class"))
2703 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002704
Miss Islington (bot)03aad302021-07-17 14:10:21 -07002705 if (!_PyUnion_Check(cls) && !check_class(cls,
Maggie Moss1b4552c2020-09-09 13:23:24 -07002706 "issubclass() arg 2 must be a class,"
2707 " a tuple of classes, or a union.")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002709 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002712}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002713
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002714static int
2715object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002716{
Benjamin Petersonce798522012-01-22 11:24:29 -05002717 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002719
Georg Brandl72b8a802014-10-03 09:26:37 +02002720 /* We know what type's __subclasscheck__ does. */
2721 if (PyType_CheckExact(cls)) {
2722 /* Quick test for an exact match */
2723 if (derived == cls)
2724 return 1;
2725 return recursive_issubclass(derived, cls);
2726 }
2727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 if (PyTuple_Check(cls)) {
Antoine Pitrouec569b72008-08-26 22:40:48 +00002729
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002730 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002731 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002732 }
2733 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2734 int r = 0;
2735 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002737 r = object_issubclass(tstate, derived, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 if (r != 0)
2739 /* either found it, or got an error */
2740 break;
2741 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002742 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 return r;
2744 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002745
Benjamin Petersonce798522012-01-22 11:24:29 -05002746 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 if (checker != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 int ok = -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002749 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 Py_DECREF(checker);
2751 return ok;
2752 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002753 PyObject *res = PyObject_CallOneArg(checker, derived);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002754 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 Py_DECREF(checker);
2756 if (res != NULL) {
2757 ok = PyObject_IsTrue(res);
2758 Py_DECREF(res);
2759 }
2760 return ok;
2761 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002762 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002764 }
2765
Georg Brandl72b8a802014-10-03 09:26:37 +02002766 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002768}
2769
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002770
2771int
2772PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2773{
2774 PyThreadState *tstate = _PyThreadState_GET();
2775 return object_issubclass(tstate, derived, cls);
2776}
2777
2778
Antoine Pitrouec569b72008-08-26 22:40:48 +00002779int
2780_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2781{
Victor Stinner850a4bd2020-02-04 13:42:13 +01002782 return object_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002783}
2784
2785int
2786_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002789}
2790
2791
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002792PyObject *
2793PyObject_GetIter(PyObject *o)
2794{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002795 PyTypeObject *t = Py_TYPE(o);
Victor Stinner14e6d092016-12-09 17:08:59 +01002796 getiterfunc f;
2797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 f = t->tp_iter;
2799 if (f == NULL) {
2800 if (PySequence_Check(o))
2801 return PySeqIter_New(o);
2802 return type_error("'%.200s' object is not iterable", o);
2803 }
2804 else {
2805 PyObject *res = (*f)(o);
2806 if (res != NULL && !PyIter_Check(res)) {
2807 PyErr_Format(PyExc_TypeError,
2808 "iter() returned non-iterator "
2809 "of type '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002810 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 Py_DECREF(res);
2812 res = NULL;
2813 }
2814 return res;
2815 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002816}
2817
Joshua Bronsonf0a6fde2021-03-23 18:47:21 -04002818PyObject *
2819PyObject_GetAiter(PyObject *o) {
2820 PyTypeObject *t = Py_TYPE(o);
2821 unaryfunc f;
2822
2823 if (t->tp_as_async == NULL || t->tp_as_async->am_aiter == NULL) {
2824 return type_error("'%.200s' object is not an AsyncIterable", o);
2825 }
2826 f = t->tp_as_async->am_aiter;
2827 PyObject *it = (*f)(o);
2828 if (it != NULL && !PyAiter_Check(it)) {
2829 PyErr_Format(PyExc_TypeError,
2830 "aiter() returned non-AsyncIterator of type '%.100s'",
2831 Py_TYPE(it)->tp_name);
2832 Py_DECREF(it);
2833 it = NULL;
2834 }
2835 return it;
2836}
2837
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002838int
2839PyIter_Check(PyObject *obj)
Christian Tismerea62ce72018-06-09 20:32:25 +02002840{
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002841 PyTypeObject *tp = Py_TYPE(obj);
2842 return (tp->tp_iternext != NULL &&
2843 tp->tp_iternext != &_PyObject_NextNotImplemented);
Christian Tismerea62ce72018-06-09 20:32:25 +02002844}
2845
Joshua Bronsonf0a6fde2021-03-23 18:47:21 -04002846int
2847PyAiter_Check(PyObject *obj)
2848{
2849 PyTypeObject *tp = Py_TYPE(obj);
2850 return (tp->tp_as_async != NULL &&
2851 tp->tp_as_async->am_aiter != NULL &&
2852 tp->tp_as_async->am_aiter != &_PyObject_NextNotImplemented &&
2853 tp->tp_as_async->am_anext != NULL &&
2854 tp->tp_as_async->am_anext != &_PyObject_NextNotImplemented);
2855}
2856
Tim Petersf4848da2001-05-05 00:14:56 +00002857/* Return next item.
2858 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2859 * If the iteration terminates normally, return NULL and clear the
2860 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2861 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002863 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002864PyObject *
2865PyIter_Next(PyObject *iter)
2866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 PyObject *result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002868 result = (*Py_TYPE(iter)->tp_iternext)(iter);
Victor Stinner61b64922020-06-23 15:55:06 +02002869 if (result == NULL) {
2870 PyThreadState *tstate = _PyThreadState_GET();
2871 if (_PyErr_Occurred(tstate)
2872 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2873 {
2874 _PyErr_Clear(tstate);
2875 }
2876 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002878}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002879
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002880PySendResult
2881PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
2882{
2883 _Py_IDENTIFIER(send);
2884 assert(arg != NULL);
2885 assert(result != NULL);
Miss Islington (bot)632e8a62021-07-23 07:56:53 -07002886 if (Py_TYPE(iter)->tp_as_async && Py_TYPE(iter)->tp_as_async->am_send) {
Victor Stinnera6192632021-01-29 16:53:03 +01002887 PySendResult res = Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
2888 assert(_Py_CheckSlotResult(iter, "am_send", res != PYGEN_ERROR));
2889 return res;
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002890 }
2891 if (arg == Py_None && PyIter_Check(iter)) {
2892 *result = Py_TYPE(iter)->tp_iternext(iter);
2893 }
2894 else {
2895 *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg);
2896 }
2897 if (*result != NULL) {
2898 return PYGEN_NEXT;
2899 }
2900 if (_PyGen_FetchStopIterationValue(result) == 0) {
2901 return PYGEN_RETURN;
2902 }
2903 return PYGEN_ERROR;
2904}
2905
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002906/*
2907 * Flatten a sequence of bytes() objects into a C array of
2908 * NULL terminated string pointers with a NULL char* terminating the array.
2909 * (ie: an argv or env list)
2910 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002911 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2912 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002913 */
2914char *const *
2915_PySequence_BytesToCharpArray(PyObject* self)
2916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 char **array;
2918 Py_ssize_t i, argc;
2919 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002920 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 argc = PySequence_Size(self);
2923 if (argc == -1)
2924 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002925
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002926 assert(argc >= 0);
2927
2928 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2929 PyErr_NoMemory();
2930 return NULL;
2931 }
2932
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002933 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 if (array == NULL) {
2935 PyErr_NoMemory();
2936 return NULL;
2937 }
2938 for (i = 0; i < argc; ++i) {
2939 char *data;
2940 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002941 if (item == NULL) {
2942 /* NULL terminate before freeing. */
2943 array[i] = NULL;
2944 goto fail;
2945 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002946 /* check for embedded null bytes */
2947 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 /* NULL terminate before freeing. */
2949 array[i] = NULL;
2950 goto fail;
2951 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002952 size = PyBytes_GET_SIZE(item) + 1;
2953 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if (!array[i]) {
2955 PyErr_NoMemory();
2956 goto fail;
2957 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002958 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 Py_DECREF(item);
2960 }
2961 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002964
2965fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966 Py_XDECREF(item);
2967 _Py_FreeCharPArray(array);
2968 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002969}
2970
2971
2972/* Free's a NULL terminated char** array of C strings. */
2973void
2974_Py_FreeCharPArray(char *const array[])
2975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 Py_ssize_t i;
2977 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002978 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002980 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002981}