blob: c93309b352774cb44a212c88acb82242ef616ff2 [file] [log] [blame]
Guido van Rossume15dee51995-07-18 14:12:02 +00001/* Abstract Object Interface (many thanks to Jim Fulton) */
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002
Guido van Rossume15dee51995-07-18 14:12:02 +00003#include "Python.h"
Victor Stinner4a21e572020-04-15 02:35:41 +02004#include "pycore_abstract.h" // _PyIndex_Check()
5#include "pycore_ceval.h" // _Py_EnterRecursiveCall()
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01006#include "pycore_object.h" // _Py_CheckSlotResult()
Victor Stinner61b64922020-06-23 15:55:06 +02007#include "pycore_pyerrors.h" // _PyErr_Occurred()
Victor Stinner4a21e572020-04-15 02:35:41 +02008#include "pycore_pystate.h" // _PyThreadState_GET()
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01009#include "pycore_unionobject.h" // _Py_UnionType && _Py_Union()
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +000010#include <ctype.h>
Victor Stinner4a21e572020-04-15 02:35:41 +020011#include <stddef.h> // offsetof()
Tim Peters64b5ce32001-09-10 20:52:51 +000012#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +000013
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000014
Thomas Wouters00ee7ba2006-08-21 19:07:27 +000015
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000016/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000017
18static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000019type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000020{
Victor Stinner0d76d2b2020-02-07 01:53:23 +010021 PyErr_Format(PyExc_TypeError, msg, Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000023}
24
Guido van Rossum052b7e11996-11-11 15:08:19 +000025static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000026null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000027{
Victor Stinner61b64922020-06-23 15:55:06 +020028 PyThreadState *tstate = _PyThreadState_GET();
29 if (!_PyErr_Occurred(tstate)) {
30 _PyErr_SetString(tstate, PyExc_SystemError,
31 "null argument to internal routine");
32 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000034}
35
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000036/* Operations on any object */
37
Guido van Rossume15dee51995-07-18 14:12:02 +000038PyObject *
Fred Drake79912472000-07-09 04:06:11 +000039PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000042
Victor Stinner71aea8e2016-08-19 16:59:55 +020043 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000044 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020045 }
46
Victor Stinner0d76d2b2020-02-07 01:53:23 +010047 v = (PyObject *)Py_TYPE(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 Py_INCREF(v);
49 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000050}
51
Martin v. Löwis18e16552006-02-15 17:27:45 +000052Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000053PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000054{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 if (o == NULL) {
56 null_error();
57 return -1;
58 }
Guido van Rossume15dee51995-07-18 14:12:02 +000059
Victor Stinnera6192632021-01-29 16:53:03 +010060 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +030061 if (m && m->sq_length) {
62 Py_ssize_t len = m->sq_length(o);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +010063 assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +030064 return len;
65 }
Guido van Rossume15dee51995-07-18 14:12:02 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000068}
69
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000070#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000071Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000072PyObject_Length(PyObject *o)
73{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000075}
76#define PyObject_Length PyObject_Size
77
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020078int
79_PyObject_HasLen(PyObject *o) {
80 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
81 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
82}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000083
Christian Heimes255f53b2007-12-08 15:33:56 +000084/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020085 or o.__length_hint__(). If those methods aren't found the defaultvalue is
86 returned. If one of the calls fails with an exception other than TypeError
87 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000088*/
89
90Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020091PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000092{
Christian Heimesb70e8a12012-10-06 17:16:39 +020093 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020094 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050095 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030096 if (_PyObject_HasLen(o)) {
97 res = PyObject_Length(o);
Serhiy Storchaka813f9432017-04-16 09:21:44 +030098 if (res < 0) {
Victor Stinner61b64922020-06-23 15:55:06 +020099 PyThreadState *tstate = _PyThreadState_GET();
100 assert(_PyErr_Occurred(tstate));
101 if (!_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300102 return -1;
103 }
Victor Stinner61b64922020-06-23 15:55:06 +0200104 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200105 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +0300106 else {
107 return res;
108 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 }
Christian Heimes6314d162012-10-06 17:13:29 +0200110 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200111 if (hint == NULL) {
112 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200114 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 return defaultvalue;
116 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100117 result = _PyObject_CallNoArg(hint);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200118 Py_DECREF(hint);
119 if (result == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200120 PyThreadState *tstate = _PyThreadState_GET();
121 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
122 _PyErr_Clear(tstate);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200123 return defaultvalue;
124 }
125 return -1;
126 }
127 else if (result == Py_NotImplemented) {
128 Py_DECREF(result);
129 return defaultvalue;
130 }
131 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200132 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200133 Py_TYPE(result)->tp_name);
134 Py_DECREF(result);
135 return -1;
136 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200137 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200138 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200139 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200140 return -1;
141 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200142 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200143 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
144 return -1;
145 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200146 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000147}
148
Guido van Rossume15dee51995-07-18 14:12:02 +0000149PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000150PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000151{
Victor Stinner71aea8e2016-08-19 16:59:55 +0200152 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200154 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000155
Victor Stinnera6192632021-01-29 16:53:03 +0100156 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100157 if (m && m->mp_subscript) {
158 PyObject *item = m->mp_subscript(o, key);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +0100159 assert(_Py_CheckSlotResult(o, "__getitem__", item != NULL));
Victor Stinnere20310f2015-11-05 13:56:58 +0100160 return item;
161 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000162
Victor Stinnera6192632021-01-29 16:53:03 +0100163 PySequenceMethods *ms = Py_TYPE(o)->tp_as_sequence;
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000164 if (ms && ms->sq_item) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200165 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 Py_ssize_t key_value;
167 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
168 if (key_value == -1 && PyErr_Occurred())
169 return NULL;
170 return PySequence_GetItem(o, key_value);
171 }
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000172 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 return type_error("sequence index must "
174 "be integer, not '%.200s'", key);
Ivan Levkivskyiac281472019-02-17 23:13:46 +0000175 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000177
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100178 if (PyType_Check(o)) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200179 PyObject *meth, *result;
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100180 _Py_IDENTIFIER(__class_getitem__);
Victor Stinnera15e2602020-04-08 02:01:56 +0200181
Guido van Rossum48b069a2020-04-07 09:50:06 -0700182 // Special case type[int], but disallow other types so str[int] fails
183 if ((PyTypeObject*)o == &PyType_Type) {
184 return Py_GenericAlias(o, key);
185 }
186
Serhiy Storchakaf320be72018-01-25 10:49:40 +0200187 if (_PyObject_LookupAttrId(o, &PyId___class_getitem__, &meth) < 0) {
188 return NULL;
189 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100190 if (meth) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100191 result = PyObject_CallOneArg(meth, key);
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100192 Py_DECREF(meth);
193 return result;
194 }
Ivan Levkivskyi2b5fd1e2017-12-14 23:32:56 +0100195 }
196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000198}
199
200int
Fred Drake79912472000-07-09 04:06:11 +0000201PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 if (o == NULL || key == NULL || value == NULL) {
204 null_error();
205 return -1;
206 }
Victor Stinnera6192632021-01-29 16:53:03 +0100207
208 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
209 if (m && m->mp_ass_subscript) {
210 int res = m->mp_ass_subscript(o, key, value);
211 assert(_Py_CheckSlotResult(o, "__setitem__", res >= 0));
212 return res;
213 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000214
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100215 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200216 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 Py_ssize_t key_value;
218 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
219 if (key_value == -1 && PyErr_Occurred())
220 return -1;
221 return PySequence_SetItem(o, key_value, value);
222 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100223 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 type_error("sequence index must be "
225 "integer, not '%.200s'", key);
226 return -1;
227 }
228 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 type_error("'%.200s' object does not support item assignment", o);
231 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000232}
233
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000234int
Fred Drake79912472000-07-09 04:06:11 +0000235PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 if (o == NULL || key == NULL) {
238 null_error();
239 return -1;
240 }
Victor Stinnera6192632021-01-29 16:53:03 +0100241
242 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
243 if (m && m->mp_ass_subscript) {
244 int res = m->mp_ass_subscript(o, key, (PyObject*)NULL);
245 assert(_Py_CheckSlotResult(o, "__delitem__", res >= 0));
246 return res;
247 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000248
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100249 if (Py_TYPE(o)->tp_as_sequence) {
Victor Stinnera15e2602020-04-08 02:01:56 +0200250 if (_PyIndex_Check(key)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_ssize_t key_value;
252 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
253 if (key_value == -1 && PyErr_Occurred())
254 return -1;
255 return PySequence_DelItem(o, key_value);
256 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100257 else if (Py_TYPE(o)->tp_as_sequence->sq_ass_item) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000258 type_error("sequence index must be "
259 "integer, not '%.200s'", key);
260 return -1;
261 }
262 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 type_error("'%.200s' object does not support item deletion", o);
265 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000266}
267
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000268int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300269PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000270{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 PyObject *okey;
272 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 if (o == NULL || key == NULL) {
275 null_error();
276 return -1;
277 }
278 okey = PyUnicode_FromString(key);
279 if (okey == NULL)
280 return -1;
281 ret = PyObject_DelItem(o, okey);
282 Py_DECREF(okey);
283 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000284}
285
Victor Stinneref5c6152020-04-08 01:13:53 +0200286
287/* Return 1 if the getbuffer function is available, otherwise return 0. */
288int
289PyObject_CheckBuffer(PyObject *obj)
290{
291 PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer;
292 return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL);
293}
294
295
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000296/* Buffer C-API for Python 3.0 */
297
298int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000299PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000300{
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100301 PyBufferProcs *pb = Py_TYPE(obj)->tp_as_buffer;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200302
303 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400305 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 Py_TYPE(obj)->tp_name);
307 return -1;
308 }
Victor Stinnera6192632021-01-29 16:53:03 +0100309 int res = (*pb->bf_getbuffer)(obj, view, flags);
310 assert(_Py_CheckSlotResult(obj, "getbuffer", res >= 0));
311 return res;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000312}
313
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000314static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100315_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 Py_ssize_t sd, dim;
318 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000319
Stefan Krah363af442015-02-01 14:53:54 +0100320 /* 1) len = product(shape) * itemsize
321 2) itemsize > 0
322 3) len = 0 <==> exists i: shape[i] = 0 */
323 if (view->len == 0) return 1;
324 if (view->strides == NULL) { /* C-contiguous by definition */
325 /* Trivially F-contiguous */
326 if (view->ndim <= 1) return 1;
327
328 /* ndim > 1 implies shape != NULL */
329 assert(view->shape != NULL);
330
331 /* Effectively 1-d */
332 sd = 0;
333 for (i=0; i<view->ndim; i++) {
334 if (view->shape[i] > 1) sd += 1;
335 }
336 return sd <= 1;
337 }
338
339 /* strides != NULL implies both of these */
340 assert(view->ndim > 0);
341 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 for (i=0; i<view->ndim; i++) {
345 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100346 if (dim > 1 && view->strides[i] != sd) {
347 return 0;
348 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 sd *= dim;
350 }
351 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000352}
353
354static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100355_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 Py_ssize_t sd, dim;
358 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000359
Stefan Krah363af442015-02-01 14:53:54 +0100360 /* 1) len = product(shape) * itemsize
361 2) itemsize > 0
362 3) len = 0 <==> exists i: shape[i] = 0 */
363 if (view->len == 0) return 1;
364 if (view->strides == NULL) return 1; /* C-contiguous by definition */
365
366 /* strides != NULL implies both of these */
367 assert(view->ndim > 0);
368 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 for (i=view->ndim-1; i>=0; i--) {
372 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100373 if (dim > 1 && view->strides[i] != sd) {
374 return 0;
375 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 sd *= dim;
377 }
378 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000379}
380
381int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100382PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000383{
384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000386
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100387 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100389 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100391 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 return (_IsCContiguous(view) || _IsFortranContiguous(view));
393 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000394}
395
396
Guido van Rossum98297ee2007-11-06 21:34:58 +0000397void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000398PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 char* pointer;
401 int i;
402 pointer = (char *)view->buf;
403 for (i = 0; i < view->ndim; i++) {
404 pointer += view->strides[i]*indices[i];
405 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
406 pointer = *((char**)pointer) + view->suboffsets[i];
407 }
408 }
409 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000410}
411
412
Guido van Rossum98297ee2007-11-06 21:34:58 +0000413void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000414_Py_add_one_to_index_F(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 for (k=0; k<nd; k++) {
419 if (index[k] < shape[k]-1) {
420 index[k]++;
421 break;
422 }
423 else {
424 index[k] = 0;
425 }
426 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000427}
428
Guido van Rossum98297ee2007-11-06 21:34:58 +0000429void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000430_Py_add_one_to_index_C(int nd, Py_ssize_t *index, const Py_ssize_t *shape)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 for (k=nd-1; k>=0; k--) {
435 if (index[k] < shape[k]-1) {
436 index[k]++;
437 break;
438 }
439 else {
440 index[k] = 0;
441 }
442 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000443}
444
Joannah Nanjekye9e66aba2019-08-20 11:46:36 -0300445Py_ssize_t
446PyBuffer_SizeFromFormat(const char *format)
447{
448 PyObject *structmodule = NULL;
449 PyObject *calcsize = NULL;
450 PyObject *res = NULL;
451 PyObject *fmt = NULL;
452 Py_ssize_t itemsize = -1;
453
454 structmodule = PyImport_ImportModule("struct");
455 if (structmodule == NULL) {
456 return itemsize;
457 }
458
459 calcsize = PyObject_GetAttrString(structmodule, "calcsize");
460 if (calcsize == NULL) {
461 goto done;
462 }
463
464 fmt = PyUnicode_FromString(format);
465 if (fmt == NULL) {
466 goto done;
467 }
468
469 res = PyObject_CallFunctionObjArgs(calcsize, fmt, NULL);
470 if (res == NULL) {
471 goto done;
472 }
473
474 itemsize = PyLong_AsSsize_t(res);
475 if (itemsize < 0) {
476 goto done;
477 }
478
479done:
480 Py_DECREF(structmodule);
481 Py_XDECREF(calcsize);
482 Py_XDECREF(fmt);
483 Py_XDECREF(res);
484 return itemsize;
485}
486
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000487int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000488PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000489{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000491 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 Py_ssize_t *indices, elements;
493 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (len > view->len) {
496 len = view->len;
497 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 if (PyBuffer_IsContiguous(view, fort)) {
500 /* simplest copy is all that is needed */
501 memcpy(view->buf, buf, len);
502 return 0;
503 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000506
Stefan Krah7213fcc2015-02-01 16:19:23 +0100507 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
509 if (indices == NULL) {
510 PyErr_NoMemory();
511 return -1;
512 }
513 for (k=0; k<view->ndim;k++) {
514 indices[k] = 0;
515 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000518 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 }
520 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000521 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 }
523 src = buf;
524 /* XXX : This is not going to be the fastest code in the world
525 several optimizations are possible.
526 */
527 elements = len / view->itemsize;
528 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 ptr = PyBuffer_GetPointer(view, indices);
530 memcpy(ptr, src, view->itemsize);
531 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100532 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 PyMem_Free(indices);
536 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000537}
538
Guido van Rossum98297ee2007-11-06 21:34:58 +0000539int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 Py_buffer view_dest, view_src;
542 int k;
543 Py_ssize_t *indices, elements;
544 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (!PyObject_CheckBuffer(dest) ||
547 !PyObject_CheckBuffer(src)) {
548 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400549 "both destination and source must be "\
550 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return -1;
552 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
555 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
556 PyBuffer_Release(&view_dest);
557 return -1;
558 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 if (view_dest.len < view_src.len) {
561 PyErr_SetString(PyExc_BufferError,
562 "destination is too small to receive data from source");
563 PyBuffer_Release(&view_dest);
564 PyBuffer_Release(&view_src);
565 return -1;
566 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
569 PyBuffer_IsContiguous(&view_src, 'C')) ||
570 (PyBuffer_IsContiguous(&view_dest, 'F') &&
571 PyBuffer_IsContiguous(&view_src, 'F'))) {
572 /* simplest copy is all that is needed */
573 memcpy(view_dest.buf, view_src.buf, view_src.len);
574 PyBuffer_Release(&view_dest);
575 PyBuffer_Release(&view_src);
576 return 0;
577 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 /* XXX(nnorwitz): need to check for overflow! */
582 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
583 if (indices == NULL) {
584 PyErr_NoMemory();
585 PyBuffer_Release(&view_dest);
586 PyBuffer_Release(&view_src);
587 return -1;
588 }
589 for (k=0; k<view_src.ndim;k++) {
590 indices[k] = 0;
591 }
592 elements = 1;
593 for (k=0; k<view_src.ndim; k++) {
594 /* XXX(nnorwitz): can this overflow? */
595 elements *= view_src.shape[k];
596 }
597 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000598 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 dptr = PyBuffer_GetPointer(&view_dest, indices);
600 sptr = PyBuffer_GetPointer(&view_src, indices);
601 memcpy(dptr, sptr, view_src.itemsize);
602 }
603 PyMem_Free(indices);
604 PyBuffer_Release(&view_dest);
605 PyBuffer_Release(&view_src);
606 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000607}
608
609void
610PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 Py_ssize_t *strides, int itemsize,
612 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 int k;
615 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 sd = itemsize;
618 if (fort == 'F') {
619 for (k=0; k<nd; k++) {
620 strides[k] = sd;
621 sd *= shape[k];
622 }
623 }
624 else {
625 for (k=nd-1; k>=0; k--) {
626 strides[k] = sd;
627 sd *= shape[k];
628 }
629 }
630 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000631}
632
633int
Martin v. Löwis423be952008-08-13 15:53:07 +0000634PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100635 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000636{
Stefan Krah5178d912015-02-03 16:57:21 +0100637 if (view == NULL) {
638 PyErr_SetString(PyExc_BufferError,
Victor Stinner61b64922020-06-23 15:55:06 +0200639 "PyBuffer_FillInfo: view==NULL argument is obsolete");
Stefan Krah5178d912015-02-03 16:57:21 +0100640 return -1;
641 }
642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
644 (readonly == 1)) {
645 PyErr_SetString(PyExc_BufferError,
646 "Object is not writable.");
647 return -1;
648 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 view->obj = obj;
651 if (obj)
652 Py_INCREF(obj);
653 view->buf = buf;
654 view->len = len;
655 view->readonly = readonly;
656 view->itemsize = 1;
657 view->format = NULL;
658 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
659 view->format = "B";
660 view->ndim = 1;
661 view->shape = NULL;
662 if ((flags & PyBUF_ND) == PyBUF_ND)
663 view->shape = &(view->len);
664 view->strides = NULL;
665 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
666 view->strides = &(view->itemsize);
667 view->suboffsets = NULL;
668 view->internal = NULL;
669 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000670}
671
Martin v. Löwis423be952008-08-13 15:53:07 +0000672void
673PyBuffer_Release(Py_buffer *view)
674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200676 PyBufferProcs *pb;
677 if (obj == NULL)
678 return;
679 pb = Py_TYPE(obj)->tp_as_buffer;
Victor Stinnera6192632021-01-29 16:53:03 +0100680 if (pb && pb->bf_releasebuffer) {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200681 pb->bf_releasebuffer(obj, view);
Victor Stinnera6192632021-01-29 16:53:03 +0100682 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200684 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000685}
686
Eric Smith8fd3eba2008-02-17 19:48:00 +0000687PyObject *
688PyObject_Format(PyObject *obj, PyObject *format_spec)
689{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000690 PyObject *meth;
691 PyObject *empty = NULL;
692 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500693 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000694
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300695 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
696 PyErr_Format(PyExc_SystemError,
697 "Format specifier must be a string, not %.200s",
698 Py_TYPE(format_spec)->tp_name);
699 return NULL;
700 }
701
702 /* Fast path for common types. */
703 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
704 if (PyUnicode_CheckExact(obj)) {
705 Py_INCREF(obj);
706 return obj;
707 }
708 if (PyLong_CheckExact(obj)) {
709 return PyObject_Str(obj);
710 }
711 }
712
Eric Smith8fd3eba2008-02-17 19:48:00 +0000713 /* If no format_spec is provided, use an empty string */
714 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100715 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000716 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000717 }
718
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300719 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500720 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000721 if (meth == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +0200722 PyThreadState *tstate = _PyThreadState_GET();
723 if (!_PyErr_Occurred(tstate)) {
724 _PyErr_Format(tstate, PyExc_TypeError,
725 "Type %.100s doesn't define __format__",
726 Py_TYPE(obj)->tp_name);
727 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000729 }
730
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000731 /* And call it. */
Petr Viktorinffd97532020-02-11 17:46:57 +0100732 result = PyObject_CallOneArg(meth, format_spec);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000733 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000734
735 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800736 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +0200737 "__format__ must return a str, not %.200s",
738 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000739 Py_DECREF(result);
740 result = NULL;
741 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000742 }
743
744done:
745 Py_XDECREF(empty);
746 return result;
747}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000748/* Operations on numbers */
749
750int
Fred Drake79912472000-07-09 04:06:11 +0000751PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000752{
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +0300753 if (o == NULL)
754 return 0;
755 PyNumberMethods *nb = Py_TYPE(o)->tp_as_number;
756 return nb && (nb->nb_index || nb->nb_int || nb->nb_float || PyComplex_Check(o));
Guido van Rossume15dee51995-07-18 14:12:02 +0000757}
758
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000759/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000760
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000761#define NB_SLOT(x) offsetof(PyNumberMethods, x)
762#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000764#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000766
767/*
768 Calling scheme used for binary operations:
769
Neal Norwitz4886cc32006-08-21 17:06:07 +0000770 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000772
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100773 [*] only when Py_TYPE(v) != Py_TYPE(w) && Py_TYPE(w) is a subclass of
774 Py_TYPE(v)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000775 */
776
777static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +0100778binary_op1(PyObject *v, PyObject *w, const int op_slot
779#ifndef NDEBUG
780 , const char *op_name
781#endif
782 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000783{
Victor Stinnera6192632021-01-29 16:53:03 +0100784 binaryfunc slotv;
785 if (Py_TYPE(v)->tp_as_number != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100786 slotv = NB_BINOP(Py_TYPE(v)->tp_as_number, op_slot);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 }
Victor Stinnera6192632021-01-29 16:53:03 +0100788 else {
789 slotv = NULL;
790 }
791
792 binaryfunc slotw;
793 if (!Py_IS_TYPE(w, Py_TYPE(v)) && Py_TYPE(w)->tp_as_number != NULL) {
794 slotw = NB_BINOP(Py_TYPE(w)->tp_as_number, op_slot);
795 if (slotw == slotv) {
796 slotw = NULL;
797 }
798 }
799 else {
800 slotw = NULL;
801 }
802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100804 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100805 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 x = slotw(v, w);
807 if (x != Py_NotImplemented)
808 return x;
809 Py_DECREF(x); /* can't do it */
810 slotw = NULL;
811 }
812 x = slotv(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +0100813 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
814 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100816 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 Py_DECREF(x); /* can't do it */
818 }
819 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +0100820 PyObject *x = slotw(v, w);
821 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
822 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100824 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 Py_DECREF(x); /* can't do it */
826 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500827 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000828}
Guido van Rossum77660912002-04-16 16:32:50 +0000829
Victor Stinnera6192632021-01-29 16:53:03 +0100830#ifdef NDEBUG
831# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot)
832#else
833# define BINARY_OP1(v, w, op_slot, op_name) binary_op1(v, w, op_slot, op_name)
834#endif
835
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000836static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000837binop_type_error(PyObject *v, PyObject *w, const char *op_name)
838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 PyErr_Format(PyExc_TypeError,
840 "unsupported operand type(s) for %.100s: "
841 "'%.100s' and '%.100s'",
842 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100843 Py_TYPE(v)->tp_name,
844 Py_TYPE(w)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000846}
847
848static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000849binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
850{
Victor Stinnera6192632021-01-29 16:53:03 +0100851 PyObject *result = BINARY_OP1(v, w, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 if (result == Py_NotImplemented) {
853 Py_DECREF(result);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530854
855 if (op_slot == NB_SLOT(nb_rshift) &&
scoder4c9ea092020-05-12 16:12:41 +0200856 PyCFunction_CheckExact(v) &&
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530857 strcmp(((PyCFunctionObject *)v)->m_ml->ml_name, "print") == 0)
858 {
859 PyErr_Format(PyExc_TypeError,
860 "unsupported operand type(s) for %.100s: "
861 "'%.100s' and '%.100s'. Did you mean \"print(<message>, "
Sanyam Khuranaa7c449b2017-08-18 17:48:14 +0530862 "file=<output_stream>)\"?",
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530863 op_name,
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100864 Py_TYPE(v)->tp_name,
865 Py_TYPE(w)->tp_name);
Sanyam Khurana5e2eb352017-08-18 16:07:36 +0530866 return NULL;
867 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return binop_type_error(v, w, op_name);
869 }
870 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000871}
872
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000873
874/*
875 Calling scheme used for ternary operations:
876
Neal Norwitz4886cc32006-08-21 17:06:07 +0000877 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000879 */
880
881static PyObject *
882ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 PyObject *w,
884 PyObject *z,
Victor Stinnera6192632021-01-29 16:53:03 +0100885 const int op_slot
886#ifndef NDEBUG
887 , const char *op_name
888#endif
889 )
Guido van Rossume15dee51995-07-18 14:12:02 +0000890{
Victor Stinnera6192632021-01-29 16:53:03 +0100891 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
892 PyNumberMethods *mw = Py_TYPE(w)->tp_as_number;
Guido van Rossum77660912002-04-16 16:32:50 +0000893
Victor Stinnera6192632021-01-29 16:53:03 +0100894 ternaryfunc slotv;
895 if (mv != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 slotv = NB_TERNOP(mv, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100897 }
898 else {
899 slotv = NULL;
900 }
901
902 ternaryfunc slotw;
Andy Lester55728702020-03-06 16:53:17 -0600903 if (!Py_IS_TYPE(w, Py_TYPE(v)) && mw != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 slotw = NB_TERNOP(mw, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +0100905 if (slotw == slotv) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 slotw = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100907 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 }
Victor Stinnera6192632021-01-29 16:53:03 +0100909 else {
910 slotw = NULL;
911 }
912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 if (slotv) {
Victor Stinnera6192632021-01-29 16:53:03 +0100914 PyObject *x;
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100915 if (slotw && PyType_IsSubtype(Py_TYPE(w), Py_TYPE(v))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 x = slotw(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +0100917 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100919 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 Py_DECREF(x); /* can't do it */
921 slotw = NULL;
922 }
923 x = slotv(v, w, z);
Victor Stinnera6192632021-01-29 16:53:03 +0100924 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
925 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100927 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 Py_DECREF(x); /* can't do it */
929 }
930 if (slotw) {
Victor Stinnera6192632021-01-29 16:53:03 +0100931 PyObject *x = slotw(v, w, z);
932 assert(_Py_CheckSlotResult(w, op_name, x != NULL));
933 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100935 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 Py_DECREF(x); /* can't do it */
937 }
Victor Stinnera6192632021-01-29 16:53:03 +0100938
939 PyNumberMethods *mz = Py_TYPE(z)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 if (mz != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +0100941 ternaryfunc slotz = NB_TERNOP(mz, op_slot);
942 if (slotz == slotv || slotz == slotw) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 slotz = NULL;
Victor Stinnera6192632021-01-29 16:53:03 +0100944 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 if (slotz) {
Victor Stinnera6192632021-01-29 16:53:03 +0100946 PyObject *x = slotz(v, w, z);
947 assert(_Py_CheckSlotResult(z, op_name, x != NULL));
948 if (x != Py_NotImplemented) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 return x;
Victor Stinnera6192632021-01-29 16:53:03 +0100950 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000951 Py_DECREF(x); /* can't do it */
952 }
953 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000954
Victor Stinnera6192632021-01-29 16:53:03 +0100955 if (z == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 PyErr_Format(
957 PyExc_TypeError,
958 "unsupported operand type(s) for ** or pow(): "
959 "'%.100s' and '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100960 Py_TYPE(v)->tp_name,
961 Py_TYPE(w)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +0100962 }
963 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 PyErr_Format(
965 PyExc_TypeError,
966 "unsupported operand type(s) for pow(): "
967 "'%.100s', '%.100s', '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +0100968 Py_TYPE(v)->tp_name,
969 Py_TYPE(w)->tp_name,
970 Py_TYPE(z)->tp_name);
Victor Stinnera6192632021-01-29 16:53:03 +0100971 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000973}
974
Victor Stinnera6192632021-01-29 16:53:03 +0100975#ifdef NDEBUG
976# define TERNARY_OP(v, w, z, op_slot, op_name) ternary_op(v, w, z, op_slot)
977#else
978# define TERNARY_OP(v, w, z, op_slot, op_name) ternary_op(v, w, z, op_slot, op_name)
979#endif
980
981
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000982#define BINARY_FUNC(func, op, op_name) \
983 PyObject * \
984 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000986 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000987
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000988BINARY_FUNC(PyNumber_Or, nb_or, "|")
989BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
990BINARY_FUNC(PyNumber_And, nb_and, "&")
991BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
992BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
993BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000994BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000995
996PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000997PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000998{
Victor Stinnera6192632021-01-29 16:53:03 +0100999 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_add), "+");
1000 if (result != Py_NotImplemented) {
1001 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 }
Victor Stinnera6192632021-01-29 16:53:03 +01001003 Py_DECREF(result);
1004
1005 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
1006 if (m && m->sq_concat) {
1007 result = (*m->sq_concat)(v, w);
1008 assert(_Py_CheckSlotResult(v, "+", result != NULL));
1009 return result;
1010 }
1011
1012 return binop_type_error(v, w, "+");
Guido van Rossume15dee51995-07-18 14:12:02 +00001013}
1014
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001015static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001016sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 Py_ssize_t count;
Victor Stinnera15e2602020-04-08 02:01:56 +02001019 if (_PyIndex_Check(n)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
Victor Stinnera6192632021-01-29 16:53:03 +01001021 if (count == -1 && PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001023 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 }
1025 else {
1026 return type_error("can't multiply sequence by "
1027 "non-int of type '%.200s'", n);
1028 }
Victor Stinnera6192632021-01-29 16:53:03 +01001029 PyObject *res = (*repeatfunc)(seq, count);
1030 assert(_Py_CheckSlotResult(seq, "*", res != NULL));
1031 return res;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001032}
1033
1034PyObject *
1035PyNumber_Multiply(PyObject *v, PyObject *w)
1036{
Victor Stinnera6192632021-01-29 16:53:03 +01001037 PyObject *result = BINARY_OP1(v, w, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001039 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1040 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 Py_DECREF(result);
1042 if (mv && mv->sq_repeat) {
1043 return sequence_repeat(mv->sq_repeat, v, w);
1044 }
1045 else if (mw && mw->sq_repeat) {
1046 return sequence_repeat(mw->sq_repeat, w, v);
1047 }
1048 result = binop_type_error(v, w, "*");
1049 }
1050 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001051}
1052
Guido van Rossume15dee51995-07-18 14:12:02 +00001053PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001054PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
1055{
1056 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
1057}
1058
1059PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001060PyNumber_FloorDivide(PyObject *v, PyObject *w)
1061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +00001063}
1064
1065PyObject *
1066PyNumber_TrueDivide(PyObject *v, PyObject *w)
1067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001068 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +00001069}
1070
1071PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001072PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +00001073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +00001075}
1076
1077PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001078PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +00001079{
Victor Stinnera6192632021-01-29 16:53:03 +01001080 return TERNARY_OP(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001081}
1082
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001083/* Binary in-place operators */
1084
1085/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001086 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001087
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001088 - If the left hand object has the appropriate struct members, and
1089 they are filled, call the appropriate function and return the
1090 result. No coercion is done on the arguments; the left-hand object
1091 is the one the operation is performed on, and it's up to the
1092 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001093
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001094 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001095 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001096
1097 */
1098
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001099static PyObject *
Victor Stinnera6192632021-01-29 16:53:03 +01001100binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot
1101#ifndef NDEBUG
1102 , const char *op_name
1103#endif
1104 )
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001105{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001106 PyNumberMethods *mv = Py_TYPE(v)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 if (mv != NULL) {
1108 binaryfunc slot = NB_BINOP(mv, iop_slot);
1109 if (slot) {
1110 PyObject *x = (slot)(v, w);
Victor Stinnera6192632021-01-29 16:53:03 +01001111 assert(_Py_CheckSlotResult(v, op_name, x != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 if (x != Py_NotImplemented) {
1113 return x;
1114 }
1115 Py_DECREF(x);
1116 }
1117 }
Victor Stinnera6192632021-01-29 16:53:03 +01001118#ifdef NDEBUG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 return binary_op1(v, w, op_slot);
Victor Stinnera6192632021-01-29 16:53:03 +01001120#else
1121 return binary_op1(v, w, op_slot, op_name);
1122#endif
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001123}
1124
Victor Stinnera6192632021-01-29 16:53:03 +01001125#ifdef NDEBUG
1126# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot)
1127#else
1128# define BINARY_IOP1(v, w, iop_slot, op_slot, op_name) binary_iop1(v, w, iop_slot, op_slot, op_name)
1129#endif
1130
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001131static PyObject *
1132binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001134{
Victor Stinnera6192632021-01-29 16:53:03 +01001135 PyObject *result = BINARY_IOP1(v, w, iop_slot, op_slot, op_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 if (result == Py_NotImplemented) {
1137 Py_DECREF(result);
1138 return binop_type_error(v, w, op_name);
1139 }
1140 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001141}
1142
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001143#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 PyObject * \
1145 func(PyObject *v, PyObject *w) { \
1146 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1147 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001148
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001149INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1150INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1151INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1152INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1153INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1154INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001155INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001156
1157PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001158PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1161 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001162}
1163
1164PyObject *
1165PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1166{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1168 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001169}
1170
1171PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001172PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1173{
Victor Stinnera6192632021-01-29 16:53:03 +01001174 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_add),
1175 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 if (result == Py_NotImplemented) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001177 PySequenceMethods *m = Py_TYPE(v)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 Py_DECREF(result);
1179 if (m != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +01001180 binaryfunc func = m->sq_inplace_concat;
1181 if (func == NULL)
1182 func = m->sq_concat;
1183 if (func != NULL) {
1184 result = func(v, w);
1185 assert(_Py_CheckSlotResult(v, "+=", result != NULL));
1186 return result;
1187 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 }
1189 result = binop_type_error(v, w, "+=");
1190 }
1191 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001192}
1193
1194PyObject *
1195PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1196{
Victor Stinnera6192632021-01-29 16:53:03 +01001197 PyObject *result = BINARY_IOP1(v, w, NB_SLOT(nb_inplace_multiply),
1198 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 if (result == Py_NotImplemented) {
1200 ssizeargfunc f = NULL;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001201 PySequenceMethods *mv = Py_TYPE(v)->tp_as_sequence;
1202 PySequenceMethods *mw = Py_TYPE(w)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 Py_DECREF(result);
1204 if (mv != NULL) {
1205 f = mv->sq_inplace_repeat;
1206 if (f == NULL)
1207 f = mv->sq_repeat;
1208 if (f != NULL)
1209 return sequence_repeat(f, v, w);
1210 }
1211 else if (mw != NULL) {
1212 /* Note that the right hand operand should not be
1213 * mutated in this case so sq_inplace_repeat is not
1214 * used. */
1215 if (mw->sq_repeat)
1216 return sequence_repeat(mw->sq_repeat, w, v);
1217 }
1218 result = binop_type_error(v, w, "*=");
1219 }
1220 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001221}
1222
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001223PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001224PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1225{
1226 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1227 NB_SLOT(nb_matrix_multiply), "@=");
1228}
1229
1230PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001231PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1232{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001233 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1234 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001235}
1236
1237PyObject *
1238PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1239{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001240 if (Py_TYPE(v)->tp_as_number &&
1241 Py_TYPE(v)->tp_as_number->nb_inplace_power != NULL) {
Victor Stinnera6192632021-01-29 16:53:03 +01001242 return TERNARY_OP(v, w, z, NB_SLOT(nb_inplace_power), "**=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001243 }
1244 else {
Victor Stinnera6192632021-01-29 16:53:03 +01001245 return TERNARY_OP(v, w, z, NB_SLOT(nb_power), "**=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001247}
1248
1249
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001250/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001251
1252PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001253PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001254{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001255 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001257 }
1258
Victor Stinnera6192632021-01-29 16:53:03 +01001259 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1260 if (m && m->nb_negative) {
1261 PyObject *res = (*m->nb_negative)(o);
1262 assert(_Py_CheckSlotResult(o, "__neg__", res != NULL));
1263 return res;
1264 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001267}
1268
1269PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001270PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001271{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001272 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001274 }
1275
Victor Stinnera6192632021-01-29 16:53:03 +01001276 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1277 if (m && m->nb_positive) {
1278 PyObject *res = (*m->nb_positive)(o);
1279 assert(_Py_CheckSlotResult(o, "__pos__", res != NULL));
1280 return res;
1281 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001284}
1285
1286PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001287PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001288{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001289 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001291 }
1292
Victor Stinnera6192632021-01-29 16:53:03 +01001293 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1294 if (m && m->nb_invert) {
1295 PyObject *res = (*m->nb_invert)(o);
1296 assert(_Py_CheckSlotResult(o, "__invert__", res != NULL));
1297 return res;
1298 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001301}
1302
1303PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001304PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001305{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001306 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001308 }
1309
Victor Stinnera6192632021-01-29 16:53:03 +01001310 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
1311 if (m && m->nb_absolute) {
1312 PyObject *res = m->nb_absolute(o);
1313 assert(_Py_CheckSlotResult(o, "__abs__", res != NULL));
1314 return res;
1315 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001318}
1319
Victor Stinnera15e2602020-04-08 02:01:56 +02001320
Christian Tismerea62ce72018-06-09 20:32:25 +02001321int
1322PyIndex_Check(PyObject *obj)
1323{
Victor Stinnera15e2602020-04-08 02:01:56 +02001324 return _PyIndex_Check(obj);
Christian Tismerea62ce72018-06-09 20:32:25 +02001325}
1326
Victor Stinnera15e2602020-04-08 02:01:56 +02001327
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001328/* Return a Python int from the object item.
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001329 Can return an instance of int subclass.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001330 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001331 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001332*/
1333PyObject *
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001334_PyNumber_Index(PyObject *item)
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001335{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001336 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001338 }
1339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 if (PyLong_Check(item)) {
1341 Py_INCREF(item);
1342 return item;
1343 }
Victor Stinnera15e2602020-04-08 02:01:56 +02001344 if (!_PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 PyErr_Format(PyExc_TypeError,
1346 "'%.200s' object cannot be interpreted "
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001347 "as an integer", Py_TYPE(item)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001348 return NULL;
1349 }
Victor Stinnera6192632021-01-29 16:53:03 +01001350
1351 PyObject *result = Py_TYPE(item)->tp_as_number->nb_index(item);
1352 assert(_Py_CheckSlotResult(item, "__index__", result != NULL));
1353 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001354 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001355 }
1356
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001357 if (!PyLong_Check(result)) {
1358 PyErr_Format(PyExc_TypeError,
1359 "__index__ returned non-int (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001360 Py_TYPE(result)->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001361 Py_DECREF(result);
1362 return NULL;
1363 }
1364 /* Issue #17576: warn if 'result' not of exact type int. */
1365 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1366 "__index__ returned non-int (type %.200s). "
1367 "The ability to return an instance of a strict subclass of int "
1368 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001369 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001370 Py_DECREF(result);
1371 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 }
1373 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001374}
1375
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001376/* Return an exact Python int from the object item.
1377 Raise TypeError if the result is not an int
1378 or if the object cannot be interpreted as an index.
1379*/
1380PyObject *
1381PyNumber_Index(PyObject *item)
1382{
1383 PyObject *result = _PyNumber_Index(item);
1384 if (result != NULL && !PyLong_CheckExact(result)) {
1385 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1386 }
1387 return result;
1388}
1389
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001390/* Return an error on Overflow only if err is not NULL*/
1391
1392Py_ssize_t
1393PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 Py_ssize_t result;
1396 PyObject *runerr;
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001397 PyObject *value = _PyNumber_Index(item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (value == NULL)
1399 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 /* We're done if PyLong_AsSsize_t() returns without error. */
1402 result = PyLong_AsSsize_t(value);
Victor Stinner61b64922020-06-23 15:55:06 +02001403 if (result != -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001405
Victor Stinner61b64922020-06-23 15:55:06 +02001406 PyThreadState *tstate = _PyThreadState_GET();
1407 runerr = _PyErr_Occurred(tstate);
1408 if (!runerr) {
1409 goto finish;
1410 }
1411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 /* Error handling code -- only manage OverflowError differently */
Victor Stinner61b64922020-06-23 15:55:06 +02001413 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 goto finish;
Victor Stinner61b64922020-06-23 15:55:06 +02001415 }
1416 _PyErr_Clear(tstate);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 /* If no error-handling desired then the default clipping
Victor Stinner61b64922020-06-23 15:55:06 +02001419 is sufficient. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 if (!err) {
1421 assert(PyLong_Check(value));
1422 /* Whether or not it is less than or equal to
1423 zero is determined by the sign of ob_size
1424 */
1425 if (_PyLong_Sign(value) < 0)
1426 result = PY_SSIZE_T_MIN;
1427 else
1428 result = PY_SSIZE_T_MAX;
1429 }
1430 else {
1431 /* Otherwise replace the error with caller's error object. */
Victor Stinner61b64922020-06-23 15:55:06 +02001432 _PyErr_Format(tstate, err,
1433 "cannot fit '%.200s' into an index-sized integer",
1434 Py_TYPE(item)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001436
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001437 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 Py_DECREF(value);
1439 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001440}
1441
1442
Guido van Rossume15dee51995-07-18 14:12:02 +00001443PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001444PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001445{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001446 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001447 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001449 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001450 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001451
Victor Stinner71aea8e2016-08-19 16:59:55 +02001452 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001454 }
1455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 if (PyLong_CheckExact(o)) {
1457 Py_INCREF(o);
1458 return o;
1459 }
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001460 m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001462 /* Convert using the nb_int slot, which should return something
1463 of exact type int. */
1464 result = m->nb_int(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001465 assert(_Py_CheckSlotResult(o, "__int__", result != NULL));
1466 if (!result || PyLong_CheckExact(result)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001467 return result;
Victor Stinnera6192632021-01-29 16:53:03 +01001468 }
1469
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001470 if (!PyLong_Check(result)) {
1471 PyErr_Format(PyExc_TypeError,
Victor Stinner61b64922020-06-23 15:55:06 +02001472 "__int__ returned non-int (type %.200s)",
Victor Stinner8182cc22020-07-10 12:40:38 +02001473 Py_TYPE(result)->tp_name);
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001474 Py_DECREF(result);
1475 return NULL;
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001476 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001477 /* Issue #17576: warn if 'result' not of exact type int. */
1478 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1479 "__int__ returned non-int (type %.200s). "
1480 "The ability to return an instance of a strict subclass of int "
1481 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner8182cc22020-07-10 12:40:38 +02001482 Py_TYPE(result)->tp_name)) {
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001483 Py_DECREF(result);
1484 return NULL;
1485 }
1486 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001487 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 }
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001489 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001490 return PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001491 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001492 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001494 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001496 if (result == NULL || PyLong_CheckExact(result)) {
1497 return result;
1498 }
1499 if (PyLong_Check(result)) {
1500 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1501 return result;
1502 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001504 but int() needs to return an int. */
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001505 if (!PyIndex_Check(result)) {
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001506 PyErr_Format(
1507 PyExc_TypeError,
1508 "__trunc__ returned non-Integral (type %.200s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001509 Py_TYPE(result)->tp_name);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001510 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001511 return NULL;
1512 }
Serhiy Storchaka578c3952020-05-26 18:43:38 +03001513 Py_SETREF(result, PyNumber_Index(result));
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001514 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001516 if (PyErr_Occurred())
1517 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001518
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001519 if (PyUnicode_Check(o))
Inada Naokie4f1fe62020-06-29 13:00:43 +09001520 /* The below check is done in PyLong_FromUnicodeObject(). */
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001521 return PyLong_FromUnicodeObject(o, 10);
1522
Martin Pantereeb896c2015-11-07 02:32:21 +00001523 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001525 * doesn't do. In particular int('9\x005') must raise an
1526 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001528 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1529 PyBytes_GET_SIZE(o), 10);
1530
1531 if (PyByteArray_Check(o))
1532 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1533 PyByteArray_GET_SIZE(o), 10);
1534
1535 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001536 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001537
1538 /* Copy to NUL-terminated buffer. */
1539 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1540 if (bytes == NULL) {
1541 PyBuffer_Release(&view);
1542 return NULL;
1543 }
1544 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1545 PyBytes_GET_SIZE(bytes), 10);
1546 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001547 PyBuffer_Release(&view);
1548 return result;
1549 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001550
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001551 return type_error("int() argument must be a string, a bytes-like object "
Serhiy Storchakae2ec0b22020-10-09 14:14:37 +03001552 "or a real number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001553}
1554
1555PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001556PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001557{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001558 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001560 }
1561
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001562 if (PyFloat_CheckExact(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001563 return Py_NewRef(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001564 }
Victor Stinnera6192632021-01-29 16:53:03 +01001565
1566 PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 if (m && m->nb_float) { /* This should include subclasses of float */
1568 PyObject *res = m->nb_float(o);
Victor Stinnera6192632021-01-29 16:53:03 +01001569 assert(_Py_CheckSlotResult(o, "__float__", res != NULL));
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001570 if (!res || PyFloat_CheckExact(res)) {
1571 return res;
1572 }
Victor Stinnera6192632021-01-29 16:53:03 +01001573
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001574 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001576 "%.50s.__float__ returned non-float (type %.50s)",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001577 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 Py_DECREF(res);
1579 return NULL;
1580 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001581 /* Issue #26983: warn if 'res' not of exact type float. */
1582 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1583 "%.50s.__float__ returned non-float (type %.50s). "
1584 "The ability to return an instance of a strict subclass of float "
1585 "is deprecated, and may be removed in a future version of Python.",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001586 Py_TYPE(o)->tp_name, Py_TYPE(res)->tp_name)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001587 Py_DECREF(res);
1588 return NULL;
1589 }
Victor Stinnera6192632021-01-29 16:53:03 +01001590 double val = PyFloat_AS_DOUBLE(res);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001591 Py_DECREF(res);
1592 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 }
Victor Stinnera6192632021-01-29 16:53:03 +01001594
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001595 if (m && m->nb_index) {
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001596 PyObject *res = _PyNumber_Index(o);
Serhiy Storchakabdbad712019-06-02 00:05:48 +03001597 if (!res) {
1598 return NULL;
1599 }
1600 double val = PyLong_AsDouble(res);
1601 Py_DECREF(res);
1602 if (val == -1.0 && PyErr_Occurred()) {
1603 return NULL;
1604 }
1605 return PyFloat_FromDouble(val);
1606 }
Victor Stinnera6192632021-01-29 16:53:03 +01001607
1608 /* A float subclass with nb_float == NULL */
1609 if (PyFloat_Check(o)) {
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001610 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 }
1612 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001613}
1614
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001615
1616PyObject *
1617PyNumber_ToBase(PyObject *n, int base)
1618{
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001619 if (!(base == 2 || base == 8 || base == 10 || base == 16)) {
1620 PyErr_SetString(PyExc_SystemError,
1621 "PyNumber_ToBase: base must be 2, 8, 10 or 16");
1622 return NULL;
1623 }
Serhiy Storchaka5f4b229d2020-05-28 10:33:45 +03001624 PyObject *index = _PyNumber_Index(n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 if (!index)
1626 return NULL;
Serhiy Storchakae5ccc942020-03-09 20:03:38 +02001627 PyObject *res = _PyLong_Format(index, base);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 Py_DECREF(index);
1629 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001630}
1631
1632
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001633/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001634
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001635int
Fred Drake79912472000-07-09 04:06:11 +00001636PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001637{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 if (PyDict_Check(s))
1639 return 0;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001640 return Py_TYPE(s)->tp_as_sequence &&
1641 Py_TYPE(s)->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001642}
1643
Martin v. Löwis18e16552006-02-15 17:27:45 +00001644Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001645PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001646{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 if (s == NULL) {
1648 null_error();
1649 return -1;
1650 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001651
Victor Stinnera6192632021-01-29 16:53:03 +01001652 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001653 if (m && m->sq_length) {
1654 Py_ssize_t len = m->sq_length(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001655 assert(_Py_CheckSlotResult(s, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001656 return len;
1657 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001658
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001659 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001660 type_error("%.200s is not a sequence", s);
1661 return -1;
1662 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 type_error("object of type '%.200s' has no len()", s);
1664 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001665}
1666
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001667#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001668Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001669PySequence_Length(PyObject *s)
1670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001672}
1673#define PySequence_Length PySequence_Size
1674
Guido van Rossume15dee51995-07-18 14:12:02 +00001675PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001676PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001677{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001678 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001680 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001681
Victor Stinnera6192632021-01-29 16:53:03 +01001682 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1683 if (m && m->sq_concat) {
1684 PyObject *res = m->sq_concat(s, o);
1685 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1686 return res;
1687 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 /* Instances of user classes defining an __add__() method only
1690 have an nb_add slot, not an sq_concat slot. So we fall back
1691 to nb_add if both arguments appear to be sequences. */
1692 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001693 PyObject *result = BINARY_OP1(s, o, NB_SLOT(nb_add), "+");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 if (result != Py_NotImplemented)
1695 return result;
1696 Py_DECREF(result);
1697 }
1698 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001699}
1700
1701PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001702PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001703{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001704 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001706 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001707
Victor Stinnera6192632021-01-29 16:53:03 +01001708 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1709 if (m && m->sq_repeat) {
1710 PyObject *res = m->sq_repeat(o, count);
1711 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1712 return res;
1713 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 /* Instances of user classes defining a __mul__() method only
1716 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1717 to nb_multiply if o appears to be a sequence. */
1718 if (PySequence_Check(o)) {
1719 PyObject *n, *result;
1720 n = PyLong_FromSsize_t(count);
1721 if (n == NULL)
1722 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001723 result = BINARY_OP1(o, n, NB_SLOT(nb_multiply), "*");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 Py_DECREF(n);
1725 if (result != Py_NotImplemented)
1726 return result;
1727 Py_DECREF(result);
1728 }
1729 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001730}
1731
1732PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001733PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1734{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001735 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001737 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001738
Victor Stinnera6192632021-01-29 16:53:03 +01001739 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
1740 if (m && m->sq_inplace_concat) {
1741 PyObject *res = m->sq_inplace_concat(s, o);
1742 assert(_Py_CheckSlotResult(s, "+=", res != NULL));
1743 return res;
1744 }
1745 if (m && m->sq_concat) {
1746 PyObject *res = m->sq_concat(s, o);
1747 assert(_Py_CheckSlotResult(s, "+", res != NULL));
1748 return res;
1749 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 if (PySequence_Check(s) && PySequence_Check(o)) {
Victor Stinnera6192632021-01-29 16:53:03 +01001752 PyObject *result = BINARY_IOP1(s, o, NB_SLOT(nb_inplace_add),
1753 NB_SLOT(nb_add), "+=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 if (result != Py_NotImplemented)
1755 return result;
1756 Py_DECREF(result);
1757 }
1758 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001759}
1760
1761PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001762PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001763{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001764 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001766 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001767
Victor Stinnera6192632021-01-29 16:53:03 +01001768 PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
1769 if (m && m->sq_inplace_repeat) {
1770 PyObject *res = m->sq_inplace_repeat(o, count);
1771 assert(_Py_CheckSlotResult(o, "*=", res != NULL));
1772 return res;
1773 }
1774 if (m && m->sq_repeat) {
1775 PyObject *res = m->sq_repeat(o, count);
1776 assert(_Py_CheckSlotResult(o, "*", res != NULL));
1777 return res;
1778 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 if (PySequence_Check(o)) {
1781 PyObject *n, *result;
1782 n = PyLong_FromSsize_t(count);
1783 if (n == NULL)
1784 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001785 result = BINARY_IOP1(o, n, NB_SLOT(nb_inplace_multiply),
1786 NB_SLOT(nb_multiply), "*=");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 Py_DECREF(n);
1788 if (result != Py_NotImplemented)
1789 return result;
1790 Py_DECREF(result);
1791 }
1792 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001793}
1794
1795PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001796PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001797{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001798 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001800 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001801
Victor Stinnera6192632021-01-29 16:53:03 +01001802 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 if (m && m->sq_item) {
1804 if (i < 0) {
1805 if (m->sq_length) {
1806 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001807 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Victor Stinnere20310f2015-11-05 13:56:58 +01001808 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001810 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 i += l;
1812 }
1813 }
Victor Stinnera6192632021-01-29 16:53:03 +01001814 PyObject *res = m->sq_item(s, i);
1815 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
1816 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001818
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001819 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001820 return type_error("%.200s is not a sequence", s);
1821 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001823}
1824
1825PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001827{
Victor Stinner71aea8e2016-08-19 16:59:55 +02001828 if (!s) {
1829 return null_error();
1830 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001831
Victor Stinnera6192632021-01-29 16:53:03 +01001832 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001833 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01001835 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 return NULL;
Victor Stinnera6192632021-01-29 16:53:03 +01001837 }
1838 PyObject *res = mp->mp_subscript(s, slice);
1839 assert(_Py_CheckSlotResult(s, "__getitem__", res != NULL));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 Py_DECREF(slice);
1841 return res;
1842 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001845}
1846
1847int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001848PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 if (s == NULL) {
1851 null_error();
1852 return -1;
1853 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001854
Victor Stinnera6192632021-01-29 16:53:03 +01001855 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (m && m->sq_ass_item) {
1857 if (i < 0) {
1858 if (m->sq_length) {
1859 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001860 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001861 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001863 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 i += l;
1865 }
1866 }
Victor Stinnera6192632021-01-29 16:53:03 +01001867 int res = m->sq_ass_item(s, i, o);
1868 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
1869 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001871
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001872 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001873 type_error("%.200s is not a sequence", s);
1874 return -1;
1875 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 type_error("'%.200s' object does not support item assignment", s);
1877 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001878}
1879
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001880int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001881PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 if (s == NULL) {
1884 null_error();
1885 return -1;
1886 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001887
Victor Stinnera6192632021-01-29 16:53:03 +01001888 PySequenceMethods *m = Py_TYPE(s)->tp_as_sequence;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889 if (m && m->sq_ass_item) {
1890 if (i < 0) {
1891 if (m->sq_length) {
1892 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01001893 assert(_Py_CheckSlotResult(s, "__len__", l >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001894 if (l < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001896 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 i += l;
1898 }
1899 }
Victor Stinnera6192632021-01-29 16:53:03 +01001900 int res = m->sq_ass_item(s, i, (PyObject *)NULL);
1901 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
1902 return res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001904
Victor Stinner0d76d2b2020-02-07 01:53:23 +01001905 if (Py_TYPE(s)->tp_as_mapping && Py_TYPE(s)->tp_as_mapping->mp_ass_subscript) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03001906 type_error("%.200s is not a sequence", s);
1907 return -1;
1908 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 type_error("'%.200s' object doesn't support item deletion", s);
1910 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001911}
1912
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001913int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001914PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 if (s == NULL) {
1917 null_error();
1918 return -1;
1919 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001920
Victor Stinnera6192632021-01-29 16:53:03 +01001921 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001922 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 PyObject *slice = _PySlice_FromIndices(i1, i2);
1924 if (!slice)
1925 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01001926 int res = mp->mp_ass_subscript(s, slice, o);
1927 assert(_Py_CheckSlotResult(s, "__setitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 Py_DECREF(slice);
1929 return res;
1930 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001932 type_error("'%.200s' object doesn't support slice assignment", s);
1933 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001934}
1935
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001936int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001937PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 if (s == NULL) {
1940 null_error();
1941 return -1;
1942 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001943
Victor Stinnera6192632021-01-29 16:53:03 +01001944 PyMappingMethods *mp = Py_TYPE(s)->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001945 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 PyObject *slice = _PySlice_FromIndices(i1, i2);
Victor Stinnera6192632021-01-29 16:53:03 +01001947 if (!slice) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return -1;
Victor Stinnera6192632021-01-29 16:53:03 +01001949 }
1950 int res = mp->mp_ass_subscript(s, slice, NULL);
1951 assert(_Py_CheckSlotResult(s, "__delitem__", res >= 0));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 Py_DECREF(slice);
1953 return res;
1954 }
1955 type_error("'%.200s' object doesn't support slice deletion", s);
1956 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001957}
1958
Guido van Rossume15dee51995-07-18 14:12:02 +00001959PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001960PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001962 PyObject *it; /* iter(v) */
1963 Py_ssize_t n; /* guess for result tuple size */
1964 PyObject *result = NULL;
1965 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001966
Victor Stinner71aea8e2016-08-19 16:59:55 +02001967 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001969 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001971 /* Special-case the common tuple and list cases, for efficiency. */
1972 if (PyTuple_CheckExact(v)) {
1973 /* Note that we can't know whether it's safe to return
1974 a tuple *subclass* instance as-is, hence the restriction
1975 to exact tuples here. In contrast, lists always make
1976 a copy, so there's no need for exactness below. */
1977 Py_INCREF(v);
1978 return v;
1979 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001980 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 /* Get iterator. */
1984 it = PyObject_GetIter(v);
1985 if (it == NULL)
1986 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001989 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 if (n == -1)
1991 goto Fail;
1992 result = PyTuple_New(n);
1993 if (result == NULL)
1994 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 /* Fill the tuple. */
1997 for (j = 0; ; ++j) {
1998 PyObject *item = PyIter_Next(it);
1999 if (item == NULL) {
2000 if (PyErr_Occurred())
2001 goto Fail;
2002 break;
2003 }
2004 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00002005 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 /* The over-allocation strategy can grow a bit faster
2007 than for lists because unlike lists the
2008 over-allocation isn't permanent -- we reclaim
2009 the excess before the end of this routine.
2010 So, grow by ten and then add 25%.
2011 */
Martin Pantere8db8612016-07-25 02:30:05 +00002012 newn += 10u;
2013 newn += newn >> 2;
2014 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002015 /* Check for overflow */
2016 PyErr_NoMemory();
2017 Py_DECREF(item);
2018 goto Fail;
2019 }
Martin Pantere8db8612016-07-25 02:30:05 +00002020 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (_PyTuple_Resize(&result, n) != 0) {
2022 Py_DECREF(item);
2023 goto Fail;
2024 }
2025 }
2026 PyTuple_SET_ITEM(result, j, item);
2027 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 /* Cut tuple back if guess was too large. */
2030 if (j < n &&
2031 _PyTuple_Resize(&result, j) != 0)
2032 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 Py_DECREF(it);
2035 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00002036
2037Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 Py_XDECREF(result);
2039 Py_DECREF(it);
2040 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002041}
2042
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002043PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002044PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 PyObject *result; /* result list */
2047 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00002048
Victor Stinner71aea8e2016-08-19 16:59:55 +02002049 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002051 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 result = PyList_New(0);
2054 if (result == NULL)
2055 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00002056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 rv = _PyList_Extend((PyListObject *)result, v);
2058 if (rv == NULL) {
2059 Py_DECREF(result);
2060 return NULL;
2061 }
2062 Py_DECREF(rv);
2063 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00002064}
2065
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002066PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002067PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002070
Victor Stinner71aea8e2016-08-19 16:59:55 +02002071 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002073 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
2076 Py_INCREF(v);
2077 return v;
2078 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 it = PyObject_GetIter(v);
2081 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002082 PyThreadState *tstate = _PyThreadState_GET();
2083 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2084 _PyErr_SetString(tstate, PyExc_TypeError, m);
2085 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 return NULL;
2087 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 v = PySequence_List(it);
2090 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00002093}
2094
Tim Peters16a77ad2001-09-08 04:00:12 +00002095/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
2097 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
2098 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00002099 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
2100*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002101Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002102_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00002103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 Py_ssize_t n;
2105 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
2106 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 if (seq == NULL || obj == NULL) {
2109 null_error();
2110 return -1;
2111 }
Tim Peters75f8e352001-05-05 11:33:43 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 it = PyObject_GetIter(seq);
2114 if (it == NULL) {
Serhiy Storchakacafe1b62020-06-22 10:43:35 +03002115 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
2116 type_error("argument of type '%.200s' is not iterable", seq);
2117 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 return -1;
2119 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002121 n = wrapped = 0;
2122 for (;;) {
2123 int cmp;
2124 PyObject *item = PyIter_Next(it);
2125 if (item == NULL) {
2126 if (PyErr_Occurred())
2127 goto Fail;
2128 break;
2129 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002130
Serhiy Storchaka18b711c2019-08-04 14:12:48 +03002131 cmp = PyObject_RichCompareBool(item, obj, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 Py_DECREF(item);
2133 if (cmp < 0)
2134 goto Fail;
2135 if (cmp > 0) {
2136 switch (operation) {
2137 case PY_ITERSEARCH_COUNT:
2138 if (n == PY_SSIZE_T_MAX) {
2139 PyErr_SetString(PyExc_OverflowError,
2140 "count exceeds C integer size");
2141 goto Fail;
2142 }
2143 ++n;
2144 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 case PY_ITERSEARCH_INDEX:
2147 if (wrapped) {
2148 PyErr_SetString(PyExc_OverflowError,
2149 "index exceeds C integer size");
2150 goto Fail;
2151 }
2152 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 case PY_ITERSEARCH_CONTAINS:
2155 n = 1;
2156 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 default:
Barry Warsawb2e57942017-09-14 18:13:16 -07002159 Py_UNREACHABLE();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 }
2161 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 if (operation == PY_ITERSEARCH_INDEX) {
2164 if (n == PY_SSIZE_T_MAX)
2165 wrapped = 1;
2166 ++n;
2167 }
2168 }
Tim Peters16a77ad2001-09-08 04:00:12 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 if (operation != PY_ITERSEARCH_INDEX)
2171 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 PyErr_SetString(PyExc_ValueError,
2174 "sequence.index(x): x not in sequence");
2175 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00002176Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 n = -1;
2178 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00002179Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 Py_DECREF(it);
2181 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00002182
Guido van Rossume15dee51995-07-18 14:12:02 +00002183}
2184
Tim Peters16a77ad2001-09-08 04:00:12 +00002185/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002186Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00002187PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002190}
2191
Tim Peterscb8d3682001-05-05 21:05:01 +00002192/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002193 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002194 */
2195int
2196PySequence_Contains(PyObject *seq, PyObject *ob)
2197{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002198 PySequenceMethods *sqm = Py_TYPE(seq)->tp_as_sequence;
Victor Stinnera6192632021-01-29 16:53:03 +01002199 if (sqm != NULL && sqm->sq_contains != NULL) {
2200 int res = (*sqm->sq_contains)(seq, ob);
2201 assert(_Py_CheckSlotResult(seq, "__contains__", res >= 0));
2202 return res;
2203 }
2204 Py_ssize_t result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002205 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002206}
2207
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002208/* Backwards compatibility */
2209#undef PySequence_In
2210int
Fred Drake79912472000-07-09 04:06:11 +00002211PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002214}
2215
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002216Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002217PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002220}
2221
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002222/* Operations on mappings */
2223
2224int
Fred Drake79912472000-07-09 04:06:11 +00002225PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002226{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002227 return o && Py_TYPE(o)->tp_as_mapping &&
2228 Py_TYPE(o)->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002229}
2230
Martin v. Löwis18e16552006-02-15 17:27:45 +00002231Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002232PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 if (o == NULL) {
2235 null_error();
2236 return -1;
2237 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002238
Victor Stinnera6192632021-01-29 16:53:03 +01002239 PyMappingMethods *m = Py_TYPE(o)->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002240 if (m && m->mp_length) {
2241 Py_ssize_t len = m->mp_length(o);
Victor Stinnerc9b8e9c2021-01-27 17:39:16 +01002242 assert(_Py_CheckSlotResult(o, "__len__", len >= 0));
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002243 return len;
2244 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002245
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002246 if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) {
Serhiy Storchakaa6fdddb2018-07-23 23:43:42 +03002247 type_error("%.200s is not a mapping", o);
2248 return -1;
2249 }
2250 /* PyMapping_Size() can be called from PyObject_Size(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 type_error("object of type '%.200s' has no len()", o);
2252 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002253}
2254
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002255#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002256Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002257PyMapping_Length(PyObject *o)
2258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002260}
2261#define PyMapping_Length PyMapping_Size
2262
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002263PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002264PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002267
Victor Stinner71aea8e2016-08-19 16:59:55 +02002268 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002270 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 okey = PyUnicode_FromString(key);
2273 if (okey == NULL)
2274 return NULL;
2275 r = PyObject_GetItem(o, okey);
2276 Py_DECREF(okey);
2277 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002278}
2279
2280int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002281PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 PyObject *okey;
2284 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 if (key == NULL) {
2287 null_error();
2288 return -1;
2289 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 okey = PyUnicode_FromString(key);
2292 if (okey == NULL)
2293 return -1;
2294 r = PyObject_SetItem(o, okey, value);
2295 Py_DECREF(okey);
2296 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002297}
2298
2299int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002300PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002304 v = PyMapping_GetItemString(o, key);
2305 if (v) {
2306 Py_DECREF(v);
2307 return 1;
2308 }
2309 PyErr_Clear();
2310 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002311}
2312
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002313int
Fred Drake79912472000-07-09 04:06:11 +00002314PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002315{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 v = PyObject_GetItem(o, key);
2319 if (v) {
2320 Py_DECREF(v);
2321 return 1;
2322 }
2323 PyErr_Clear();
2324 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002325}
2326
Oren Milman0ccc0f62017-10-08 11:17:46 +03002327/* This function is quite similar to PySequence_Fast(), but specialized to be
2328 a helper for PyMapping_Keys(), PyMapping_Items() and PyMapping_Values().
2329 */
2330static PyObject *
2331method_output_as_list(PyObject *o, _Py_Identifier *meth_id)
2332{
2333 PyObject *it, *result, *meth_output;
2334
2335 assert(o != NULL);
Jeroen Demeyer762f93f2019-07-08 10:19:25 +02002336 meth_output = _PyObject_CallMethodIdNoArgs(o, meth_id);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002337 if (meth_output == NULL || PyList_CheckExact(meth_output)) {
2338 return meth_output;
2339 }
2340 it = PyObject_GetIter(meth_output);
2341 if (it == NULL) {
Victor Stinner61b64922020-06-23 15:55:06 +02002342 PyThreadState *tstate = _PyThreadState_GET();
2343 if (_PyErr_ExceptionMatches(tstate, PyExc_TypeError)) {
2344 _PyErr_Format(tstate, PyExc_TypeError,
2345 "%.200s.%U() returned a non-iterable (type %.200s)",
2346 Py_TYPE(o)->tp_name,
2347 _PyUnicode_FromId(meth_id),
2348 Py_TYPE(meth_output)->tp_name);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002349 }
2350 Py_DECREF(meth_output);
2351 return NULL;
2352 }
2353 Py_DECREF(meth_output);
2354 result = PySequence_List(it);
2355 Py_DECREF(it);
2356 return result;
2357}
2358
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002359PyObject *
2360PyMapping_Keys(PyObject *o)
2361{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002362 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002363
Oren Milman0ccc0f62017-10-08 11:17:46 +03002364 if (o == NULL) {
2365 return null_error();
2366 }
2367 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 return PyDict_Keys(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002369 }
2370 return method_output_as_list(o, &PyId_keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002371}
2372
2373PyObject *
2374PyMapping_Items(PyObject *o)
2375{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002376 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002377
Oren Milman0ccc0f62017-10-08 11:17:46 +03002378 if (o == NULL) {
2379 return null_error();
2380 }
2381 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 return PyDict_Items(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002383 }
2384 return method_output_as_list(o, &PyId_items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002385}
2386
2387PyObject *
2388PyMapping_Values(PyObject *o)
2389{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002390 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002391
Oren Milman0ccc0f62017-10-08 11:17:46 +03002392 if (o == NULL) {
2393 return null_error();
2394 }
2395 if (PyDict_CheckExact(o)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 return PyDict_Values(o);
Oren Milman0ccc0f62017-10-08 11:17:46 +03002397 }
2398 return method_output_as_list(o, &PyId_values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002399}
2400
Guido van Rossum823649d2001-03-21 18:40:58 +00002401/* isinstance(), issubclass() */
2402
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002403/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002404 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002405 * 1. getattr(cls, '__bases__') could raise an AttributeError
2406 * 2. getattr(cls, '__bases__') could raise some other exception
2407 * 3. getattr(cls, '__bases__') could return a tuple
2408 * 4. getattr(cls, '__bases__') could return something other than a tuple
2409 *
2410 * Only state #3 is a non-error state and only it returns a non-NULL object
2411 * (it returns the retrieved tuple).
2412 *
2413 * Any raised AttributeErrors are masked by clearing the exception and
2414 * returning NULL. If an object other than a tuple comes out of __bases__,
2415 * then again, the return value is NULL. So yes, these two situations
2416 * produce exactly the same results: NULL is returned and no error is set.
2417 *
2418 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002420 * exception to be propagated along.
2421 *
2422 * Callers are expected to test for PyErr_Occurred() when the return value
2423 * is NULL to decide whether a valid exception should be propagated or not.
2424 * When there's no exception to propagate, it's customary for the caller to
2425 * set a TypeError.
2426 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002427static PyObject *
2428abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002429{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002430 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002432
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002433 (void)_PyObject_LookupAttrId(cls, &PyId___bases__, &bases);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002434 if (bases != NULL && !PyTuple_Check(bases)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 Py_DECREF(bases);
2436 return NULL;
2437 }
2438 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002439}
2440
2441
2442static int
2443abstract_issubclass(PyObject *derived, PyObject *cls)
2444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 PyObject *bases = NULL;
2446 Py_ssize_t i, n;
2447 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 while (1) {
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002450 if (derived == cls) {
2451 Py_XDECREF(bases); /* See below comment */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 return 1;
Yonatan Goldschmidt1c56f8f2020-02-22 15:11:48 +02002453 }
2454 /* Use XSETREF to drop bases reference *after* finishing with
2455 derived; bases might be the only reference to it.
2456 XSETREF is used instead of SETREF, because bases is NULL on the
2457 first iteration of the loop.
2458 */
2459 Py_XSETREF(bases, abstract_get_bases(derived));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 if (bases == NULL) {
2461 if (PyErr_Occurred())
2462 return -1;
2463 return 0;
2464 }
2465 n = PyTuple_GET_SIZE(bases);
2466 if (n == 0) {
2467 Py_DECREF(bases);
2468 return 0;
2469 }
2470 /* Avoid recursivity in the single inheritance case */
2471 if (n == 1) {
2472 derived = PyTuple_GET_ITEM(bases, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 continue;
2474 }
2475 for (i = 0; i < n; i++) {
2476 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2477 if (r != 0)
2478 break;
2479 }
2480 Py_DECREF(bases);
2481 return r;
2482 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002483}
2484
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002485static int
2486check_class(PyObject *cls, const char *error)
2487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 PyObject *bases = abstract_get_bases(cls);
2489 if (bases == NULL) {
2490 /* Do not mask errors. */
Victor Stinner61b64922020-06-23 15:55:06 +02002491 PyThreadState *tstate = _PyThreadState_GET();
2492 if (!_PyErr_Occurred(tstate)) {
2493 _PyErr_SetString(tstate, PyExc_TypeError, error);
2494 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002495 return 0;
2496 }
2497 Py_DECREF(bases);
2498 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002499}
2500
Brett Cannon4f653312004-03-20 22:52:14 +00002501static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002502object_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 PyObject *icls;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002505 int retval;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002506 _Py_IDENTIFIER(__class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (PyType_Check(cls)) {
2508 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2509 if (retval == 0) {
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002510 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2511 if (icls != NULL) {
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002512 if (icls != (PyObject *)(Py_TYPE(inst)) && PyType_Check(icls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 retval = PyType_IsSubtype(
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002514 (PyTypeObject *)icls,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 (PyTypeObject *)cls);
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002516 }
2517 else {
2518 retval = 0;
2519 }
2520 Py_DECREF(icls);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 }
2522 }
2523 }
2524 else {
2525 if (!check_class(cls,
Maggie Moss1b4552c2020-09-09 13:23:24 -07002526 "isinstance() arg 2 must be a type, a tuple of types or a union"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002527 return -1;
Serhiy Storchakaf320be72018-01-25 10:49:40 +02002528 retval = _PyObject_LookupAttrId(inst, &PyId___class__, &icls);
2529 if (icls != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 retval = abstract_issubclass(icls, cls);
2531 Py_DECREF(icls);
2532 }
2533 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002536}
2537
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002538static int
Victor Stinner850a4bd2020-02-04 13:42:13 +01002539object_recursive_isinstance(PyThreadState *tstate, PyObject *inst, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002540{
Benjamin Petersonce798522012-01-22 11:24:29 -05002541 _Py_IDENTIFIER(__instancecheck__);
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 /* Quick test for an exact match */
Andy Lesterdffe4c02020-03-04 07:15:20 -06002544 if (Py_IS_TYPE(inst, (PyTypeObject *)cls)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 return 1;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002546 }
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002547
Georg Brandl72b8a802014-10-03 09:26:37 +02002548 /* We know what type's __instancecheck__ does. */
2549 if (PyType_CheckExact(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002550 return object_isinstance(inst, cls);
Georg Brandl72b8a802014-10-03 09:26:37 +02002551 }
2552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002553 if (PyTuple_Check(cls)) {
Victor Stinner850a4bd2020-02-04 13:42:13 +01002554 /* Not a general sequence -- that opens up the road to
2555 recursion and stack overflow. */
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002556 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002558 }
2559 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2560 int r = 0;
2561 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002563 r = object_recursive_isinstance(tstate, inst, item);
2564 if (r != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002565 /* either found it, or got an error */
2566 break;
Victor Stinner850a4bd2020-02-04 13:42:13 +01002567 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002569 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 return r;
2571 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002572
Victor Stinner850a4bd2020-02-04 13:42:13 +01002573 PyObject *checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 if (checker != NULL) {
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002575 if (_Py_EnterRecursiveCall(tstate, " in __instancecheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002577 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002579
Petr Viktorinffd97532020-02-11 17:46:57 +01002580 PyObject *res = PyObject_CallOneArg(checker, inst);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002581 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 Py_DECREF(checker);
Victor Stinner850a4bd2020-02-04 13:42:13 +01002583
2584 if (res == NULL) {
2585 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002586 }
Victor Stinner850a4bd2020-02-04 13:42:13 +01002587 int ok = PyObject_IsTrue(res);
2588 Py_DECREF(res);
2589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 return ok;
2591 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002592 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002594 }
2595
Victor Stinner850a4bd2020-02-04 13:42:13 +01002596 /* cls has no __instancecheck__() method */
2597 return object_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002598}
2599
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002600
2601int
2602PyObject_IsInstance(PyObject *inst, PyObject *cls)
2603{
2604 PyThreadState *tstate = _PyThreadState_GET();
Victor Stinner850a4bd2020-02-04 13:42:13 +01002605 return object_recursive_isinstance(tstate, inst, cls);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002606}
2607
2608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002610recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 if (PyType_Check(cls) && PyType_Check(derived)) {
2613 /* Fast path (non-recursive) */
2614 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2615 }
2616 if (!check_class(derived,
2617 "issubclass() arg 1 must be a class"))
2618 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002619
2620 PyTypeObject *type = Py_TYPE(cls);
2621 int is_union = (PyType_Check(type) && type == &_Py_UnionType);
2622 if (!is_union && !check_class(cls,
2623 "issubclass() arg 2 must be a class,"
2624 " a tuple of classes, or a union.")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 return -1;
Maggie Moss1b4552c2020-09-09 13:23:24 -07002626 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002629}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002630
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002631static int
2632object_issubclass(PyThreadState *tstate, PyObject *derived, PyObject *cls)
Brett Cannon4f653312004-03-20 22:52:14 +00002633{
Benjamin Petersonce798522012-01-22 11:24:29 -05002634 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002636
Georg Brandl72b8a802014-10-03 09:26:37 +02002637 /* We know what type's __subclasscheck__ does. */
2638 if (PyType_CheckExact(cls)) {
2639 /* Quick test for an exact match */
2640 if (derived == cls)
2641 return 1;
2642 return recursive_issubclass(derived, cls);
2643 }
2644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 if (PyTuple_Check(cls)) {
Antoine Pitrouec569b72008-08-26 22:40:48 +00002646
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002647 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002649 }
2650 Py_ssize_t n = PyTuple_GET_SIZE(cls);
2651 int r = 0;
2652 for (Py_ssize_t i = 0; i < n; ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 PyObject *item = PyTuple_GET_ITEM(cls, i);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002654 r = object_issubclass(tstate, derived, item);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 if (r != 0)
2656 /* either found it, or got an error */
2657 break;
2658 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002659 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 return r;
2661 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002662
Benjamin Petersonce798522012-01-22 11:24:29 -05002663 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (checker != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 int ok = -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002666 if (_Py_EnterRecursiveCall(tstate, " in __subclasscheck__")) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 Py_DECREF(checker);
2668 return ok;
2669 }
Petr Viktorinffd97532020-02-11 17:46:57 +01002670 PyObject *res = PyObject_CallOneArg(checker, derived);
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002671 _Py_LeaveRecursiveCall(tstate);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 Py_DECREF(checker);
2673 if (res != NULL) {
2674 ok = PyObject_IsTrue(res);
2675 Py_DECREF(res);
2676 }
2677 return ok;
2678 }
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002679 else if (_PyErr_Occurred(tstate)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 return -1;
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002681 }
2682
Georg Brandl72b8a802014-10-03 09:26:37 +02002683 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002685}
2686
Victor Stinnerbe434dc2019-11-05 00:51:22 +01002687
2688int
2689PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2690{
2691 PyThreadState *tstate = _PyThreadState_GET();
2692 return object_issubclass(tstate, derived, cls);
2693}
2694
2695
Antoine Pitrouec569b72008-08-26 22:40:48 +00002696int
2697_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2698{
Victor Stinner850a4bd2020-02-04 13:42:13 +01002699 return object_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002700}
2701
2702int
2703_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002705 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002706}
2707
2708
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002709PyObject *
2710PyObject_GetIter(PyObject *o)
2711{
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002712 PyTypeObject *t = Py_TYPE(o);
Victor Stinner14e6d092016-12-09 17:08:59 +01002713 getiterfunc f;
2714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 f = t->tp_iter;
2716 if (f == NULL) {
2717 if (PySequence_Check(o))
2718 return PySeqIter_New(o);
2719 return type_error("'%.200s' object is not iterable", o);
2720 }
2721 else {
2722 PyObject *res = (*f)(o);
2723 if (res != NULL && !PyIter_Check(res)) {
2724 PyErr_Format(PyExc_TypeError,
2725 "iter() returned non-iterator "
2726 "of type '%.100s'",
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002727 Py_TYPE(res)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 Py_DECREF(res);
2729 res = NULL;
2730 }
2731 return res;
2732 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002733}
2734
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002735int
2736PyIter_Check(PyObject *obj)
Christian Tismerea62ce72018-06-09 20:32:25 +02002737{
Erlend Egeberg Aaslandcc540012021-02-16 16:05:58 +01002738 PyTypeObject *tp = Py_TYPE(obj);
2739 return (tp->tp_iternext != NULL &&
2740 tp->tp_iternext != &_PyObject_NextNotImplemented);
Christian Tismerea62ce72018-06-09 20:32:25 +02002741}
2742
Tim Petersf4848da2001-05-05 00:14:56 +00002743/* Return next item.
2744 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2745 * If the iteration terminates normally, return NULL and clear the
2746 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2747 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002748 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002749 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002750PyObject *
2751PyIter_Next(PyObject *iter)
2752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 PyObject *result;
Victor Stinner0d76d2b2020-02-07 01:53:23 +01002754 result = (*Py_TYPE(iter)->tp_iternext)(iter);
Victor Stinner61b64922020-06-23 15:55:06 +02002755 if (result == NULL) {
2756 PyThreadState *tstate = _PyThreadState_GET();
2757 if (_PyErr_Occurred(tstate)
2758 && _PyErr_ExceptionMatches(tstate, PyExc_StopIteration))
2759 {
2760 _PyErr_Clear(tstate);
2761 }
2762 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002764}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002765
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002766PySendResult
2767PyIter_Send(PyObject *iter, PyObject *arg, PyObject **result)
2768{
2769 _Py_IDENTIFIER(send);
2770 assert(arg != NULL);
2771 assert(result != NULL);
2772 if (PyType_HasFeature(Py_TYPE(iter), Py_TPFLAGS_HAVE_AM_SEND)) {
2773 assert (Py_TYPE(iter)->tp_as_async != NULL);
2774 assert (Py_TYPE(iter)->tp_as_async->am_send != NULL);
Victor Stinnera6192632021-01-29 16:53:03 +01002775 PySendResult res = Py_TYPE(iter)->tp_as_async->am_send(iter, arg, result);
2776 assert(_Py_CheckSlotResult(iter, "am_send", res != PYGEN_ERROR));
2777 return res;
Vladimir Matveev1e996c32020-11-10 12:09:55 -08002778 }
2779 if (arg == Py_None && PyIter_Check(iter)) {
2780 *result = Py_TYPE(iter)->tp_iternext(iter);
2781 }
2782 else {
2783 *result = _PyObject_CallMethodIdOneArg(iter, &PyId_send, arg);
2784 }
2785 if (*result != NULL) {
2786 return PYGEN_NEXT;
2787 }
2788 if (_PyGen_FetchStopIterationValue(result) == 0) {
2789 return PYGEN_RETURN;
2790 }
2791 return PYGEN_ERROR;
2792}
2793
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002794/*
2795 * Flatten a sequence of bytes() objects into a C array of
2796 * NULL terminated string pointers with a NULL char* terminating the array.
2797 * (ie: an argv or env list)
2798 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002799 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2800 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002801 */
2802char *const *
2803_PySequence_BytesToCharpArray(PyObject* self)
2804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 char **array;
2806 Py_ssize_t i, argc;
2807 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002808 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 argc = PySequence_Size(self);
2811 if (argc == -1)
2812 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002813
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002814 assert(argc >= 0);
2815
2816 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2817 PyErr_NoMemory();
2818 return NULL;
2819 }
2820
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002821 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 if (array == NULL) {
2823 PyErr_NoMemory();
2824 return NULL;
2825 }
2826 for (i = 0; i < argc; ++i) {
2827 char *data;
2828 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002829 if (item == NULL) {
2830 /* NULL terminate before freeing. */
2831 array[i] = NULL;
2832 goto fail;
2833 }
Serhiy Storchakad174d242017-06-23 19:39:27 +03002834 /* check for embedded null bytes */
2835 if (PyBytes_AsStringAndSize(item, &data, NULL) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 /* NULL terminate before freeing. */
2837 array[i] = NULL;
2838 goto fail;
2839 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002840 size = PyBytes_GET_SIZE(item) + 1;
2841 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 if (!array[i]) {
2843 PyErr_NoMemory();
2844 goto fail;
2845 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002846 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 Py_DECREF(item);
2848 }
2849 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002851 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002852
2853fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 Py_XDECREF(item);
2855 _Py_FreeCharPArray(array);
2856 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002857}
2858
2859
2860/* Free's a NULL terminated char** array of C strings. */
2861void
2862_Py_FreeCharPArray(char *const array[])
2863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 Py_ssize_t i;
2865 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002866 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002868 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002869}