blob: 0f1ee9dbbaf545c4523c3c137d71026b6823a004 [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"
Guido van Rossumfa0b6ab1998-05-22 15:23:36 +00004#include <ctype.h>
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00005#include "structmember.h" /* we need the offsetof() macro from there */
Tim Peters64b5ce32001-09-10 20:52:51 +00006#include "longintrepr.h"
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00007
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00008
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00009
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000010/* Shorthands to return certain errors */
Guido van Rossume15dee51995-07-18 14:12:02 +000011
12static PyObject *
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013type_error(const char *msg, PyObject *obj)
Guido van Rossume15dee51995-07-18 14:12:02 +000014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000015 PyErr_Format(PyExc_TypeError, msg, obj->ob_type->tp_name);
16 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000017}
18
Guido van Rossum052b7e11996-11-11 15:08:19 +000019static PyObject *
Fred Drake79912472000-07-09 04:06:11 +000020null_error(void)
Guido van Rossume15dee51995-07-18 14:12:02 +000021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 if (!PyErr_Occurred())
23 PyErr_SetString(PyExc_SystemError,
24 "null argument to internal routine");
25 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +000026}
27
Guido van Rossumcea1c8c1998-05-22 00:47:05 +000028/* Operations on any object */
29
Guido van Rossume15dee51995-07-18 14:12:02 +000030PyObject *
Fred Drake79912472000-07-09 04:06:11 +000031PyObject_Type(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +000034
Victor Stinner71aea8e2016-08-19 16:59:55 +020035 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +020037 }
38
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 v = (PyObject *)o->ob_type;
40 Py_INCREF(v);
41 return v;
Guido van Rossume15dee51995-07-18 14:12:02 +000042}
43
Martin v. Löwis18e16552006-02-15 17:27:45 +000044Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +000045PyObject_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +000046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +000048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000049 if (o == NULL) {
50 null_error();
51 return -1;
52 }
Guido van Rossume15dee51995-07-18 14:12:02 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 m = o->ob_type->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +030055 if (m && m->sq_length) {
56 Py_ssize_t len = m->sq_length(o);
57 assert(len >= 0 || PyErr_Occurred());
58 return len;
59 }
Guido van Rossume15dee51995-07-18 14:12:02 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000062}
63
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000064#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000065Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000066PyObject_Length(PyObject *o)
67{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000068 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000069}
70#define PyObject_Length PyObject_Size
71
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020072int
73_PyObject_HasLen(PyObject *o) {
74 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
75 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
76}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000077
Christian Heimes255f53b2007-12-08 15:33:56 +000078/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020079 or o.__length_hint__(). If those methods aren't found the defaultvalue is
80 returned. If one of the calls fails with an exception other than TypeError
81 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000082*/
83
84Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020085PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000086{
Christian Heimesb70e8a12012-10-06 17:16:39 +020087 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020088 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050089 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030090 if (_PyObject_HasLen(o)) {
91 res = PyObject_Length(o);
Serhiy Storchaka813f9432017-04-16 09:21:44 +030092 if (res < 0) {
93 assert(PyErr_Occurred());
Serhiy Storchakaf740d462013-10-24 23:19:51 +030094 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
95 return -1;
96 }
97 PyErr_Clear();
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020098 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +030099 else {
100 return res;
101 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 }
Christian Heimes6314d162012-10-06 17:13:29 +0200103 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200104 if (hint == NULL) {
105 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200107 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 return defaultvalue;
109 }
Victor Stinnerf17c3de2016-12-06 18:46:19 +0100110 result = _PyObject_CallNoArg(hint);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200111 Py_DECREF(hint);
112 if (result == NULL) {
113 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
114 PyErr_Clear();
115 return defaultvalue;
116 }
117 return -1;
118 }
119 else if (result == Py_NotImplemented) {
120 Py_DECREF(result);
121 return defaultvalue;
122 }
123 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200124 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200125 Py_TYPE(result)->tp_name);
126 Py_DECREF(result);
127 return -1;
128 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200129 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200130 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200131 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200132 return -1;
133 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200134 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200135 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
136 return -1;
137 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200138 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000139}
140
Guido van Rossume15dee51995-07-18 14:12:02 +0000141PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000142PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000144 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000145
Victor Stinner71aea8e2016-08-19 16:59:55 +0200146 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200148 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000150 m = o->ob_type->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100151 if (m && m->mp_subscript) {
152 PyObject *item = m->mp_subscript(o, key);
153 assert((item != NULL) ^ (PyErr_Occurred() != NULL));
154 return item;
155 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000157 if (o->ob_type->tp_as_sequence) {
158 if (PyIndex_Check(key)) {
159 Py_ssize_t key_value;
160 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
161 if (key_value == -1 && PyErr_Occurred())
162 return NULL;
163 return PySequence_GetItem(o, key_value);
164 }
165 else if (o->ob_type->tp_as_sequence->sq_item)
166 return type_error("sequence index must "
167 "be integer, not '%.200s'", key);
168 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000170 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000171}
172
173int
Fred Drake79912472000-07-09 04:06:11 +0000174PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 if (o == NULL || key == NULL || value == NULL) {
179 null_error();
180 return -1;
181 }
182 m = o->ob_type->tp_as_mapping;
183 if (m && m->mp_ass_subscript)
184 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 if (o->ob_type->tp_as_sequence) {
187 if (PyIndex_Check(key)) {
188 Py_ssize_t key_value;
189 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
190 if (key_value == -1 && PyErr_Occurred())
191 return -1;
192 return PySequence_SetItem(o, key_value, value);
193 }
194 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
195 type_error("sequence index must be "
196 "integer, not '%.200s'", key);
197 return -1;
198 }
199 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 type_error("'%.200s' object does not support item assignment", o);
202 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000203}
204
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000205int
Fred Drake79912472000-07-09 04:06:11 +0000206PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (o == NULL || key == NULL) {
211 null_error();
212 return -1;
213 }
214 m = o->ob_type->tp_as_mapping;
215 if (m && m->mp_ass_subscript)
216 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (o->ob_type->tp_as_sequence) {
219 if (PyIndex_Check(key)) {
220 Py_ssize_t key_value;
221 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
222 if (key_value == -1 && PyErr_Occurred())
223 return -1;
224 return PySequence_DelItem(o, key_value);
225 }
226 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
227 type_error("sequence index must be "
228 "integer, not '%.200s'", key);
229 return -1;
230 }
231 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 type_error("'%.200s' object does not support item deletion", o);
234 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000235}
236
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000237int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300238PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 PyObject *okey;
241 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 if (o == NULL || key == NULL) {
244 null_error();
245 return -1;
246 }
247 okey = PyUnicode_FromString(key);
248 if (okey == NULL)
249 return -1;
250 ret = PyObject_DelItem(o, okey);
251 Py_DECREF(okey);
252 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000253}
254
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000255/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000256 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000257 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000258int
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000259PyObject_CheckReadBuffer(PyObject *obj)
260{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
262 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 if (pb == NULL ||
265 pb->bf_getbuffer == NULL)
266 return 0;
267 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
268 PyErr_Clear();
269 return 0;
270 }
271 PyBuffer_Release(&view);
272 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000273}
274
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200275static int
276as_read_buffer(PyObject *obj, const void **buffer, Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
281 null_error();
282 return -1;
283 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200284 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 *buffer = view.buf;
288 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200289 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000291}
292
Serhiy Storchaka460bd0d2016-11-20 12:16:46 +0200293int
294PyObject_AsCharBuffer(PyObject *obj,
295 const char **buffer,
296 Py_ssize_t *buffer_len)
297{
298 return as_read_buffer(obj, (const void **)buffer, buffer_len);
299}
300
301int PyObject_AsReadBuffer(PyObject *obj,
302 const void **buffer,
303 Py_ssize_t *buffer_len)
304{
305 return as_read_buffer(obj, buffer, buffer_len);
306}
307
Guido van Rossum4c08d552000-03-10 22:55:18 +0000308int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 void **buffer,
310 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 PyBufferProcs *pb;
313 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
316 null_error();
317 return -1;
318 }
319 pb = obj->ob_type->tp_as_buffer;
320 if (pb == NULL ||
321 pb->bf_getbuffer == NULL ||
322 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
323 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400324 "expected a writable bytes-like object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return -1;
326 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 *buffer = view.buf;
329 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200330 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000332}
333
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000334/* Buffer C-API for Python 3.0 */
335
336int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000337PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000338{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200339 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
340
341 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400343 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 Py_TYPE(obj)->tp_name);
345 return -1;
346 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200347 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000348}
349
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000350static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100351_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000352{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 Py_ssize_t sd, dim;
354 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000355
Stefan Krah363af442015-02-01 14:53:54 +0100356 /* 1) len = product(shape) * itemsize
357 2) itemsize > 0
358 3) len = 0 <==> exists i: shape[i] = 0 */
359 if (view->len == 0) return 1;
360 if (view->strides == NULL) { /* C-contiguous by definition */
361 /* Trivially F-contiguous */
362 if (view->ndim <= 1) return 1;
363
364 /* ndim > 1 implies shape != NULL */
365 assert(view->shape != NULL);
366
367 /* Effectively 1-d */
368 sd = 0;
369 for (i=0; i<view->ndim; i++) {
370 if (view->shape[i] > 1) sd += 1;
371 }
372 return sd <= 1;
373 }
374
375 /* strides != NULL implies both of these */
376 assert(view->ndim > 0);
377 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000380 for (i=0; i<view->ndim; i++) {
381 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100382 if (dim > 1 && view->strides[i] != sd) {
383 return 0;
384 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 sd *= dim;
386 }
387 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000388}
389
390static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100391_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 Py_ssize_t sd, dim;
394 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000395
Stefan Krah363af442015-02-01 14:53:54 +0100396 /* 1) len = product(shape) * itemsize
397 2) itemsize > 0
398 3) len = 0 <==> exists i: shape[i] = 0 */
399 if (view->len == 0) return 1;
400 if (view->strides == NULL) return 1; /* C-contiguous by definition */
401
402 /* strides != NULL implies both of these */
403 assert(view->ndim > 0);
404 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 for (i=view->ndim-1; i>=0; i--) {
408 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100409 if (dim > 1 && view->strides[i] != sd) {
410 return 0;
411 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 sd *= dim;
413 }
414 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000415}
416
417int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100418PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000419{
420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000422
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100423 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100425 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100427 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 return (_IsCContiguous(view) || _IsFortranContiguous(view));
429 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000430}
431
432
Guido van Rossum98297ee2007-11-06 21:34:58 +0000433void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000434PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 char* pointer;
437 int i;
438 pointer = (char *)view->buf;
439 for (i = 0; i < view->ndim; i++) {
440 pointer += view->strides[i]*indices[i];
441 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
442 pointer = *((char**)pointer) + view->suboffsets[i];
443 }
444 }
445 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446}
447
448
Guido van Rossum98297ee2007-11-06 21:34:58 +0000449void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000450_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 +0000451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 for (k=0; k<nd; k++) {
455 if (index[k] < shape[k]-1) {
456 index[k]++;
457 break;
458 }
459 else {
460 index[k] = 0;
461 }
462 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000463}
464
Guido van Rossum98297ee2007-11-06 21:34:58 +0000465void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000466_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 +0000467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 for (k=nd-1; k>=0; k--) {
471 if (index[k] < shape[k]-1) {
472 index[k]++;
473 break;
474 }
475 else {
476 index[k] = 0;
477 }
478 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000479}
480
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000481int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000482PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000485 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 Py_ssize_t *indices, elements;
487 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 if (len > view->len) {
490 len = view->len;
491 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 if (PyBuffer_IsContiguous(view, fort)) {
494 /* simplest copy is all that is needed */
495 memcpy(view->buf, buf, len);
496 return 0;
497 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000500
Stefan Krah7213fcc2015-02-01 16:19:23 +0100501 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
503 if (indices == NULL) {
504 PyErr_NoMemory();
505 return -1;
506 }
507 for (k=0; k<view->ndim;k++) {
508 indices[k] = 0;
509 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000512 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 }
514 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000515 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 }
517 src = buf;
518 /* XXX : This is not going to be the fastest code in the world
519 several optimizations are possible.
520 */
521 elements = len / view->itemsize;
522 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 ptr = PyBuffer_GetPointer(view, indices);
524 memcpy(ptr, src, view->itemsize);
525 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100526 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 PyMem_Free(indices);
530 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000531}
532
Guido van Rossum98297ee2007-11-06 21:34:58 +0000533int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 Py_buffer view_dest, view_src;
536 int k;
537 Py_ssize_t *indices, elements;
538 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 if (!PyObject_CheckBuffer(dest) ||
541 !PyObject_CheckBuffer(src)) {
542 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400543 "both destination and source must be "\
544 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 return -1;
546 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
549 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
550 PyBuffer_Release(&view_dest);
551 return -1;
552 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (view_dest.len < view_src.len) {
555 PyErr_SetString(PyExc_BufferError,
556 "destination is too small to receive data from source");
557 PyBuffer_Release(&view_dest);
558 PyBuffer_Release(&view_src);
559 return -1;
560 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
563 PyBuffer_IsContiguous(&view_src, 'C')) ||
564 (PyBuffer_IsContiguous(&view_dest, 'F') &&
565 PyBuffer_IsContiguous(&view_src, 'F'))) {
566 /* simplest copy is all that is needed */
567 memcpy(view_dest.buf, view_src.buf, view_src.len);
568 PyBuffer_Release(&view_dest);
569 PyBuffer_Release(&view_src);
570 return 0;
571 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 /* XXX(nnorwitz): need to check for overflow! */
576 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
577 if (indices == NULL) {
578 PyErr_NoMemory();
579 PyBuffer_Release(&view_dest);
580 PyBuffer_Release(&view_src);
581 return -1;
582 }
583 for (k=0; k<view_src.ndim;k++) {
584 indices[k] = 0;
585 }
586 elements = 1;
587 for (k=0; k<view_src.ndim; k++) {
588 /* XXX(nnorwitz): can this overflow? */
589 elements *= view_src.shape[k];
590 }
591 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000592 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 dptr = PyBuffer_GetPointer(&view_dest, indices);
594 sptr = PyBuffer_GetPointer(&view_src, indices);
595 memcpy(dptr, sptr, view_src.itemsize);
596 }
597 PyMem_Free(indices);
598 PyBuffer_Release(&view_dest);
599 PyBuffer_Release(&view_src);
600 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000601}
602
603void
604PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 Py_ssize_t *strides, int itemsize,
606 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000607{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 int k;
609 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 sd = itemsize;
612 if (fort == 'F') {
613 for (k=0; k<nd; k++) {
614 strides[k] = sd;
615 sd *= shape[k];
616 }
617 }
618 else {
619 for (k=nd-1; k>=0; k--) {
620 strides[k] = sd;
621 sd *= shape[k];
622 }
623 }
624 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000625}
626
627int
Martin v. Löwis423be952008-08-13 15:53:07 +0000628PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100629 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000630{
Stefan Krah5178d912015-02-03 16:57:21 +0100631 if (view == NULL) {
632 PyErr_SetString(PyExc_BufferError,
633 "PyBuffer_FillInfo: view==NULL argument is obsolete");
634 return -1;
635 }
636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
638 (readonly == 1)) {
639 PyErr_SetString(PyExc_BufferError,
640 "Object is not writable.");
641 return -1;
642 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 view->obj = obj;
645 if (obj)
646 Py_INCREF(obj);
647 view->buf = buf;
648 view->len = len;
649 view->readonly = readonly;
650 view->itemsize = 1;
651 view->format = NULL;
652 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
653 view->format = "B";
654 view->ndim = 1;
655 view->shape = NULL;
656 if ((flags & PyBUF_ND) == PyBUF_ND)
657 view->shape = &(view->len);
658 view->strides = NULL;
659 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
660 view->strides = &(view->itemsize);
661 view->suboffsets = NULL;
662 view->internal = NULL;
663 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000664}
665
Martin v. Löwis423be952008-08-13 15:53:07 +0000666void
667PyBuffer_Release(Py_buffer *view)
668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200670 PyBufferProcs *pb;
671 if (obj == NULL)
672 return;
673 pb = Py_TYPE(obj)->tp_as_buffer;
674 if (pb && pb->bf_releasebuffer)
675 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200677 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000678}
679
Eric Smith8fd3eba2008-02-17 19:48:00 +0000680PyObject *
681PyObject_Format(PyObject *obj, PyObject *format_spec)
682{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000683 PyObject *meth;
684 PyObject *empty = NULL;
685 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500686 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000687
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300688 if (format_spec != NULL && !PyUnicode_Check(format_spec)) {
689 PyErr_Format(PyExc_SystemError,
690 "Format specifier must be a string, not %.200s",
691 Py_TYPE(format_spec)->tp_name);
692 return NULL;
693 }
694
695 /* Fast path for common types. */
696 if (format_spec == NULL || PyUnicode_GET_LENGTH(format_spec) == 0) {
697 if (PyUnicode_CheckExact(obj)) {
698 Py_INCREF(obj);
699 return obj;
700 }
701 if (PyLong_CheckExact(obj)) {
702 return PyObject_Str(obj);
703 }
704 }
705
Eric Smith8fd3eba2008-02-17 19:48:00 +0000706 /* If no format_spec is provided, use an empty string */
707 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100708 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000709 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000710 }
711
Serhiy Storchakaea525a22016-09-06 22:07:53 +0300712 /* Find the (unbound!) __format__ method */
Benjamin Petersonce798522012-01-22 11:24:29 -0500713 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000714 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000715 if (!PyErr_Occurred())
716 PyErr_Format(PyExc_TypeError,
717 "Type %.100s doesn't define __format__",
718 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000720 }
721
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000722 /* And call it. */
Victor Stinnerde4ae3d2016-12-04 22:59:09 +0100723 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000724 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000725
726 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800727 PyErr_Format(PyExc_TypeError,
728 "__format__ must return a str, not %.200s",
729 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000730 Py_DECREF(result);
731 result = NULL;
732 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000733 }
734
735done:
736 Py_XDECREF(empty);
737 return result;
738}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000739/* Operations on numbers */
740
741int
Fred Drake79912472000-07-09 04:06:11 +0000742PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 return o && o->ob_type->tp_as_number &&
745 (o->ob_type->tp_as_number->nb_int ||
746 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000747}
748
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000749/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000750
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000751#define NB_SLOT(x) offsetof(PyNumberMethods, x)
752#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000754#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000756
757/*
758 Calling scheme used for binary operations:
759
Neal Norwitz4886cc32006-08-21 17:06:07 +0000760 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000762
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000763 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
764 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000765 */
766
767static PyObject *
768binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 PyObject *x;
771 binaryfunc slotv = NULL;
772 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 if (v->ob_type->tp_as_number != NULL)
775 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
776 if (w->ob_type != v->ob_type &&
777 w->ob_type->tp_as_number != NULL) {
778 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
779 if (slotw == slotv)
780 slotw = NULL;
781 }
782 if (slotv) {
783 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
784 x = slotw(v, w);
785 if (x != Py_NotImplemented)
786 return x;
787 Py_DECREF(x); /* can't do it */
788 slotw = NULL;
789 }
790 x = slotv(v, w);
791 if (x != Py_NotImplemented)
792 return x;
793 Py_DECREF(x); /* can't do it */
794 }
795 if (slotw) {
796 x = slotw(v, w);
797 if (x != Py_NotImplemented)
798 return x;
799 Py_DECREF(x); /* can't do it */
800 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500801 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000802}
Guido van Rossum77660912002-04-16 16:32:50 +0000803
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000804static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000805binop_type_error(PyObject *v, PyObject *w, const char *op_name)
806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 PyErr_Format(PyExc_TypeError,
808 "unsupported operand type(s) for %.100s: "
809 "'%.100s' and '%.100s'",
810 op_name,
811 v->ob_type->tp_name,
812 w->ob_type->tp_name);
813 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000814}
815
816static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000817binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 PyObject *result = binary_op1(v, w, op_slot);
820 if (result == Py_NotImplemented) {
821 Py_DECREF(result);
822 return binop_type_error(v, w, op_name);
823 }
824 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000825}
826
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000827
828/*
829 Calling scheme used for ternary operations:
830
Neal Norwitz4886cc32006-08-21 17:06:07 +0000831 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000833 */
834
835static PyObject *
836ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 PyObject *w,
838 PyObject *z,
839 const int op_slot,
840 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 PyNumberMethods *mv, *mw, *mz;
843 PyObject *x = NULL;
844 ternaryfunc slotv = NULL;
845 ternaryfunc slotw = NULL;
846 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 mv = v->ob_type->tp_as_number;
849 mw = w->ob_type->tp_as_number;
850 if (mv != NULL)
851 slotv = NB_TERNOP(mv, op_slot);
852 if (w->ob_type != v->ob_type &&
853 mw != NULL) {
854 slotw = NB_TERNOP(mw, op_slot);
855 if (slotw == slotv)
856 slotw = NULL;
857 }
858 if (slotv) {
859 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
860 x = slotw(v, w, z);
861 if (x != Py_NotImplemented)
862 return x;
863 Py_DECREF(x); /* can't do it */
864 slotw = NULL;
865 }
866 x = slotv(v, w, z);
867 if (x != Py_NotImplemented)
868 return x;
869 Py_DECREF(x); /* can't do it */
870 }
871 if (slotw) {
872 x = slotw(v, w, z);
873 if (x != Py_NotImplemented)
874 return x;
875 Py_DECREF(x); /* can't do it */
876 }
877 mz = z->ob_type->tp_as_number;
878 if (mz != NULL) {
879 slotz = NB_TERNOP(mz, op_slot);
880 if (slotz == slotv || slotz == slotw)
881 slotz = NULL;
882 if (slotz) {
883 x = slotz(v, w, z);
884 if (x != Py_NotImplemented)
885 return x;
886 Py_DECREF(x); /* can't do it */
887 }
888 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 if (z == Py_None)
891 PyErr_Format(
892 PyExc_TypeError,
893 "unsupported operand type(s) for ** or pow(): "
894 "'%.100s' and '%.100s'",
895 v->ob_type->tp_name,
896 w->ob_type->tp_name);
897 else
898 PyErr_Format(
899 PyExc_TypeError,
900 "unsupported operand type(s) for pow(): "
901 "'%.100s', '%.100s', '%.100s'",
902 v->ob_type->tp_name,
903 w->ob_type->tp_name,
904 z->ob_type->tp_name);
905 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000906}
907
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000908#define BINARY_FUNC(func, op, op_name) \
909 PyObject * \
910 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000912 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000913
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000914BINARY_FUNC(PyNumber_Or, nb_or, "|")
915BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
916BINARY_FUNC(PyNumber_And, nb_and, "&")
917BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
918BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
919BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000920BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000921
922PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000923PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
926 if (result == Py_NotImplemented) {
927 PySequenceMethods *m = v->ob_type->tp_as_sequence;
928 Py_DECREF(result);
929 if (m && m->sq_concat) {
930 return (*m->sq_concat)(v, w);
931 }
932 result = binop_type_error(v, w, "+");
933 }
934 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000935}
936
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000937static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000938sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 Py_ssize_t count;
941 if (PyIndex_Check(n)) {
942 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
943 if (count == -1 && PyErr_Occurred())
944 return NULL;
945 }
946 else {
947 return type_error("can't multiply sequence by "
948 "non-int of type '%.200s'", n);
949 }
950 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000951}
952
953PyObject *
954PyNumber_Multiply(PyObject *v, PyObject *w)
955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
957 if (result == Py_NotImplemented) {
958 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
959 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
960 Py_DECREF(result);
961 if (mv && mv->sq_repeat) {
962 return sequence_repeat(mv->sq_repeat, v, w);
963 }
964 else if (mw && mw->sq_repeat) {
965 return sequence_repeat(mw->sq_repeat, w, v);
966 }
967 result = binop_type_error(v, w, "*");
968 }
969 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000970}
971
Guido van Rossume15dee51995-07-18 14:12:02 +0000972PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -0400973PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
974{
975 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
976}
977
978PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000979PyNumber_FloorDivide(PyObject *v, PyObject *w)
980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +0000982}
983
984PyObject *
985PyNumber_TrueDivide(PyObject *v, PyObject *w)
986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +0000988}
989
990PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000991PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000994}
995
996PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000997PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +00001000}
1001
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001002/* Binary in-place operators */
1003
1004/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001005 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001006
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001007 - If the left hand object has the appropriate struct members, and
1008 they are filled, call the appropriate function and return the
1009 result. No coercion is done on the arguments; the left-hand object
1010 is the one the operation is performed on, and it's up to the
1011 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +00001012
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001013 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001014 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001015
1016 */
1017
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001018static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001019binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 PyNumberMethods *mv = v->ob_type->tp_as_number;
1022 if (mv != NULL) {
1023 binaryfunc slot = NB_BINOP(mv, iop_slot);
1024 if (slot) {
1025 PyObject *x = (slot)(v, w);
1026 if (x != Py_NotImplemented) {
1027 return x;
1028 }
1029 Py_DECREF(x);
1030 }
1031 }
1032 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001033}
1034
1035static PyObject *
1036binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1040 if (result == Py_NotImplemented) {
1041 Py_DECREF(result);
1042 return binop_type_error(v, w, op_name);
1043 }
1044 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001045}
1046
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001047#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 PyObject * \
1049 func(PyObject *v, PyObject *w) { \
1050 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1051 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001052
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001053INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1054INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1055INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1056INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1057INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1058INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001059INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001060
1061PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001062PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1065 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001066}
1067
1068PyObject *
1069PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1072 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001073}
1074
1075PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001076PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1079 NB_SLOT(nb_add));
1080 if (result == Py_NotImplemented) {
1081 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1082 Py_DECREF(result);
1083 if (m != NULL) {
1084 binaryfunc f = NULL;
1085 f = m->sq_inplace_concat;
1086 if (f == NULL)
1087 f = m->sq_concat;
1088 if (f != NULL)
1089 return (*f)(v, w);
1090 }
1091 result = binop_type_error(v, w, "+=");
1092 }
1093 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001094}
1095
1096PyObject *
1097PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1100 NB_SLOT(nb_multiply));
1101 if (result == Py_NotImplemented) {
1102 ssizeargfunc f = NULL;
1103 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1104 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1105 Py_DECREF(result);
1106 if (mv != NULL) {
1107 f = mv->sq_inplace_repeat;
1108 if (f == NULL)
1109 f = mv->sq_repeat;
1110 if (f != NULL)
1111 return sequence_repeat(f, v, w);
1112 }
1113 else if (mw != NULL) {
1114 /* Note that the right hand operand should not be
1115 * mutated in this case so sq_inplace_repeat is not
1116 * used. */
1117 if (mw->sq_repeat)
1118 return sequence_repeat(mw->sq_repeat, w, v);
1119 }
1120 result = binop_type_error(v, w, "*=");
1121 }
1122 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001123}
1124
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001125PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001126PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1127{
1128 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1129 NB_SLOT(nb_matrix_multiply), "@=");
1130}
1131
1132PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001133PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1136 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001137}
1138
1139PyObject *
1140PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1141{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 if (v->ob_type->tp_as_number &&
1143 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1144 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1145 }
1146 else {
1147 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1148 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001149}
1150
1151
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001152/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001153
1154PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001155PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001156{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001158
Victor Stinner71aea8e2016-08-19 16:59:55 +02001159 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001161 }
1162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 m = o->ob_type->tp_as_number;
1164 if (m && m->nb_negative)
1165 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001168}
1169
1170PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001171PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001172{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001174
Victor Stinner71aea8e2016-08-19 16:59:55 +02001175 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001177 }
1178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 m = o->ob_type->tp_as_number;
1180 if (m && m->nb_positive)
1181 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001184}
1185
1186PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001187PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001190
Victor Stinner71aea8e2016-08-19 16:59:55 +02001191 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001193 }
1194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 m = o->ob_type->tp_as_number;
1196 if (m && m->nb_invert)
1197 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001200}
1201
1202PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001203PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001204{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001206
Victor Stinner71aea8e2016-08-19 16:59:55 +02001207 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001209 }
1210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 m = o->ob_type->tp_as_number;
1212 if (m && m->nb_absolute)
1213 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001216}
1217
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001218/* Return a Python int from the object item.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001219 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001220 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001221*/
1222PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001223PyNumber_Index(PyObject *item)
1224{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 PyObject *result = NULL;
Victor Stinner71aea8e2016-08-19 16:59:55 +02001226 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001228 }
1229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 if (PyLong_Check(item)) {
1231 Py_INCREF(item);
1232 return item;
1233 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001234 if (!PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 PyErr_Format(PyExc_TypeError,
1236 "'%.200s' object cannot be interpreted "
1237 "as an integer", item->ob_type->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001238 return NULL;
1239 }
1240 result = item->ob_type->tp_as_number->nb_index(item);
1241 if (!result || PyLong_CheckExact(result))
1242 return result;
1243 if (!PyLong_Check(result)) {
1244 PyErr_Format(PyExc_TypeError,
1245 "__index__ returned non-int (type %.200s)",
1246 result->ob_type->tp_name);
1247 Py_DECREF(result);
1248 return NULL;
1249 }
1250 /* Issue #17576: warn if 'result' not of exact type int. */
1251 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1252 "__index__ returned non-int (type %.200s). "
1253 "The ability to return an instance of a strict subclass of int "
1254 "is deprecated, and may be removed in a future version of Python.",
1255 result->ob_type->tp_name)) {
1256 Py_DECREF(result);
1257 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 }
1259 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001260}
1261
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001262/* Return an error on Overflow only if err is not NULL*/
1263
1264Py_ssize_t
1265PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 Py_ssize_t result;
1268 PyObject *runerr;
1269 PyObject *value = PyNumber_Index(item);
1270 if (value == NULL)
1271 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 /* We're done if PyLong_AsSsize_t() returns without error. */
1274 result = PyLong_AsSsize_t(value);
1275 if (result != -1 || !(runerr = PyErr_Occurred()))
1276 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 /* Error handling code -- only manage OverflowError differently */
1279 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1280 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 PyErr_Clear();
1283 /* If no error-handling desired then the default clipping
1284 is sufficient.
1285 */
1286 if (!err) {
1287 assert(PyLong_Check(value));
1288 /* Whether or not it is less than or equal to
1289 zero is determined by the sign of ob_size
1290 */
1291 if (_PyLong_Sign(value) < 0)
1292 result = PY_SSIZE_T_MIN;
1293 else
1294 result = PY_SSIZE_T_MAX;
1295 }
1296 else {
1297 /* Otherwise replace the error with caller's error object. */
1298 PyErr_Format(err,
1299 "cannot fit '%.200s' into an index-sized integer",
1300 item->ob_type->tp_name);
1301 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001302
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001303 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 Py_DECREF(value);
1305 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001306}
1307
1308
Guido van Rossume15dee51995-07-18 14:12:02 +00001309PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001310PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001311{
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001312 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001315 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001316 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001317
Victor Stinner71aea8e2016-08-19 16:59:55 +02001318 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001320 }
1321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 if (PyLong_CheckExact(o)) {
1323 Py_INCREF(o);
1324 return o;
1325 }
1326 m = o->ob_type->tp_as_number;
1327 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001328 result = (PyObject *)_PyLong_FromNbInt(o);
1329 if (result != NULL && !PyLong_CheckExact(result)) {
1330 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1331 }
1332 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001334 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if (trunc_func) {
INADA Naoki72dccde2017-02-16 09:26:01 +09001336 result = _PyObject_CallNoArg(trunc_func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 Py_DECREF(trunc_func);
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001338 if (result == NULL || PyLong_CheckExact(result)) {
1339 return result;
1340 }
1341 if (PyLong_Check(result)) {
1342 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1343 return result;
1344 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001346 but int() needs to return an int. */
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001347 m = result->ob_type->tp_as_number;
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001348 if (m == NULL || m->nb_int == NULL) {
1349 PyErr_Format(
1350 PyExc_TypeError,
1351 "__trunc__ returned non-Integral (type %.200s)",
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001352 result->ob_type->tp_name);
1353 Py_DECREF(result);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001354 return NULL;
1355 }
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001356 Py_SETREF(result, (PyObject *)_PyLong_FromNbInt(result));
1357 if (result != NULL && !PyLong_CheckExact(result)) {
1358 Py_SETREF(result, _PyLong_Copy((PyLongObject *)result));
1359 }
1360 return result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001362 if (PyErr_Occurred())
1363 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001364
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001365 if (PyUnicode_Check(o))
1366 /* The below check is done in PyLong_FromUnicode(). */
1367 return PyLong_FromUnicodeObject(o, 10);
1368
Martin Pantereeb896c2015-11-07 02:32:21 +00001369 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001371 * doesn't do. In particular int('9\x005') must raise an
1372 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001374 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1375 PyBytes_GET_SIZE(o), 10);
1376
1377 if (PyByteArray_Check(o))
1378 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1379 PyByteArray_GET_SIZE(o), 10);
1380
1381 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
Serhiy Storchaka54cd1962016-08-21 20:03:08 +03001382 PyObject *bytes;
Martin Pantereeb896c2015-11-07 02:32:21 +00001383
1384 /* Copy to NUL-terminated buffer. */
1385 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1386 if (bytes == NULL) {
1387 PyBuffer_Release(&view);
1388 return NULL;
1389 }
1390 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1391 PyBytes_GET_SIZE(bytes), 10);
1392 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001393 PyBuffer_Release(&view);
1394 return result;
1395 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001396
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001397 return type_error("int() argument must be a string, a bytes-like object "
1398 "or a number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001399}
1400
1401PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001402PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001405
Victor Stinner71aea8e2016-08-19 16:59:55 +02001406 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001408 }
1409
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001410 if (PyFloat_CheckExact(o)) {
1411 Py_INCREF(o);
1412 return o;
1413 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 m = o->ob_type->tp_as_number;
1415 if (m && m->nb_float) { /* This should include subclasses of float */
1416 PyObject *res = m->nb_float(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001417 double val;
1418 if (!res || PyFloat_CheckExact(res)) {
1419 return res;
1420 }
1421 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001423 "%.50s.__float__ returned non-float (type %.50s)",
1424 o->ob_type->tp_name, res->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 Py_DECREF(res);
1426 return NULL;
1427 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001428 /* Issue #26983: warn if 'res' not of exact type float. */
1429 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1430 "%.50s.__float__ returned non-float (type %.50s). "
1431 "The ability to return an instance of a strict subclass of float "
1432 "is deprecated, and may be removed in a future version of Python.",
1433 o->ob_type->tp_name, res->ob_type->tp_name)) {
1434 Py_DECREF(res);
1435 return NULL;
1436 }
1437 val = PyFloat_AS_DOUBLE(res);
1438 Py_DECREF(res);
1439 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 }
1441 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001442 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 }
1444 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001445}
1446
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001447
1448PyObject *
1449PyNumber_ToBase(PyObject *n, int base)
1450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 PyObject *res = NULL;
1452 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 if (!index)
1455 return NULL;
1456 if (PyLong_Check(index))
1457 res = _PyLong_Format(index, base);
1458 else
1459 /* It should not be possible to get here, as
1460 PyNumber_Index already has a check for the same
1461 condition */
Serhiy Storchaka95949422013-08-27 19:40:23 +03001462 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 Py_DECREF(index);
1464 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001465}
1466
1467
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001468/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001469
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001470int
Fred Drake79912472000-07-09 04:06:11 +00001471PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 if (PyDict_Check(s))
1474 return 0;
1475 return s != NULL && s->ob_type->tp_as_sequence &&
1476 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001477}
1478
Martin v. Löwis18e16552006-02-15 17:27:45 +00001479Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001480PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 if (s == NULL) {
1485 null_error();
1486 return -1;
1487 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 m = s->ob_type->tp_as_sequence;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001490 if (m && m->sq_length) {
1491 Py_ssize_t len = m->sq_length(s);
1492 assert(len >= 0 || PyErr_Occurred());
1493 return len;
1494 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 type_error("object of type '%.200s' has no len()", s);
1497 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001498}
1499
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001500#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001501Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001502PySequence_Length(PyObject *s)
1503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001505}
1506#define PySequence_Length PySequence_Size
1507
Guido van Rossume15dee51995-07-18 14:12:02 +00001508PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001509PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001512
Victor Stinner71aea8e2016-08-19 16:59:55 +02001513 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001515 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001517 m = s->ob_type->tp_as_sequence;
1518 if (m && m->sq_concat)
1519 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 /* Instances of user classes defining an __add__() method only
1522 have an nb_add slot, not an sq_concat slot. So we fall back
1523 to nb_add if both arguments appear to be sequences. */
1524 if (PySequence_Check(s) && PySequence_Check(o)) {
1525 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1526 if (result != Py_NotImplemented)
1527 return result;
1528 Py_DECREF(result);
1529 }
1530 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001531}
1532
1533PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001534PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001537
Victor Stinner71aea8e2016-08-19 16:59:55 +02001538 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001540 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 m = o->ob_type->tp_as_sequence;
1543 if (m && m->sq_repeat)
1544 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 /* Instances of user classes defining a __mul__() method only
1547 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1548 to nb_multiply if o appears to be a sequence. */
1549 if (PySequence_Check(o)) {
1550 PyObject *n, *result;
1551 n = PyLong_FromSsize_t(count);
1552 if (n == NULL)
1553 return NULL;
1554 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1555 Py_DECREF(n);
1556 if (result != Py_NotImplemented)
1557 return result;
1558 Py_DECREF(result);
1559 }
1560 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001561}
1562
1563PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001564PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001567
Victor Stinner71aea8e2016-08-19 16:59:55 +02001568 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001570 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 m = s->ob_type->tp_as_sequence;
1573 if (m && m->sq_inplace_concat)
1574 return m->sq_inplace_concat(s, o);
1575 if (m && m->sq_concat)
1576 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 if (PySequence_Check(s) && PySequence_Check(o)) {
1579 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1580 NB_SLOT(nb_add));
1581 if (result != Py_NotImplemented)
1582 return result;
1583 Py_DECREF(result);
1584 }
1585 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001586}
1587
1588PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001589PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001592
Victor Stinner71aea8e2016-08-19 16:59:55 +02001593 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001595 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 m = o->ob_type->tp_as_sequence;
1598 if (m && m->sq_inplace_repeat)
1599 return m->sq_inplace_repeat(o, count);
1600 if (m && m->sq_repeat)
1601 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 if (PySequence_Check(o)) {
1604 PyObject *n, *result;
1605 n = PyLong_FromSsize_t(count);
1606 if (n == NULL)
1607 return NULL;
1608 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1609 NB_SLOT(nb_multiply));
1610 Py_DECREF(n);
1611 if (result != Py_NotImplemented)
1612 return result;
1613 Py_DECREF(result);
1614 }
1615 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001616}
1617
1618PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001619PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001622
Victor Stinner71aea8e2016-08-19 16:59:55 +02001623 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001625 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 m = s->ob_type->tp_as_sequence;
1628 if (m && m->sq_item) {
1629 if (i < 0) {
1630 if (m->sq_length) {
1631 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnere20310f2015-11-05 13:56:58 +01001632 if (l < 0) {
1633 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001635 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 i += l;
1637 }
1638 }
1639 return m->sq_item(s, i);
1640 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001643}
1644
1645PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001646PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001649
Victor Stinner71aea8e2016-08-19 16:59:55 +02001650 if (!s) {
1651 return null_error();
1652 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001655 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 PyObject *res;
1657 PyObject *slice = _PySlice_FromIndices(i1, i2);
1658 if (!slice)
1659 return NULL;
1660 res = mp->mp_subscript(s, slice);
1661 Py_DECREF(slice);
1662 return res;
1663 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001666}
1667
1668int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001669PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 if (s == NULL) {
1674 null_error();
1675 return -1;
1676 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 m = s->ob_type->tp_as_sequence;
1679 if (m && m->sq_ass_item) {
1680 if (i < 0) {
1681 if (m->sq_length) {
1682 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001683 if (l < 0) {
1684 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 i += l;
1688 }
1689 }
1690 return m->sq_ass_item(s, i, o);
1691 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 type_error("'%.200s' object does not support item assignment", s);
1694 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001695}
1696
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001697int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001698PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 if (s == NULL) {
1703 null_error();
1704 return -1;
1705 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 m = s->ob_type->tp_as_sequence;
1708 if (m && m->sq_ass_item) {
1709 if (i < 0) {
1710 if (m->sq_length) {
1711 Py_ssize_t l = (*m->sq_length)(s);
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001712 if (l < 0) {
1713 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 return -1;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03001715 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 i += l;
1717 }
1718 }
1719 return m->sq_ass_item(s, i, (PyObject *)NULL);
1720 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 type_error("'%.200s' object doesn't support item deletion", s);
1723 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001724}
1725
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001726int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001727PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 if (s == NULL) {
1732 null_error();
1733 return -1;
1734 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001737 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 int res;
1739 PyObject *slice = _PySlice_FromIndices(i1, i2);
1740 if (!slice)
1741 return -1;
1742 res = mp->mp_ass_subscript(s, slice, o);
1743 Py_DECREF(slice);
1744 return res;
1745 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 type_error("'%.200s' object doesn't support slice assignment", s);
1748 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001749}
1750
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001751int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001752PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 if (s == NULL) {
1757 null_error();
1758 return -1;
1759 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001762 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 int res;
1764 PyObject *slice = _PySlice_FromIndices(i1, i2);
1765 if (!slice)
1766 return -1;
1767 res = mp->mp_ass_subscript(s, slice, NULL);
1768 Py_DECREF(slice);
1769 return res;
1770 }
1771 type_error("'%.200s' object doesn't support slice deletion", s);
1772 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001773}
1774
Guido van Rossume15dee51995-07-18 14:12:02 +00001775PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001776PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 PyObject *it; /* iter(v) */
1779 Py_ssize_t n; /* guess for result tuple size */
1780 PyObject *result = NULL;
1781 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001782
Victor Stinner71aea8e2016-08-19 16:59:55 +02001783 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001785 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 /* Special-case the common tuple and list cases, for efficiency. */
1788 if (PyTuple_CheckExact(v)) {
1789 /* Note that we can't know whether it's safe to return
1790 a tuple *subclass* instance as-is, hence the restriction
1791 to exact tuples here. In contrast, lists always make
1792 a copy, so there's no need for exactness below. */
1793 Py_INCREF(v);
1794 return v;
1795 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001796 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 /* Get iterator. */
1800 it = PyObject_GetIter(v);
1801 if (it == NULL)
1802 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001805 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 if (n == -1)
1807 goto Fail;
1808 result = PyTuple_New(n);
1809 if (result == NULL)
1810 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 /* Fill the tuple. */
1813 for (j = 0; ; ++j) {
1814 PyObject *item = PyIter_Next(it);
1815 if (item == NULL) {
1816 if (PyErr_Occurred())
1817 goto Fail;
1818 break;
1819 }
1820 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00001821 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 /* The over-allocation strategy can grow a bit faster
1823 than for lists because unlike lists the
1824 over-allocation isn't permanent -- we reclaim
1825 the excess before the end of this routine.
1826 So, grow by ten and then add 25%.
1827 */
Martin Pantere8db8612016-07-25 02:30:05 +00001828 newn += 10u;
1829 newn += newn >> 2;
1830 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 /* Check for overflow */
1832 PyErr_NoMemory();
1833 Py_DECREF(item);
1834 goto Fail;
1835 }
Martin Pantere8db8612016-07-25 02:30:05 +00001836 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (_PyTuple_Resize(&result, n) != 0) {
1838 Py_DECREF(item);
1839 goto Fail;
1840 }
1841 }
1842 PyTuple_SET_ITEM(result, j, item);
1843 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 /* Cut tuple back if guess was too large. */
1846 if (j < n &&
1847 _PyTuple_Resize(&result, j) != 0)
1848 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 Py_DECREF(it);
1851 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001852
1853Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 Py_XDECREF(result);
1855 Py_DECREF(it);
1856 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001857}
1858
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001859PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001860PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 PyObject *result; /* result list */
1863 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001864
Victor Stinner71aea8e2016-08-19 16:59:55 +02001865 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001866 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001867 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 result = PyList_New(0);
1870 if (result == NULL)
1871 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 rv = _PyList_Extend((PyListObject *)result, v);
1874 if (rv == NULL) {
1875 Py_DECREF(result);
1876 return NULL;
1877 }
1878 Py_DECREF(rv);
1879 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001880}
1881
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001882PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001883PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001886
Victor Stinner71aea8e2016-08-19 16:59:55 +02001887 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001889 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1892 Py_INCREF(v);
1893 return v;
1894 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 it = PyObject_GetIter(v);
1897 if (it == NULL) {
1898 if (PyErr_ExceptionMatches(PyExc_TypeError))
1899 PyErr_SetString(PyExc_TypeError, m);
1900 return NULL;
1901 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 v = PySequence_List(it);
1904 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001907}
1908
Tim Peters16a77ad2001-09-08 04:00:12 +00001909/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1911 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1912 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001913 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1914*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001915Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001916_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 Py_ssize_t n;
1919 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1920 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 if (seq == NULL || obj == NULL) {
1923 null_error();
1924 return -1;
1925 }
Tim Peters75f8e352001-05-05 11:33:43 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 it = PyObject_GetIter(seq);
1928 if (it == NULL) {
1929 type_error("argument of type '%.200s' is not iterable", seq);
1930 return -1;
1931 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 n = wrapped = 0;
1934 for (;;) {
1935 int cmp;
1936 PyObject *item = PyIter_Next(it);
1937 if (item == NULL) {
1938 if (PyErr_Occurred())
1939 goto Fail;
1940 break;
1941 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1944 Py_DECREF(item);
1945 if (cmp < 0)
1946 goto Fail;
1947 if (cmp > 0) {
1948 switch (operation) {
1949 case PY_ITERSEARCH_COUNT:
1950 if (n == PY_SSIZE_T_MAX) {
1951 PyErr_SetString(PyExc_OverflowError,
1952 "count exceeds C integer size");
1953 goto Fail;
1954 }
1955 ++n;
1956 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001958 case PY_ITERSEARCH_INDEX:
1959 if (wrapped) {
1960 PyErr_SetString(PyExc_OverflowError,
1961 "index exceeds C integer size");
1962 goto Fail;
1963 }
1964 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 case PY_ITERSEARCH_CONTAINS:
1967 n = 1;
1968 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001970 default:
1971 assert(!"unknown operation");
1972 }
1973 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (operation == PY_ITERSEARCH_INDEX) {
1976 if (n == PY_SSIZE_T_MAX)
1977 wrapped = 1;
1978 ++n;
1979 }
1980 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 if (operation != PY_ITERSEARCH_INDEX)
1983 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001985 PyErr_SetString(PyExc_ValueError,
1986 "sequence.index(x): x not in sequence");
1987 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00001988Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 n = -1;
1990 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00001991Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 Py_DECREF(it);
1993 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001994
Guido van Rossume15dee51995-07-18 14:12:02 +00001995}
1996
Tim Peters16a77ad2001-09-08 04:00:12 +00001997/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001998Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001999PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00002002}
2003
Tim Peterscb8d3682001-05-05 21:05:01 +00002004/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00002005 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00002006 */
2007int
2008PySequence_Contains(PyObject *seq, PyObject *ob)
2009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 Py_ssize_t result;
2011 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
2012 if (sqm != NULL && sqm->sq_contains != NULL)
2013 return (*sqm->sq_contains)(seq, ob);
2014 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
2015 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00002016}
2017
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002018/* Backwards compatibility */
2019#undef PySequence_In
2020int
Fred Drake79912472000-07-09 04:06:11 +00002021PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002024}
2025
Neal Norwitz1fc4b772006-03-04 18:49:58 +00002026Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00002027PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00002030}
2031
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002032/* Operations on mappings */
2033
2034int
Fred Drake79912472000-07-09 04:06:11 +00002035PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002036{
Benjamin Peterson21992272011-12-28 12:01:31 -06002037 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00002039}
2040
Martin v. Löwis18e16552006-02-15 17:27:45 +00002041Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00002042PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00002043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00002045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 if (o == NULL) {
2047 null_error();
2048 return -1;
2049 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 m = o->ob_type->tp_as_mapping;
Serhiy Storchaka813f9432017-04-16 09:21:44 +03002052 if (m && m->mp_length) {
2053 Py_ssize_t len = m->mp_length(o);
2054 assert(len >= 0 || PyErr_Occurred());
2055 return len;
2056 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 type_error("object of type '%.200s' has no len()", o);
2059 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002060}
2061
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002062#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002063Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002064PyMapping_Length(PyObject *o)
2065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002067}
2068#define PyMapping_Length PyMapping_Size
2069
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002070PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002071PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002073 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002074
Victor Stinner71aea8e2016-08-19 16:59:55 +02002075 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002077 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002079 okey = PyUnicode_FromString(key);
2080 if (okey == NULL)
2081 return NULL;
2082 r = PyObject_GetItem(o, okey);
2083 Py_DECREF(okey);
2084 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002085}
2086
2087int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002088PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 PyObject *okey;
2091 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 if (key == NULL) {
2094 null_error();
2095 return -1;
2096 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 okey = PyUnicode_FromString(key);
2099 if (okey == NULL)
2100 return -1;
2101 r = PyObject_SetItem(o, okey, value);
2102 Py_DECREF(okey);
2103 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002104}
2105
2106int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002107PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 v = PyMapping_GetItemString(o, key);
2112 if (v) {
2113 Py_DECREF(v);
2114 return 1;
2115 }
2116 PyErr_Clear();
2117 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002118}
2119
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002120int
Fred Drake79912472000-07-09 04:06:11 +00002121PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 v = PyObject_GetItem(o, key);
2126 if (v) {
2127 Py_DECREF(v);
2128 return 1;
2129 }
2130 PyErr_Clear();
2131 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002132}
2133
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002134PyObject *
2135PyMapping_Keys(PyObject *o)
2136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 PyObject *keys;
2138 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002139 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002141 if (PyDict_CheckExact(o))
2142 return PyDict_Keys(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002143 keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 if (keys == NULL)
2145 return NULL;
2146 fast = PySequence_Fast(keys, "o.keys() are not iterable");
2147 Py_DECREF(keys);
2148 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002149}
2150
2151PyObject *
2152PyMapping_Items(PyObject *o)
2153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 PyObject *items;
2155 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002156 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 if (PyDict_CheckExact(o))
2159 return PyDict_Items(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002160 items = _PyObject_CallMethodId(o, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (items == NULL)
2162 return NULL;
2163 fast = PySequence_Fast(items, "o.items() are not iterable");
2164 Py_DECREF(items);
2165 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002166}
2167
2168PyObject *
2169PyMapping_Values(PyObject *o)
2170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 PyObject *values;
2172 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002173 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002175 if (PyDict_CheckExact(o))
2176 return PyDict_Values(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002177 values = _PyObject_CallMethodId(o, &PyId_values, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (values == NULL)
2179 return NULL;
2180 fast = PySequence_Fast(values, "o.values() are not iterable");
2181 Py_DECREF(values);
2182 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002183}
2184
Guido van Rossum823649d2001-03-21 18:40:58 +00002185/* isinstance(), issubclass() */
2186
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002187/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002188 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002189 * 1. getattr(cls, '__bases__') could raise an AttributeError
2190 * 2. getattr(cls, '__bases__') could raise some other exception
2191 * 3. getattr(cls, '__bases__') could return a tuple
2192 * 4. getattr(cls, '__bases__') could return something other than a tuple
2193 *
2194 * Only state #3 is a non-error state and only it returns a non-NULL object
2195 * (it returns the retrieved tuple).
2196 *
2197 * Any raised AttributeErrors are masked by clearing the exception and
2198 * returning NULL. If an object other than a tuple comes out of __bases__,
2199 * then again, the return value is NULL. So yes, these two situations
2200 * produce exactly the same results: NULL is returned and no error is set.
2201 *
2202 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002203 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002204 * exception to be propagated along.
2205 *
2206 * Callers are expected to test for PyErr_Occurred() when the return value
2207 * is NULL to decide whether a valid exception should be propagated or not.
2208 * When there's no exception to propagate, it's customary for the caller to
2209 * set a TypeError.
2210 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002211static PyObject *
2212abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002213{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002214 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002218 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 Py_END_ALLOW_RECURSION
2220 if (bases == NULL) {
2221 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2222 PyErr_Clear();
2223 return NULL;
2224 }
2225 if (!PyTuple_Check(bases)) {
2226 Py_DECREF(bases);
2227 return NULL;
2228 }
2229 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002230}
2231
2232
2233static int
2234abstract_issubclass(PyObject *derived, PyObject *cls)
2235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 PyObject *bases = NULL;
2237 Py_ssize_t i, n;
2238 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 while (1) {
2241 if (derived == cls)
2242 return 1;
2243 bases = abstract_get_bases(derived);
2244 if (bases == NULL) {
2245 if (PyErr_Occurred())
2246 return -1;
2247 return 0;
2248 }
2249 n = PyTuple_GET_SIZE(bases);
2250 if (n == 0) {
2251 Py_DECREF(bases);
2252 return 0;
2253 }
2254 /* Avoid recursivity in the single inheritance case */
2255 if (n == 1) {
2256 derived = PyTuple_GET_ITEM(bases, 0);
2257 Py_DECREF(bases);
2258 continue;
2259 }
2260 for (i = 0; i < n; i++) {
2261 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2262 if (r != 0)
2263 break;
2264 }
2265 Py_DECREF(bases);
2266 return r;
2267 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002268}
2269
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002270static int
2271check_class(PyObject *cls, const char *error)
2272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 PyObject *bases = abstract_get_bases(cls);
2274 if (bases == NULL) {
2275 /* Do not mask errors. */
2276 if (!PyErr_Occurred())
2277 PyErr_SetString(PyExc_TypeError, error);
2278 return 0;
2279 }
2280 Py_DECREF(bases);
2281 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002282}
2283
Brett Cannon4f653312004-03-20 22:52:14 +00002284static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002285recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002287 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002289 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 if (PyType_Check(cls)) {
2292 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2293 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002294 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002296 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002297 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002298 else
R. David Murray6bb99892010-11-20 16:33:30 +00002299 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 }
2301 else {
2302 if (c != (PyObject *)(inst->ob_type) &&
2303 PyType_Check(c))
2304 retval = PyType_IsSubtype(
2305 (PyTypeObject *)c,
2306 (PyTypeObject *)cls);
2307 Py_DECREF(c);
2308 }
2309 }
2310 }
2311 else {
2312 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002313 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002314 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002315 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002317 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002318 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002319 else
R. David Murray6bb99892010-11-20 16:33:30 +00002320 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002321 }
2322 else {
2323 retval = abstract_issubclass(icls, cls);
2324 Py_DECREF(icls);
2325 }
2326 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002329}
2330
2331int
Brett Cannon4f653312004-03-20 22:52:14 +00002332PyObject_IsInstance(PyObject *inst, PyObject *cls)
2333{
Benjamin Petersonce798522012-01-22 11:24:29 -05002334 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 /* Quick test for an exact match */
2338 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2339 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002340
Georg Brandl72b8a802014-10-03 09:26:37 +02002341 /* We know what type's __instancecheck__ does. */
2342 if (PyType_CheckExact(cls)) {
2343 return recursive_isinstance(inst, cls);
2344 }
2345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 if (PyTuple_Check(cls)) {
2347 Py_ssize_t i;
2348 Py_ssize_t n;
2349 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2352 return -1;
2353 n = PyTuple_GET_SIZE(cls);
2354 for (i = 0; i < n; ++i) {
2355 PyObject *item = PyTuple_GET_ITEM(cls, i);
2356 r = PyObject_IsInstance(inst, item);
2357 if (r != 0)
2358 /* either found it, or got an error */
2359 break;
2360 }
2361 Py_LeaveRecursiveCall();
2362 return r;
2363 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002364
Benjamin Petersonce798522012-01-22 11:24:29 -05002365 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002366 if (checker != NULL) {
2367 PyObject *res;
2368 int ok = -1;
2369 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2370 Py_DECREF(checker);
2371 return ok;
2372 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002373 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 Py_LeaveRecursiveCall();
2375 Py_DECREF(checker);
2376 if (res != NULL) {
2377 ok = PyObject_IsTrue(res);
2378 Py_DECREF(res);
2379 }
2380 return ok;
2381 }
2382 else if (PyErr_Occurred())
2383 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002384 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002386}
2387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002389recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002391 if (PyType_Check(cls) && PyType_Check(derived)) {
2392 /* Fast path (non-recursive) */
2393 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2394 }
2395 if (!check_class(derived,
2396 "issubclass() arg 1 must be a class"))
2397 return -1;
2398 if (!check_class(cls,
2399 "issubclass() arg 2 must be a class"
2400 " or tuple of classes"))
2401 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002404}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002405
Brett Cannon4f653312004-03-20 22:52:14 +00002406int
2407PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2408{
Benjamin Petersonce798522012-01-22 11:24:29 -05002409 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002411
Georg Brandl72b8a802014-10-03 09:26:37 +02002412 /* We know what type's __subclasscheck__ does. */
2413 if (PyType_CheckExact(cls)) {
2414 /* Quick test for an exact match */
2415 if (derived == cls)
2416 return 1;
2417 return recursive_issubclass(derived, cls);
2418 }
2419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 if (PyTuple_Check(cls)) {
2421 Py_ssize_t i;
2422 Py_ssize_t n;
2423 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2426 return -1;
2427 n = PyTuple_GET_SIZE(cls);
2428 for (i = 0; i < n; ++i) {
2429 PyObject *item = PyTuple_GET_ITEM(cls, i);
2430 r = PyObject_IsSubclass(derived, item);
2431 if (r != 0)
2432 /* either found it, or got an error */
2433 break;
2434 }
2435 Py_LeaveRecursiveCall();
2436 return r;
2437 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002438
Benjamin Petersonce798522012-01-22 11:24:29 -05002439 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 if (checker != NULL) {
2441 PyObject *res;
2442 int ok = -1;
2443 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2444 Py_DECREF(checker);
2445 return ok;
2446 }
Victor Stinnerde4ae3d2016-12-04 22:59:09 +01002447 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 Py_LeaveRecursiveCall();
2449 Py_DECREF(checker);
2450 if (res != NULL) {
2451 ok = PyObject_IsTrue(res);
2452 Py_DECREF(res);
2453 }
2454 return ok;
2455 }
2456 else if (PyErr_Occurred())
2457 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002458 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002460}
2461
2462int
2463_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002466}
2467
2468int
2469_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2470{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002472}
2473
2474
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002475PyObject *
2476PyObject_GetIter(PyObject *o)
2477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 PyTypeObject *t = o->ob_type;
Victor Stinner14e6d092016-12-09 17:08:59 +01002479 getiterfunc f;
2480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002481 f = t->tp_iter;
2482 if (f == NULL) {
2483 if (PySequence_Check(o))
2484 return PySeqIter_New(o);
2485 return type_error("'%.200s' object is not iterable", o);
2486 }
2487 else {
2488 PyObject *res = (*f)(o);
2489 if (res != NULL && !PyIter_Check(res)) {
2490 PyErr_Format(PyExc_TypeError,
2491 "iter() returned non-iterator "
2492 "of type '%.100s'",
2493 res->ob_type->tp_name);
2494 Py_DECREF(res);
2495 res = NULL;
2496 }
2497 return res;
2498 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002499}
2500
Tim Petersf4848da2001-05-05 00:14:56 +00002501/* Return next item.
2502 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2503 * If the iteration terminates normally, return NULL and clear the
2504 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2505 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002507 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002508PyObject *
2509PyIter_Next(PyObject *iter)
2510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 PyObject *result;
2512 result = (*iter->ob_type->tp_iternext)(iter);
2513 if (result == NULL &&
2514 PyErr_Occurred() &&
2515 PyErr_ExceptionMatches(PyExc_StopIteration))
2516 PyErr_Clear();
2517 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002518}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002519
2520
2521/*
2522 * Flatten a sequence of bytes() objects into a C array of
2523 * NULL terminated string pointers with a NULL char* terminating the array.
2524 * (ie: an argv or env list)
2525 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002526 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2527 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002528 */
2529char *const *
2530_PySequence_BytesToCharpArray(PyObject* self)
2531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 char **array;
2533 Py_ssize_t i, argc;
2534 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002535 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 argc = PySequence_Size(self);
2538 if (argc == -1)
2539 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002540
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002541 assert(argc >= 0);
2542
2543 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2544 PyErr_NoMemory();
2545 return NULL;
2546 }
2547
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002548 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if (array == NULL) {
2550 PyErr_NoMemory();
2551 return NULL;
2552 }
2553 for (i = 0; i < argc; ++i) {
2554 char *data;
2555 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002556 if (item == NULL) {
2557 /* NULL terminate before freeing. */
2558 array[i] = NULL;
2559 goto fail;
2560 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 data = PyBytes_AsString(item);
2562 if (data == NULL) {
2563 /* NULL terminate before freeing. */
2564 array[i] = NULL;
2565 goto fail;
2566 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002567 size = PyBytes_GET_SIZE(item) + 1;
2568 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 if (!array[i]) {
2570 PyErr_NoMemory();
2571 goto fail;
2572 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002573 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 Py_DECREF(item);
2575 }
2576 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002579
2580fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 Py_XDECREF(item);
2582 _Py_FreeCharPArray(array);
2583 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002584}
2585
2586
2587/* Free's a NULL terminated char** array of C strings. */
2588void
2589_Py_FreeCharPArray(char *const array[])
2590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 Py_ssize_t i;
2592 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002593 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002595 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002596}