blob: aaa6fc81b6923400e70391b255d805935f8152cc [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;
55 if (m && m->sq_length)
56 return m->sq_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 return PyMapping_Size(o);
Guido van Rossume15dee51995-07-18 14:12:02 +000059}
60
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000061#undef PyObject_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +000062Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000063PyObject_Length(PyObject *o)
64{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 return PyObject_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +000066}
67#define PyObject_Length PyObject_Size
68
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020069int
70_PyObject_HasLen(PyObject *o) {
71 return (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_length) ||
72 (Py_TYPE(o)->tp_as_mapping && Py_TYPE(o)->tp_as_mapping->mp_length);
73}
Raymond Hettinger6b27cda2005-09-24 21:23:05 +000074
Christian Heimes255f53b2007-12-08 15:33:56 +000075/* The length hint function returns a non-negative value from o.__len__()
Armin Ronacher74b38b12012-10-07 10:29:32 +020076 or o.__length_hint__(). If those methods aren't found the defaultvalue is
77 returned. If one of the calls fails with an exception other than TypeError
78 this function returns -1.
Christian Heimes255f53b2007-12-08 15:33:56 +000079*/
80
81Py_ssize_t
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020082PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)
Christian Heimes255f53b2007-12-08 15:33:56 +000083{
Christian Heimesb70e8a12012-10-06 17:16:39 +020084 PyObject *hint, *result;
Christian Heimes6314d162012-10-06 17:13:29 +020085 Py_ssize_t res;
Benjamin Petersonce798522012-01-22 11:24:29 -050086 _Py_IDENTIFIER(__length_hint__);
Serhiy Storchakaf740d462013-10-24 23:19:51 +030087 if (_PyObject_HasLen(o)) {
88 res = PyObject_Length(o);
89 if (res < 0 && PyErr_Occurred()) {
90 if (!PyErr_ExceptionMatches(PyExc_TypeError)) {
91 return -1;
92 }
93 PyErr_Clear();
Armin Ronacheraa9a79d2012-10-06 14:03:24 +020094 }
Serhiy Storchakaf740d462013-10-24 23:19:51 +030095 else {
96 return res;
97 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 }
Christian Heimes6314d162012-10-06 17:13:29 +020099 hint = _PyObject_LookupSpecial(o, &PyId___length_hint__);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200100 if (hint == NULL) {
101 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 return -1;
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200103 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 return defaultvalue;
105 }
Christian Heimesb70e8a12012-10-06 17:16:39 +0200106 result = PyObject_CallFunctionObjArgs(hint, NULL);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200107 Py_DECREF(hint);
108 if (result == NULL) {
109 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
110 PyErr_Clear();
111 return defaultvalue;
112 }
113 return -1;
114 }
115 else if (result == Py_NotImplemented) {
116 Py_DECREF(result);
117 return defaultvalue;
118 }
119 if (!PyLong_Check(result)) {
Armin Ronacher74b38b12012-10-07 10:29:32 +0200120 PyErr_Format(PyExc_TypeError, "__length_hint__ must be an integer, not %.100s",
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200121 Py_TYPE(result)->tp_name);
122 Py_DECREF(result);
123 return -1;
124 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200125 res = PyLong_AsSsize_t(result);
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200126 Py_DECREF(result);
Armin Ronacher74b38b12012-10-07 10:29:32 +0200127 if (res < 0 && PyErr_Occurred()) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200128 return -1;
129 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200130 if (res < 0) {
Armin Ronacheraa9a79d2012-10-06 14:03:24 +0200131 PyErr_Format(PyExc_ValueError, "__length_hint__() should return >= 0");
132 return -1;
133 }
Armin Ronacher74b38b12012-10-07 10:29:32 +0200134 return res;
Raymond Hettinger6b27cda2005-09-24 21:23:05 +0000135}
136
Guido van Rossume15dee51995-07-18 14:12:02 +0000137PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000138PyObject_GetItem(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +0000139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000141
Victor Stinner71aea8e2016-08-19 16:59:55 +0200142 if (o == NULL || key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +0200144 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 m = o->ob_type->tp_as_mapping;
Victor Stinnere20310f2015-11-05 13:56:58 +0100147 if (m && m->mp_subscript) {
148 PyObject *item = m->mp_subscript(o, key);
149 assert((item != NULL) ^ (PyErr_Occurred() != NULL));
150 return item;
151 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 if (o->ob_type->tp_as_sequence) {
154 if (PyIndex_Check(key)) {
155 Py_ssize_t key_value;
156 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
157 if (key_value == -1 && PyErr_Occurred())
158 return NULL;
159 return PySequence_GetItem(o, key_value);
160 }
161 else if (o->ob_type->tp_as_sequence->sq_item)
162 return type_error("sequence index must "
163 "be integer, not '%.200s'", key);
164 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 return type_error("'%.200s' object is not subscriptable", o);
Guido van Rossume15dee51995-07-18 14:12:02 +0000167}
168
169int
Fred Drake79912472000-07-09 04:06:11 +0000170PyObject_SetItem(PyObject *o, PyObject *key, PyObject *value)
Guido van Rossume15dee51995-07-18 14:12:02 +0000171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (o == NULL || key == NULL || value == NULL) {
175 null_error();
176 return -1;
177 }
178 m = o->ob_type->tp_as_mapping;
179 if (m && m->mp_ass_subscript)
180 return m->mp_ass_subscript(o, key, value);
Guido van Rossume15dee51995-07-18 14:12:02 +0000181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 if (o->ob_type->tp_as_sequence) {
183 if (PyIndex_Check(key)) {
184 Py_ssize_t key_value;
185 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
186 if (key_value == -1 && PyErr_Occurred())
187 return -1;
188 return PySequence_SetItem(o, key_value, value);
189 }
190 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
191 type_error("sequence index must be "
192 "integer, not '%.200s'", key);
193 return -1;
194 }
195 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 type_error("'%.200s' object does not support item assignment", o);
198 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +0000199}
200
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000201int
Fred Drake79912472000-07-09 04:06:11 +0000202PyObject_DelItem(PyObject *o, PyObject *key)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000203{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 PyMappingMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 if (o == NULL || key == NULL) {
207 null_error();
208 return -1;
209 }
210 m = o->ob_type->tp_as_mapping;
211 if (m && m->mp_ass_subscript)
212 return m->mp_ass_subscript(o, key, (PyObject*)NULL);
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 if (o->ob_type->tp_as_sequence) {
215 if (PyIndex_Check(key)) {
216 Py_ssize_t key_value;
217 key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
218 if (key_value == -1 && PyErr_Occurred())
219 return -1;
220 return PySequence_DelItem(o, key_value);
221 }
222 else if (o->ob_type->tp_as_sequence->sq_ass_item) {
223 type_error("sequence index must be "
224 "integer, not '%.200s'", key);
225 return -1;
226 }
227 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 type_error("'%.200s' object does not support item deletion", o);
230 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +0000231}
232
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000233int
Serhiy Storchakac6792272013-10-19 21:03:34 +0300234PyObject_DelItemString(PyObject *o, const char *key)
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 PyObject *okey;
237 int ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (o == NULL || key == NULL) {
240 null_error();
241 return -1;
242 }
243 okey = PyUnicode_FromString(key);
244 if (okey == NULL)
245 return -1;
246 ret = PyObject_DelItem(o, okey);
247 Py_DECREF(okey);
248 return ret;
Martin v. Löwisb0d71d02002-01-05 10:50:30 +0000249}
250
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000251/* We release the buffer right after use of this function which could
Guido van Rossum98297ee2007-11-06 21:34:58 +0000252 cause issues later on. Don't use these functions in new code.
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000253 */
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000254int
255PyObject_AsCharBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 const char **buffer,
257 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000258{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200259 return PyObject_AsReadBuffer(obj, (const void **)buffer, buffer_len);
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000260}
Guido van Rossum4c08d552000-03-10 22:55:18 +0000261
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000262int
263PyObject_CheckReadBuffer(PyObject *obj)
264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
266 Py_buffer view;
Jeremy Hylton89c3a222001-11-09 21:59:42 +0000267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 if (pb == NULL ||
269 pb->bf_getbuffer == NULL)
270 return 0;
271 if ((*pb->bf_getbuffer)(obj, &view, PyBUF_SIMPLE) == -1) {
272 PyErr_Clear();
273 return 0;
274 }
275 PyBuffer_Release(&view);
276 return 1;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000277}
278
279int PyObject_AsReadBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 const void **buffer,
281 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000282{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
286 null_error();
287 return -1;
288 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200289 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 return -1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 *buffer = view.buf;
293 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200294 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000296}
297
298int PyObject_AsWriteBuffer(PyObject *obj,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 void **buffer,
300 Py_ssize_t *buffer_len)
Guido van Rossum4c08d552000-03-10 22:55:18 +0000301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 PyBufferProcs *pb;
303 Py_buffer view;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 if (obj == NULL || buffer == NULL || buffer_len == NULL) {
306 null_error();
307 return -1;
308 }
309 pb = obj->ob_type->tp_as_buffer;
310 if (pb == NULL ||
311 pb->bf_getbuffer == NULL ||
312 ((*pb->bf_getbuffer)(obj, &view, PyBUF_WRITABLE) != 0)) {
313 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400314 "expected a writable bytes-like object");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 return -1;
316 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 *buffer = view.buf;
319 *buffer_len = view.len;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200320 PyBuffer_Release(&view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 return 0;
Guido van Rossum4c08d552000-03-10 22:55:18 +0000322}
323
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000324/* Buffer C-API for Python 3.0 */
325
326int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000327PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000328{
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200329 PyBufferProcs *pb = obj->ob_type->tp_as_buffer;
330
331 if (pb == NULL || pb->bf_getbuffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 PyErr_Format(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400333 "a bytes-like object is required, not '%.100s'",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 Py_TYPE(obj)->tp_name);
335 return -1;
336 }
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200337 return (*pb->bf_getbuffer)(obj, view, flags);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000338}
339
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000340static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100341_IsFortranContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000343 Py_ssize_t sd, dim;
344 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000345
Stefan Krah363af442015-02-01 14:53:54 +0100346 /* 1) len = product(shape) * itemsize
347 2) itemsize > 0
348 3) len = 0 <==> exists i: shape[i] = 0 */
349 if (view->len == 0) return 1;
350 if (view->strides == NULL) { /* C-contiguous by definition */
351 /* Trivially F-contiguous */
352 if (view->ndim <= 1) return 1;
353
354 /* ndim > 1 implies shape != NULL */
355 assert(view->shape != NULL);
356
357 /* Effectively 1-d */
358 sd = 0;
359 for (i=0; i<view->ndim; i++) {
360 if (view->shape[i] > 1) sd += 1;
361 }
362 return sd <= 1;
363 }
364
365 /* strides != NULL implies both of these */
366 assert(view->ndim > 0);
367 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 for (i=0; i<view->ndim; i++) {
371 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100372 if (dim > 1 && view->strides[i] != sd) {
373 return 0;
374 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000375 sd *= dim;
376 }
377 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000378}
379
380static int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100381_IsCContiguous(const Py_buffer *view)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 Py_ssize_t sd, dim;
384 int i;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000385
Stefan Krah363af442015-02-01 14:53:54 +0100386 /* 1) len = product(shape) * itemsize
387 2) itemsize > 0
388 3) len = 0 <==> exists i: shape[i] = 0 */
389 if (view->len == 0) return 1;
390 if (view->strides == NULL) return 1; /* C-contiguous by definition */
391
392 /* strides != NULL implies both of these */
393 assert(view->ndim > 0);
394 assert(view->shape != NULL);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 sd = view->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 for (i=view->ndim-1; i>=0; i--) {
398 dim = view->shape[i];
Stefan Krah363af442015-02-01 14:53:54 +0100399 if (dim > 1 && view->strides[i] != sd) {
400 return 0;
401 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 sd *= dim;
403 }
404 return 1;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000405}
406
407int
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100408PyBuffer_IsContiguous(const Py_buffer *view, char order)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000409{
410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000411 if (view->suboffsets != NULL) return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000412
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100413 if (order == 'C')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 return _IsCContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100415 else if (order == 'F')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return _IsFortranContiguous(view);
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100417 else if (order == 'A')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 return (_IsCContiguous(view) || _IsFortranContiguous(view));
419 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000420}
421
422
Guido van Rossum98297ee2007-11-06 21:34:58 +0000423void*
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000424PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 char* pointer;
427 int i;
428 pointer = (char *)view->buf;
429 for (i = 0; i < view->ndim; i++) {
430 pointer += view->strides[i]*indices[i];
431 if ((view->suboffsets != NULL) && (view->suboffsets[i] >= 0)) {
432 pointer = *((char**)pointer) + view->suboffsets[i];
433 }
434 }
435 return (void*)pointer;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000436}
437
438
Guido van Rossum98297ee2007-11-06 21:34:58 +0000439void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000440_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 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 int k;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 for (k=0; k<nd; k++) {
445 if (index[k] < shape[k]-1) {
446 index[k]++;
447 break;
448 }
449 else {
450 index[k] = 0;
451 }
452 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000453}
454
Guido van Rossum98297ee2007-11-06 21:34:58 +0000455void
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000456_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 +0000457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 int k;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 for (k=nd-1; k>=0; k--) {
461 if (index[k] < shape[k]-1) {
462 index[k]++;
463 break;
464 }
465 else {
466 index[k] = 0;
467 }
468 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000469}
470
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000471int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +0000472PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 int k;
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000475 void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 Py_ssize_t *indices, elements;
477 char *src, *ptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 if (len > view->len) {
480 len = view->len;
481 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 if (PyBuffer_IsContiguous(view, fort)) {
484 /* simplest copy is all that is needed */
485 memcpy(view->buf, buf, len);
486 return 0;
487 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 /* Otherwise a more elaborate scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000490
Stefan Krah7213fcc2015-02-01 16:19:23 +0100491 /* view->ndim <= 64 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim));
493 if (indices == NULL) {
494 PyErr_NoMemory();
495 return -1;
496 }
497 for (k=0; k<view->ndim;k++) {
498 indices[k] = 0;
499 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (fort == 'F') {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000502 addone = _Py_add_one_to_index_F;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 }
504 else {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000505 addone = _Py_add_one_to_index_C;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 }
507 src = buf;
508 /* XXX : This is not going to be the fastest code in the world
509 several optimizations are possible.
510 */
511 elements = len / view->itemsize;
512 while (elements--) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 ptr = PyBuffer_GetPointer(view, indices);
514 memcpy(ptr, src, view->itemsize);
515 src += view->itemsize;
Stefan Krah7213fcc2015-02-01 16:19:23 +0100516 addone(view->ndim, indices, view->shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 PyMem_Free(indices);
520 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000521}
522
Guido van Rossum98297ee2007-11-06 21:34:58 +0000523int PyObject_CopyData(PyObject *dest, PyObject *src)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 Py_buffer view_dest, view_src;
526 int k;
527 Py_ssize_t *indices, elements;
528 char *dptr, *sptr;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 if (!PyObject_CheckBuffer(dest) ||
531 !PyObject_CheckBuffer(src)) {
532 PyErr_SetString(PyExc_TypeError,
R David Murray861470c2014-10-05 11:47:01 -0400533 "both destination and source must be "\
534 "bytes-like objects");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 return -1;
536 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (PyObject_GetBuffer(dest, &view_dest, PyBUF_FULL) != 0) return -1;
539 if (PyObject_GetBuffer(src, &view_src, PyBUF_FULL_RO) != 0) {
540 PyBuffer_Release(&view_dest);
541 return -1;
542 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 if (view_dest.len < view_src.len) {
545 PyErr_SetString(PyExc_BufferError,
546 "destination is too small to receive data from source");
547 PyBuffer_Release(&view_dest);
548 PyBuffer_Release(&view_src);
549 return -1;
550 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 if ((PyBuffer_IsContiguous(&view_dest, 'C') &&
553 PyBuffer_IsContiguous(&view_src, 'C')) ||
554 (PyBuffer_IsContiguous(&view_dest, 'F') &&
555 PyBuffer_IsContiguous(&view_src, 'F'))) {
556 /* simplest copy is all that is needed */
557 memcpy(view_dest.buf, view_src.buf, view_src.len);
558 PyBuffer_Release(&view_dest);
559 PyBuffer_Release(&view_src);
560 return 0;
561 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 /* Otherwise a more elaborate copy scheme is needed */
Guido van Rossum98297ee2007-11-06 21:34:58 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 /* XXX(nnorwitz): need to check for overflow! */
566 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view_src.ndim);
567 if (indices == NULL) {
568 PyErr_NoMemory();
569 PyBuffer_Release(&view_dest);
570 PyBuffer_Release(&view_src);
571 return -1;
572 }
573 for (k=0; k<view_src.ndim;k++) {
574 indices[k] = 0;
575 }
576 elements = 1;
577 for (k=0; k<view_src.ndim; k++) {
578 /* XXX(nnorwitz): can this overflow? */
579 elements *= view_src.shape[k];
580 }
581 while (elements--) {
Antoine Pitrouf68c2a72010-09-01 12:58:21 +0000582 _Py_add_one_to_index_C(view_src.ndim, indices, view_src.shape);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 dptr = PyBuffer_GetPointer(&view_dest, indices);
584 sptr = PyBuffer_GetPointer(&view_src, indices);
585 memcpy(dptr, sptr, view_src.itemsize);
586 }
587 PyMem_Free(indices);
588 PyBuffer_Release(&view_dest);
589 PyBuffer_Release(&view_src);
590 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000591}
592
593void
594PyBuffer_FillContiguousStrides(int nd, Py_ssize_t *shape,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 Py_ssize_t *strides, int itemsize,
596 char fort)
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 int k;
599 Py_ssize_t sd;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 sd = itemsize;
602 if (fort == 'F') {
603 for (k=0; k<nd; k++) {
604 strides[k] = sd;
605 sd *= shape[k];
606 }
607 }
608 else {
609 for (k=nd-1; k>=0; k--) {
610 strides[k] = sd;
611 sd *= shape[k];
612 }
613 }
614 return;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000615}
616
617int
Martin v. Löwis423be952008-08-13 15:53:07 +0000618PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len,
Stefan Krah4e141742012-03-06 15:27:31 +0100619 int readonly, int flags)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000620{
Stefan Krah5178d912015-02-03 16:57:21 +0100621 if (view == NULL) {
622 PyErr_SetString(PyExc_BufferError,
623 "PyBuffer_FillInfo: view==NULL argument is obsolete");
624 return -1;
625 }
626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
628 (readonly == 1)) {
629 PyErr_SetString(PyExc_BufferError,
630 "Object is not writable.");
631 return -1;
632 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 view->obj = obj;
635 if (obj)
636 Py_INCREF(obj);
637 view->buf = buf;
638 view->len = len;
639 view->readonly = readonly;
640 view->itemsize = 1;
641 view->format = NULL;
642 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
643 view->format = "B";
644 view->ndim = 1;
645 view->shape = NULL;
646 if ((flags & PyBUF_ND) == PyBUF_ND)
647 view->shape = &(view->len);
648 view->strides = NULL;
649 if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
650 view->strides = &(view->itemsize);
651 view->suboffsets = NULL;
652 view->internal = NULL;
653 return 0;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000654}
655
Martin v. Löwis423be952008-08-13 15:53:07 +0000656void
657PyBuffer_Release(Py_buffer *view)
658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 PyObject *obj = view->obj;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200660 PyBufferProcs *pb;
661 if (obj == NULL)
662 return;
663 pb = Py_TYPE(obj)->tp_as_buffer;
664 if (pb && pb->bf_releasebuffer)
665 pb->bf_releasebuffer(obj, view);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 view->obj = NULL;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200667 Py_DECREF(obj);
Martin v. Löwis423be952008-08-13 15:53:07 +0000668}
669
Eric Smith8fd3eba2008-02-17 19:48:00 +0000670PyObject *
671PyObject_Format(PyObject *obj, PyObject *format_spec)
672{
Eric Smith8fd3eba2008-02-17 19:48:00 +0000673 PyObject *meth;
674 PyObject *empty = NULL;
675 PyObject *result = NULL;
Benjamin Petersonce798522012-01-22 11:24:29 -0500676 _Py_IDENTIFIER(__format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000677
678 /* If no format_spec is provided, use an empty string */
679 if (format_spec == NULL) {
Victor Stinner9d3b93b2011-11-22 02:27:30 +0100680 empty = PyUnicode_New(0, 0);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000681 format_spec = empty;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000682 }
683
Eric Smith8fd3eba2008-02-17 19:48:00 +0000684 /* Find the (unbound!) __format__ method (a borrowed reference) */
Benjamin Petersonce798522012-01-22 11:24:29 -0500685 meth = _PyObject_LookupSpecial(obj, &PyId___format__);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000686 if (meth == NULL) {
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000687 if (!PyErr_Occurred())
688 PyErr_Format(PyExc_TypeError,
689 "Type %.100s doesn't define __format__",
690 Py_TYPE(obj)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000692 }
693
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000694 /* And call it. */
695 result = PyObject_CallFunctionObjArgs(meth, format_spec, NULL);
Benjamin Peterson6f889ad32010-06-05 02:11:45 +0000696 Py_DECREF(meth);
Eric Smith8fd3eba2008-02-17 19:48:00 +0000697
698 if (result && !PyUnicode_Check(result)) {
Ethan Furmanb95b5612015-01-23 20:05:18 -0800699 PyErr_Format(PyExc_TypeError,
700 "__format__ must return a str, not %.200s",
701 Py_TYPE(result)->tp_name);
Benjamin Petersonda2cf042010-06-05 00:45:37 +0000702 Py_DECREF(result);
703 result = NULL;
704 goto done;
Eric Smith8fd3eba2008-02-17 19:48:00 +0000705 }
706
707done:
708 Py_XDECREF(empty);
709 return result;
710}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000711/* Operations on numbers */
712
713int
Fred Drake79912472000-07-09 04:06:11 +0000714PyNumber_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +0000715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 return o && o->ob_type->tp_as_number &&
717 (o->ob_type->tp_as_number->nb_int ||
718 o->ob_type->tp_as_number->nb_float);
Guido van Rossume15dee51995-07-18 14:12:02 +0000719}
720
Guido van Rossumcea1c8c1998-05-22 00:47:05 +0000721/* Binary operators */
Guido van Rossume15dee51995-07-18 14:12:02 +0000722
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000723#define NB_SLOT(x) offsetof(PyNumberMethods, x)
724#define NB_BINOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 (*(binaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000726#define NB_TERNOP(nb_methods, slot) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 (*(ternaryfunc*)(& ((char*)nb_methods)[slot]))
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000728
729/*
730 Calling scheme used for binary operations:
731
Neal Norwitz4886cc32006-08-21 17:06:07 +0000732 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 w.op(v,w)[*], v.op(v,w), w.op(v,w)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000734
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000735 [*] only when v->ob_type != w->ob_type && w->ob_type is a subclass of
736 v->ob_type
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000737 */
738
739static PyObject *
740binary_op1(PyObject *v, PyObject *w, const int op_slot)
Guido van Rossume15dee51995-07-18 14:12:02 +0000741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 PyObject *x;
743 binaryfunc slotv = NULL;
744 binaryfunc slotw = NULL;
Guido van Rossum4bb1e362001-09-28 23:49:48 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 if (v->ob_type->tp_as_number != NULL)
747 slotv = NB_BINOP(v->ob_type->tp_as_number, op_slot);
748 if (w->ob_type != v->ob_type &&
749 w->ob_type->tp_as_number != NULL) {
750 slotw = NB_BINOP(w->ob_type->tp_as_number, op_slot);
751 if (slotw == slotv)
752 slotw = NULL;
753 }
754 if (slotv) {
755 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
756 x = slotw(v, w);
757 if (x != Py_NotImplemented)
758 return x;
759 Py_DECREF(x); /* can't do it */
760 slotw = NULL;
761 }
762 x = slotv(v, w);
763 if (x != Py_NotImplemented)
764 return x;
765 Py_DECREF(x); /* can't do it */
766 }
767 if (slotw) {
768 x = slotw(v, w);
769 if (x != Py_NotImplemented)
770 return x;
771 Py_DECREF(x); /* can't do it */
772 }
Brian Curtindfc80e32011-08-10 20:28:54 -0500773 Py_RETURN_NOTIMPLEMENTED;
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000774}
Guido van Rossum77660912002-04-16 16:32:50 +0000775
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000776static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000777binop_type_error(PyObject *v, PyObject *w, const char *op_name)
778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 PyErr_Format(PyExc_TypeError,
780 "unsupported operand type(s) for %.100s: "
781 "'%.100s' and '%.100s'",
782 op_name,
783 v->ob_type->tp_name,
784 w->ob_type->tp_name);
785 return NULL;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000786}
787
788static PyObject *
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000789binary_op(PyObject *v, PyObject *w, const int op_slot, const char *op_name)
790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 PyObject *result = binary_op1(v, w, op_slot);
792 if (result == Py_NotImplemented) {
793 Py_DECREF(result);
794 return binop_type_error(v, w, op_name);
795 }
796 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000797}
798
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000799
800/*
801 Calling scheme used for ternary operations:
802
Neal Norwitz4886cc32006-08-21 17:06:07 +0000803 Order operations are tried until either a valid result or error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 v.op(v,w,z), w.op(v,w,z), z.op(v,w,z)
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000805 */
806
807static PyObject *
808ternary_op(PyObject *v,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 PyObject *w,
810 PyObject *z,
811 const int op_slot,
812 const char *op_name)
Guido van Rossume15dee51995-07-18 14:12:02 +0000813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 PyNumberMethods *mv, *mw, *mz;
815 PyObject *x = NULL;
816 ternaryfunc slotv = NULL;
817 ternaryfunc slotw = NULL;
818 ternaryfunc slotz = NULL;
Guido van Rossum77660912002-04-16 16:32:50 +0000819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 mv = v->ob_type->tp_as_number;
821 mw = w->ob_type->tp_as_number;
822 if (mv != NULL)
823 slotv = NB_TERNOP(mv, op_slot);
824 if (w->ob_type != v->ob_type &&
825 mw != NULL) {
826 slotw = NB_TERNOP(mw, op_slot);
827 if (slotw == slotv)
828 slotw = NULL;
829 }
830 if (slotv) {
831 if (slotw && PyType_IsSubtype(w->ob_type, v->ob_type)) {
832 x = slotw(v, w, z);
833 if (x != Py_NotImplemented)
834 return x;
835 Py_DECREF(x); /* can't do it */
836 slotw = NULL;
837 }
838 x = slotv(v, w, z);
839 if (x != Py_NotImplemented)
840 return x;
841 Py_DECREF(x); /* can't do it */
842 }
843 if (slotw) {
844 x = slotw(v, w, z);
845 if (x != Py_NotImplemented)
846 return x;
847 Py_DECREF(x); /* can't do it */
848 }
849 mz = z->ob_type->tp_as_number;
850 if (mz != NULL) {
851 slotz = NB_TERNOP(mz, op_slot);
852 if (slotz == slotv || slotz == slotw)
853 slotz = NULL;
854 if (slotz) {
855 x = slotz(v, w, z);
856 if (x != Py_NotImplemented)
857 return x;
858 Py_DECREF(x); /* can't do it */
859 }
860 }
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 if (z == Py_None)
863 PyErr_Format(
864 PyExc_TypeError,
865 "unsupported operand type(s) for ** or pow(): "
866 "'%.100s' and '%.100s'",
867 v->ob_type->tp_name,
868 w->ob_type->tp_name);
869 else
870 PyErr_Format(
871 PyExc_TypeError,
872 "unsupported operand type(s) for pow(): "
873 "'%.100s', '%.100s', '%.100s'",
874 v->ob_type->tp_name,
875 w->ob_type->tp_name,
876 z->ob_type->tp_name);
877 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +0000878}
879
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000880#define BINARY_FUNC(func, op, op_name) \
881 PyObject * \
882 func(PyObject *v, PyObject *w) { \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 return binary_op(v, w, NB_SLOT(op), op_name); \
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000884 }
Guido van Rossume15dee51995-07-18 14:12:02 +0000885
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000886BINARY_FUNC(PyNumber_Or, nb_or, "|")
887BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
888BINARY_FUNC(PyNumber_And, nb_and, "&")
889BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
890BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
891BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000892BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
Guido van Rossume15dee51995-07-18 14:12:02 +0000893
894PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000895PyNumber_Add(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyObject *result = binary_op1(v, w, NB_SLOT(nb_add));
898 if (result == Py_NotImplemented) {
899 PySequenceMethods *m = v->ob_type->tp_as_sequence;
900 Py_DECREF(result);
901 if (m && m->sq_concat) {
902 return (*m->sq_concat)(v, w);
903 }
904 result = binop_type_error(v, w, "+");
905 }
906 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +0000907}
908
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000909static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000910sequence_repeat(ssizeargfunc repeatfunc, PyObject *seq, PyObject *n)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 Py_ssize_t count;
913 if (PyIndex_Check(n)) {
914 count = PyNumber_AsSsize_t(n, PyExc_OverflowError);
915 if (count == -1 && PyErr_Occurred())
916 return NULL;
917 }
918 else {
919 return type_error("can't multiply sequence by "
920 "non-int of type '%.200s'", n);
921 }
922 return (*repeatfunc)(seq, count);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000923}
924
925PyObject *
926PyNumber_Multiply(PyObject *v, PyObject *w)
927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 PyObject *result = binary_op1(v, w, NB_SLOT(nb_multiply));
929 if (result == Py_NotImplemented) {
930 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
931 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
932 Py_DECREF(result);
933 if (mv && mv->sq_repeat) {
934 return sequence_repeat(mv->sq_repeat, v, w);
935 }
936 else if (mw && mw->sq_repeat) {
937 return sequence_repeat(mw->sq_repeat, w, v);
938 }
939 result = binop_type_error(v, w, "*");
940 }
941 return result;
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000942}
943
Guido van Rossume15dee51995-07-18 14:12:02 +0000944PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -0400945PyNumber_MatrixMultiply(PyObject *v, PyObject *w)
946{
947 return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@");
948}
949
950PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +0000951PyNumber_FloorDivide(PyObject *v, PyObject *w)
952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 return binary_op(v, w, NB_SLOT(nb_floor_divide), "//");
Guido van Rossum4668b002001-08-08 05:00:18 +0000954}
955
956PyObject *
957PyNumber_TrueDivide(PyObject *v, PyObject *w)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 return binary_op(v, w, NB_SLOT(nb_true_divide), "/");
Guido van Rossum4668b002001-08-08 05:00:18 +0000960}
961
962PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000963PyNumber_Remainder(PyObject *v, PyObject *w)
Guido van Rossume15dee51995-07-18 14:12:02 +0000964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 return binary_op(v, w, NB_SLOT(nb_remainder), "%");
Guido van Rossume15dee51995-07-18 14:12:02 +0000966}
967
968PyObject *
Fred Drake79912472000-07-09 04:06:11 +0000969PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
Guido van Rossume15dee51995-07-18 14:12:02 +0000970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
Guido van Rossume15dee51995-07-18 14:12:02 +0000972}
973
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000974/* Binary in-place operators */
975
976/* The in-place operators are defined to fall back to the 'normal',
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000977 non in-place operations, if the in-place methods are not in place.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000978
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000979 - If the left hand object has the appropriate struct members, and
980 they are filled, call the appropriate function and return the
981 result. No coercion is done on the arguments; the left-hand object
982 is the one the operation is performed on, and it's up to the
983 function to deal with the right-hand object.
Guido van Rossum77660912002-04-16 16:32:50 +0000984
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000985 - Otherwise, in-place modification is not supported. Handle it exactly as
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000986 a non in-place operation of the same kind.
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000987
988 */
989
Neil Schemenauer5a1f0152001-01-04 01:39:06 +0000990static PyObject *
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +0000991binary_iop1(PyObject *v, PyObject *w, const int iop_slot, const int op_slot)
Thomas Wouterse289e0b2000-08-24 20:08:19 +0000992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 PyNumberMethods *mv = v->ob_type->tp_as_number;
994 if (mv != NULL) {
995 binaryfunc slot = NB_BINOP(mv, iop_slot);
996 if (slot) {
997 PyObject *x = (slot)(v, w);
998 if (x != Py_NotImplemented) {
999 return x;
1000 }
1001 Py_DECREF(x);
1002 }
1003 }
1004 return binary_op1(v, w, op_slot);
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001005}
1006
1007static PyObject *
1008binary_iop(PyObject *v, PyObject *w, const int iop_slot, const int op_slot,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 const char *op_name)
Neil Schemenauerd4b0fea2002-12-30 20:18:15 +00001010{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 PyObject *result = binary_iop1(v, w, iop_slot, op_slot);
1012 if (result == Py_NotImplemented) {
1013 Py_DECREF(result);
1014 return binop_type_error(v, w, op_name);
1015 }
1016 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001017}
1018
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001019#define INPLACE_BINOP(func, iop, op, op_name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 PyObject * \
1021 func(PyObject *v, PyObject *w) { \
1022 return binary_iop(v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \
1023 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001024
Neil Schemenauer5a1f0152001-01-04 01:39:06 +00001025INPLACE_BINOP(PyNumber_InPlaceOr, nb_inplace_or, nb_or, "|=")
1026INPLACE_BINOP(PyNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=")
1027INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=")
1028INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=")
1029INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=")
1030INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=")
Benjamin Petersond51374e2014-04-09 23:55:56 -04001031INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=")
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001032
1033PyObject *
Guido van Rossum4668b002001-08-08 05:00:18 +00001034PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w)
1035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide),
1037 NB_SLOT(nb_floor_divide), "//=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001038}
1039
1040PyObject *
1041PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w)
1042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide),
1044 NB_SLOT(nb_true_divide), "/=");
Guido van Rossum4668b002001-08-08 05:00:18 +00001045}
1046
1047PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001048PyNumber_InPlaceAdd(PyObject *v, PyObject *w)
1049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_add),
1051 NB_SLOT(nb_add));
1052 if (result == Py_NotImplemented) {
1053 PySequenceMethods *m = v->ob_type->tp_as_sequence;
1054 Py_DECREF(result);
1055 if (m != NULL) {
1056 binaryfunc f = NULL;
1057 f = m->sq_inplace_concat;
1058 if (f == NULL)
1059 f = m->sq_concat;
1060 if (f != NULL)
1061 return (*f)(v, w);
1062 }
1063 result = binop_type_error(v, w, "+=");
1064 }
1065 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001066}
1067
1068PyObject *
1069PyNumber_InPlaceMultiply(PyObject *v, PyObject *w)
1070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 PyObject *result = binary_iop1(v, w, NB_SLOT(nb_inplace_multiply),
1072 NB_SLOT(nb_multiply));
1073 if (result == Py_NotImplemented) {
1074 ssizeargfunc f = NULL;
1075 PySequenceMethods *mv = v->ob_type->tp_as_sequence;
1076 PySequenceMethods *mw = w->ob_type->tp_as_sequence;
1077 Py_DECREF(result);
1078 if (mv != NULL) {
1079 f = mv->sq_inplace_repeat;
1080 if (f == NULL)
1081 f = mv->sq_repeat;
1082 if (f != NULL)
1083 return sequence_repeat(f, v, w);
1084 }
1085 else if (mw != NULL) {
1086 /* Note that the right hand operand should not be
1087 * mutated in this case so sq_inplace_repeat is not
1088 * used. */
1089 if (mw->sq_repeat)
1090 return sequence_repeat(mw->sq_repeat, w, v);
1091 }
1092 result = binop_type_error(v, w, "*=");
1093 }
1094 return result;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001095}
1096
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001097PyObject *
Benjamin Petersond51374e2014-04-09 23:55:56 -04001098PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w)
1099{
1100 return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply),
1101 NB_SLOT(nb_matrix_multiply), "@=");
1102}
1103
1104PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001105PyNumber_InPlaceRemainder(PyObject *v, PyObject *w)
1106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 return binary_iop(v, w, NB_SLOT(nb_inplace_remainder),
1108 NB_SLOT(nb_remainder), "%=");
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001109}
1110
1111PyObject *
1112PyNumber_InPlacePower(PyObject *v, PyObject *w, PyObject *z)
1113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 if (v->ob_type->tp_as_number &&
1115 v->ob_type->tp_as_number->nb_inplace_power != NULL) {
1116 return ternary_op(v, w, z, NB_SLOT(nb_inplace_power), "**=");
1117 }
1118 else {
1119 return ternary_op(v, w, z, NB_SLOT(nb_power), "**=");
1120 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001121}
1122
1123
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001124/* Unary operators and functions */
Guido van Rossume15dee51995-07-18 14:12:02 +00001125
1126PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001127PyNumber_Negative(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001130
Victor Stinner71aea8e2016-08-19 16:59:55 +02001131 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001133 }
1134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 m = o->ob_type->tp_as_number;
1136 if (m && m->nb_negative)
1137 return (*m->nb_negative)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 return type_error("bad operand type for unary -: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001140}
1141
1142PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001143PyNumber_Positive(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001146
Victor Stinner71aea8e2016-08-19 16:59:55 +02001147 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001149 }
1150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 m = o->ob_type->tp_as_number;
1152 if (m && m->nb_positive)
1153 return (*m->nb_positive)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 return type_error("bad operand type for unary +: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001156}
1157
1158PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001159PyNumber_Invert(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001161 PyNumberMethods *m;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001162
Victor Stinner71aea8e2016-08-19 16:59:55 +02001163 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001165 }
1166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 m = o->ob_type->tp_as_number;
1168 if (m && m->nb_invert)
1169 return (*m->nb_invert)(o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 return type_error("bad operand type for unary ~: '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001172}
1173
1174PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001175PyNumber_Absolute(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001178
Victor Stinner71aea8e2016-08-19 16:59:55 +02001179 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001181 }
1182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 m = o->ob_type->tp_as_number;
1184 if (m && m->nb_absolute)
1185 return m->nb_absolute(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 return type_error("bad operand type for abs(): '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001188}
1189
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001190/* Return a Python int from the object item.
Serhiy Storchaka95949422013-08-27 19:40:23 +03001191 Raise TypeError if the result is not an int
Guido van Rossum98297ee2007-11-06 21:34:58 +00001192 or if the object cannot be interpreted as an index.
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001193*/
1194PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001195PyNumber_Index(PyObject *item)
1196{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 PyObject *result = NULL;
Victor Stinner71aea8e2016-08-19 16:59:55 +02001198 if (item == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001199 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001200 }
1201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 if (PyLong_Check(item)) {
1203 Py_INCREF(item);
1204 return item;
1205 }
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001206 if (!PyIndex_Check(item)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 PyErr_Format(PyExc_TypeError,
1208 "'%.200s' object cannot be interpreted "
1209 "as an integer", item->ob_type->tp_name);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001210 return NULL;
1211 }
1212 result = item->ob_type->tp_as_number->nb_index(item);
1213 if (!result || PyLong_CheckExact(result))
1214 return result;
1215 if (!PyLong_Check(result)) {
1216 PyErr_Format(PyExc_TypeError,
1217 "__index__ returned non-int (type %.200s)",
1218 result->ob_type->tp_name);
1219 Py_DECREF(result);
1220 return NULL;
1221 }
1222 /* Issue #17576: warn if 'result' not of exact type int. */
1223 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1224 "__index__ returned non-int (type %.200s). "
1225 "The ability to return an instance of a strict subclass of int "
1226 "is deprecated, and may be removed in a future version of Python.",
1227 result->ob_type->tp_name)) {
1228 Py_DECREF(result);
1229 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 }
1231 return result;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001232}
1233
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001234/* Return an error on Overflow only if err is not NULL*/
1235
1236Py_ssize_t
1237PyNumber_AsSsize_t(PyObject *item, PyObject *err)
1238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 Py_ssize_t result;
1240 PyObject *runerr;
1241 PyObject *value = PyNumber_Index(item);
1242 if (value == NULL)
1243 return -1;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 /* We're done if PyLong_AsSsize_t() returns without error. */
1246 result = PyLong_AsSsize_t(value);
1247 if (result != -1 || !(runerr = PyErr_Occurred()))
1248 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 /* Error handling code -- only manage OverflowError differently */
1251 if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))
1252 goto finish;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 PyErr_Clear();
1255 /* If no error-handling desired then the default clipping
1256 is sufficient.
1257 */
1258 if (!err) {
1259 assert(PyLong_Check(value));
1260 /* Whether or not it is less than or equal to
1261 zero is determined by the sign of ob_size
1262 */
1263 if (_PyLong_Sign(value) < 0)
1264 result = PY_SSIZE_T_MIN;
1265 else
1266 result = PY_SSIZE_T_MAX;
1267 }
1268 else {
1269 /* Otherwise replace the error with caller's error object. */
1270 PyErr_Format(err,
1271 "cannot fit '%.200s' into an index-sized integer",
1272 item->ob_type->tp_name);
1273 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001274
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001275 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 Py_DECREF(value);
1277 return result;
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001278}
1279
1280
Guido van Rossume15dee51995-07-18 14:12:02 +00001281PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001282PyNumber_Long(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 PyNumberMethods *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 PyObject *trunc_func;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001286 Py_buffer view;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04001287 _Py_IDENTIFIER(__trunc__);
Christian Heimes15ebc882008-02-04 18:48:49 +00001288
Victor Stinner71aea8e2016-08-19 16:59:55 +02001289 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001291 }
1292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 if (PyLong_CheckExact(o)) {
1294 Py_INCREF(o);
1295 return o;
1296 }
1297 m = o->ob_type->tp_as_number;
1298 if (m && m->nb_int) { /* This should include subclasses of int */
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001299 return (PyObject *)_PyLong_FromNbInt(o);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001301 trunc_func = _PyObject_LookupSpecial(o, &PyId___trunc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 if (trunc_func) {
1303 PyObject *truncated = PyEval_CallObject(trunc_func, NULL);
1304 PyObject *int_instance;
1305 Py_DECREF(trunc_func);
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001306 if (truncated == NULL || PyLong_Check(truncated))
1307 return truncated;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 /* __trunc__ is specified to return an Integral type,
Martin Panter7462b6492015-11-02 03:37:02 +00001309 but int() needs to return an int. */
Serhiy Storchaka31a65542013-12-11 21:07:54 +02001310 m = truncated->ob_type->tp_as_number;
1311 if (m == NULL || m->nb_int == NULL) {
1312 PyErr_Format(
1313 PyExc_TypeError,
1314 "__trunc__ returned non-Integral (type %.200s)",
1315 truncated->ob_type->tp_name);
1316 Py_DECREF(truncated);
1317 return NULL;
1318 }
1319 int_instance = (PyObject *)_PyLong_FromNbInt(truncated);
1320 Py_DECREF(truncated);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 return int_instance;
1322 }
Benjamin Peterson1b1a8e72012-03-20 23:48:11 -04001323 if (PyErr_Occurred())
1324 return NULL;
Christian Heimes15ebc882008-02-04 18:48:49 +00001325
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001326 if (PyUnicode_Check(o))
1327 /* The below check is done in PyLong_FromUnicode(). */
1328 return PyLong_FromUnicodeObject(o, 10);
1329
Martin Pantereeb896c2015-11-07 02:32:21 +00001330 if (PyBytes_Check(o))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 /* need to do extra error checking that PyLong_FromString()
Serhiy Storchakaf6d0aee2013-08-03 20:55:06 +03001332 * doesn't do. In particular int('9\x005') must raise an
1333 * exception, not truncate at the null.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 */
Martin Pantereeb896c2015-11-07 02:32:21 +00001335 return _PyLong_FromBytes(PyBytes_AS_STRING(o),
1336 PyBytes_GET_SIZE(o), 10);
1337
1338 if (PyByteArray_Check(o))
1339 return _PyLong_FromBytes(PyByteArray_AS_STRING(o),
1340 PyByteArray_GET_SIZE(o), 10);
1341
1342 if (PyObject_GetBuffer(o, &view, PyBUF_SIMPLE) == 0) {
1343 PyObject *result, *bytes;
1344
1345 /* Copy to NUL-terminated buffer. */
1346 bytes = PyBytes_FromStringAndSize((const char *)view.buf, view.len);
1347 if (bytes == NULL) {
1348 PyBuffer_Release(&view);
1349 return NULL;
1350 }
1351 result = _PyLong_FromBytes(PyBytes_AS_STRING(bytes),
1352 PyBytes_GET_SIZE(bytes), 10);
1353 Py_DECREF(bytes);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001354 PyBuffer_Release(&view);
1355 return result;
1356 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001357
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +02001358 return type_error("int() argument must be a string, a bytes-like object "
1359 "or a number, not '%.200s'", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001360}
1361
1362PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001363PyNumber_Float(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 PyNumberMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001366
Victor Stinner71aea8e2016-08-19 16:59:55 +02001367 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001369 }
1370
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001371 if (PyFloat_CheckExact(o)) {
1372 Py_INCREF(o);
1373 return o;
1374 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 m = o->ob_type->tp_as_number;
1376 if (m && m->nb_float) { /* This should include subclasses of float */
1377 PyObject *res = m->nb_float(o);
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001378 double val;
1379 if (!res || PyFloat_CheckExact(res)) {
1380 return res;
1381 }
1382 if (!PyFloat_Check(res)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 PyErr_Format(PyExc_TypeError,
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001384 "%.50s.__float__ returned non-float (type %.50s)",
1385 o->ob_type->tp_name, res->ob_type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 Py_DECREF(res);
1387 return NULL;
1388 }
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001389 /* Issue #26983: warn if 'res' not of exact type float. */
1390 if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
1391 "%.50s.__float__ returned non-float (type %.50s). "
1392 "The ability to return an instance of a strict subclass of float "
1393 "is deprecated, and may be removed in a future version of Python.",
1394 o->ob_type->tp_name, res->ob_type->tp_name)) {
1395 Py_DECREF(res);
1396 return NULL;
1397 }
1398 val = PyFloat_AS_DOUBLE(res);
1399 Py_DECREF(res);
1400 return PyFloat_FromDouble(val);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 }
1402 if (PyFloat_Check(o)) { /* A float subclass with nb_float == NULL */
Serhiy Storchaka16931c32016-06-03 21:42:55 +03001403 return PyFloat_FromDouble(PyFloat_AS_DOUBLE(o));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 }
1405 return PyFloat_FromString(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001406}
1407
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001408
1409PyObject *
1410PyNumber_ToBase(PyObject *n, int base)
1411{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 PyObject *res = NULL;
1413 PyObject *index = PyNumber_Index(n);
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (!index)
1416 return NULL;
1417 if (PyLong_Check(index))
1418 res = _PyLong_Format(index, base);
1419 else
1420 /* It should not be possible to get here, as
1421 PyNumber_Index already has a check for the same
1422 condition */
Serhiy Storchaka95949422013-08-27 19:40:23 +03001423 PyErr_SetString(PyExc_ValueError, "PyNumber_ToBase: index not int");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 Py_DECREF(index);
1425 return res;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001426}
1427
1428
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001429/* Operations on sequences */
Guido van Rossume15dee51995-07-18 14:12:02 +00001430
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001431int
Fred Drake79912472000-07-09 04:06:11 +00001432PySequence_Check(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 if (PyDict_Check(s))
1435 return 0;
1436 return s != NULL && s->ob_type->tp_as_sequence &&
1437 s->ob_type->tp_as_sequence->sq_item != NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001438}
1439
Martin v. Löwis18e16552006-02-15 17:27:45 +00001440Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001441PySequence_Size(PyObject *s)
Guido van Rossume15dee51995-07-18 14:12:02 +00001442{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 if (s == NULL) {
1446 null_error();
1447 return -1;
1448 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 m = s->ob_type->tp_as_sequence;
1451 if (m && m->sq_length)
1452 return m->sq_length(s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 type_error("object of type '%.200s' has no len()", s);
1455 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001456}
1457
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001458#undef PySequence_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00001459Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001460PySequence_Length(PyObject *s)
1461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 return PySequence_Size(s);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00001463}
1464#define PySequence_Length PySequence_Size
1465
Guido van Rossume15dee51995-07-18 14:12:02 +00001466PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001467PySequence_Concat(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001470
Victor Stinner71aea8e2016-08-19 16:59:55 +02001471 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001473 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 m = s->ob_type->tp_as_sequence;
1476 if (m && m->sq_concat)
1477 return m->sq_concat(s, o);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 /* Instances of user classes defining an __add__() method only
1480 have an nb_add slot, not an sq_concat slot. So we fall back
1481 to nb_add if both arguments appear to be sequences. */
1482 if (PySequence_Check(s) && PySequence_Check(o)) {
1483 PyObject *result = binary_op1(s, o, NB_SLOT(nb_add));
1484 if (result != Py_NotImplemented)
1485 return result;
1486 Py_DECREF(result);
1487 }
1488 return type_error("'%.200s' object can't be concatenated", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001489}
1490
1491PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001492PySequence_Repeat(PyObject *o, Py_ssize_t count)
Guido van Rossume15dee51995-07-18 14:12:02 +00001493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001495
Victor Stinner71aea8e2016-08-19 16:59:55 +02001496 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001498 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 m = o->ob_type->tp_as_sequence;
1501 if (m && m->sq_repeat)
1502 return m->sq_repeat(o, count);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 /* Instances of user classes defining a __mul__() method only
1505 have an nb_multiply slot, not an sq_repeat slot. so we fall back
1506 to nb_multiply if o appears to be a sequence. */
1507 if (PySequence_Check(o)) {
1508 PyObject *n, *result;
1509 n = PyLong_FromSsize_t(count);
1510 if (n == NULL)
1511 return NULL;
1512 result = binary_op1(o, n, NB_SLOT(nb_multiply));
1513 Py_DECREF(n);
1514 if (result != Py_NotImplemented)
1515 return result;
1516 Py_DECREF(result);
1517 }
1518 return type_error("'%.200s' object can't be repeated", o);
Guido van Rossume15dee51995-07-18 14:12:02 +00001519}
1520
1521PyObject *
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001522PySequence_InPlaceConcat(PyObject *s, PyObject *o)
1523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001525
Victor Stinner71aea8e2016-08-19 16:59:55 +02001526 if (s == NULL || o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001528 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 m = s->ob_type->tp_as_sequence;
1531 if (m && m->sq_inplace_concat)
1532 return m->sq_inplace_concat(s, o);
1533 if (m && m->sq_concat)
1534 return m->sq_concat(s, o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 if (PySequence_Check(s) && PySequence_Check(o)) {
1537 PyObject *result = binary_iop1(s, o, NB_SLOT(nb_inplace_add),
1538 NB_SLOT(nb_add));
1539 if (result != Py_NotImplemented)
1540 return result;
1541 Py_DECREF(result);
1542 }
1543 return type_error("'%.200s' object can't be concatenated", s);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001544}
1545
1546PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001547PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 PySequenceMethods *m;
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001550
Victor Stinner71aea8e2016-08-19 16:59:55 +02001551 if (o == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001553 }
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 m = o->ob_type->tp_as_sequence;
1556 if (m && m->sq_inplace_repeat)
1557 return m->sq_inplace_repeat(o, count);
1558 if (m && m->sq_repeat)
1559 return m->sq_repeat(o, count);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 if (PySequence_Check(o)) {
1562 PyObject *n, *result;
1563 n = PyLong_FromSsize_t(count);
1564 if (n == NULL)
1565 return NULL;
1566 result = binary_iop1(o, n, NB_SLOT(nb_inplace_multiply),
1567 NB_SLOT(nb_multiply));
1568 Py_DECREF(n);
1569 if (result != Py_NotImplemented)
1570 return result;
1571 Py_DECREF(result);
1572 }
1573 return type_error("'%.200s' object can't be repeated", o);
Thomas Wouterse289e0b2000-08-24 20:08:19 +00001574}
1575
1576PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001577PySequence_GetItem(PyObject *s, Py_ssize_t i)
Guido van Rossume15dee51995-07-18 14:12:02 +00001578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001580
Victor Stinner71aea8e2016-08-19 16:59:55 +02001581 if (s == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001583 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001585 m = s->ob_type->tp_as_sequence;
1586 if (m && m->sq_item) {
1587 if (i < 0) {
1588 if (m->sq_length) {
1589 Py_ssize_t l = (*m->sq_length)(s);
Victor Stinnere20310f2015-11-05 13:56:58 +01001590 if (l < 0) {
1591 assert(PyErr_Occurred());
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 return NULL;
Victor Stinnere20310f2015-11-05 13:56:58 +01001593 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 i += l;
1595 }
1596 }
1597 return m->sq_item(s, i);
1598 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 return type_error("'%.200s' object does not support indexing", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001601}
1602
1603PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00001604PySequence_GetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossume15dee51995-07-18 14:12:02 +00001605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001607
Victor Stinner71aea8e2016-08-19 16:59:55 +02001608 if (!s) {
1609 return null_error();
1610 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001613 if (mp && mp->mp_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001614 PyObject *res;
1615 PyObject *slice = _PySlice_FromIndices(i1, i2);
1616 if (!slice)
1617 return NULL;
1618 res = mp->mp_subscript(s, slice);
1619 Py_DECREF(slice);
1620 return res;
1621 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 return type_error("'%.200s' object is unsliceable", s);
Guido van Rossume15dee51995-07-18 14:12:02 +00001624}
1625
1626int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001627PySequence_SetItem(PyObject *s, Py_ssize_t i, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 PySequenceMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 if (s == NULL) {
1632 null_error();
1633 return -1;
1634 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 m = s->ob_type->tp_as_sequence;
1637 if (m && m->sq_ass_item) {
1638 if (i < 0) {
1639 if (m->sq_length) {
1640 Py_ssize_t l = (*m->sq_length)(s);
1641 if (l < 0)
1642 return -1;
1643 i += l;
1644 }
1645 }
1646 return m->sq_ass_item(s, i, o);
1647 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 type_error("'%.200s' object does not support item assignment", s);
1650 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001651}
1652
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001653int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001654PySequence_DelItem(PyObject *s, Py_ssize_t i)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 PySequenceMethods *m;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (s == NULL) {
1659 null_error();
1660 return -1;
1661 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 m = s->ob_type->tp_as_sequence;
1664 if (m && m->sq_ass_item) {
1665 if (i < 0) {
1666 if (m->sq_length) {
1667 Py_ssize_t l = (*m->sq_length)(s);
1668 if (l < 0)
1669 return -1;
1670 i += l;
1671 }
1672 }
1673 return m->sq_ass_item(s, i, (PyObject *)NULL);
1674 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 type_error("'%.200s' object doesn't support item deletion", s);
1677 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001678}
1679
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001680int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001681PySequence_SetSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 PyMappingMethods *mp;
Guido van Rossume15dee51995-07-18 14:12:02 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 if (s == NULL) {
1686 null_error();
1687 return -1;
1688 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001691 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 int res;
1693 PyObject *slice = _PySlice_FromIndices(i1, i2);
1694 if (!slice)
1695 return -1;
1696 res = mp->mp_ass_subscript(s, slice, o);
1697 Py_DECREF(slice);
1698 return res;
1699 }
Thomas Wouters1d75a792000-08-17 22:37:32 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 type_error("'%.200s' object doesn't support slice assignment", s);
1702 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00001703}
1704
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001705int
Martin v. Löwis18e16552006-02-15 17:27:45 +00001706PySequence_DelSlice(PyObject *s, Py_ssize_t i1, Py_ssize_t i2)
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 PyMappingMethods *mp;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 if (s == NULL) {
1711 null_error();
1712 return -1;
1713 }
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 mp = s->ob_type->tp_as_mapping;
Benjamin Peterson568867a2010-09-11 16:02:03 +00001716 if (mp && mp->mp_ass_subscript) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 int res;
1718 PyObject *slice = _PySlice_FromIndices(i1, i2);
1719 if (!slice)
1720 return -1;
1721 res = mp->mp_ass_subscript(s, slice, NULL);
1722 Py_DECREF(slice);
1723 return res;
1724 }
1725 type_error("'%.200s' object doesn't support slice deletion", s);
1726 return -1;
Guido van Rossum6cdc6f41996-08-21 17:41:54 +00001727}
1728
Guido van Rossume15dee51995-07-18 14:12:02 +00001729PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001730PySequence_Tuple(PyObject *v)
Guido van Rossume15dee51995-07-18 14:12:02 +00001731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 PyObject *it; /* iter(v) */
1733 Py_ssize_t n; /* guess for result tuple size */
1734 PyObject *result = NULL;
1735 Py_ssize_t j;
Guido van Rossume15dee51995-07-18 14:12:02 +00001736
Victor Stinner71aea8e2016-08-19 16:59:55 +02001737 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001739 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 /* Special-case the common tuple and list cases, for efficiency. */
1742 if (PyTuple_CheckExact(v)) {
1743 /* Note that we can't know whether it's safe to return
1744 a tuple *subclass* instance as-is, hence the restriction
1745 to exact tuples here. In contrast, lists always make
1746 a copy, so there's no need for exactness below. */
1747 Py_INCREF(v);
1748 return v;
1749 }
Raymond Hettinger610a51f2015-05-17 14:45:58 -07001750 if (PyList_CheckExact(v))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 return PyList_AsTuple(v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 /* Get iterator. */
1754 it = PyObject_GetIter(v);
1755 if (it == NULL)
1756 return NULL;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 /* Guess result size and allocate space. */
Armin Ronacheraa9a79d2012-10-06 14:03:24 +02001759 n = PyObject_LengthHint(v, 10);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 if (n == -1)
1761 goto Fail;
1762 result = PyTuple_New(n);
1763 if (result == NULL)
1764 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001766 /* Fill the tuple. */
1767 for (j = 0; ; ++j) {
1768 PyObject *item = PyIter_Next(it);
1769 if (item == NULL) {
1770 if (PyErr_Occurred())
1771 goto Fail;
1772 break;
1773 }
1774 if (j >= n) {
Martin Pantere8db8612016-07-25 02:30:05 +00001775 size_t newn = (size_t)n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 /* The over-allocation strategy can grow a bit faster
1777 than for lists because unlike lists the
1778 over-allocation isn't permanent -- we reclaim
1779 the excess before the end of this routine.
1780 So, grow by ten and then add 25%.
1781 */
Martin Pantere8db8612016-07-25 02:30:05 +00001782 newn += 10u;
1783 newn += newn >> 2;
1784 if (newn > PY_SSIZE_T_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 /* Check for overflow */
1786 PyErr_NoMemory();
1787 Py_DECREF(item);
1788 goto Fail;
1789 }
Martin Pantere8db8612016-07-25 02:30:05 +00001790 n = (Py_ssize_t)newn;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 if (_PyTuple_Resize(&result, n) != 0) {
1792 Py_DECREF(item);
1793 goto Fail;
1794 }
1795 }
1796 PyTuple_SET_ITEM(result, j, item);
1797 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 /* Cut tuple back if guess was too large. */
1800 if (j < n &&
1801 _PyTuple_Resize(&result, j) != 0)
1802 goto Fail;
Tim Peters6912d4d2001-05-05 03:56:37 +00001803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 Py_DECREF(it);
1805 return result;
Tim Peters6912d4d2001-05-05 03:56:37 +00001806
1807Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 Py_XDECREF(result);
1809 Py_DECREF(it);
1810 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00001811}
1812
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001813PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001814PySequence_List(PyObject *v)
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001816 PyObject *result; /* result list */
1817 PyObject *rv; /* return value from PyList_Extend */
Guido van Rossum4669fb41997-04-02 05:31:09 +00001818
Victor Stinner71aea8e2016-08-19 16:59:55 +02001819 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001821 }
Guido van Rossum5dba9e81998-07-10 18:03:50 +00001822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 result = PyList_New(0);
1824 if (result == NULL)
1825 return NULL;
Tim Petersf553f892001-05-01 20:45:31 +00001826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 rv = _PyList_Extend((PyListObject *)result, v);
1828 if (rv == NULL) {
1829 Py_DECREF(result);
1830 return NULL;
1831 }
1832 Py_DECREF(rv);
1833 return result;
Guido van Rossum3c5936a1996-12-05 21:51:24 +00001834}
1835
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001836PyObject *
Fred Drake79912472000-07-09 04:06:11 +00001837PySequence_Fast(PyObject *v, const char *m)
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 PyObject *it;
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001840
Victor Stinner71aea8e2016-08-19 16:59:55 +02001841 if (v == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001842 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02001843 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 if (PyList_CheckExact(v) || PyTuple_CheckExact(v)) {
1846 Py_INCREF(v);
1847 return v;
1848 }
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001850 it = PyObject_GetIter(v);
1851 if (it == NULL) {
1852 if (PyErr_ExceptionMatches(PyExc_TypeError))
1853 PyErr_SetString(PyExc_TypeError, m);
1854 return NULL;
1855 }
Raymond Hettinger2fb70292004-01-11 23:26:51 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 v = PySequence_List(it);
1858 Py_DECREF(it);
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 return v;
Andrew M. Kuchling74042d62000-06-18 18:43:14 +00001861}
1862
Tim Peters16a77ad2001-09-08 04:00:12 +00001863/* Iterate over seq. Result depends on the operation:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 PY_ITERSEARCH_COUNT: -1 if error, else # of times obj appears in seq.
1865 PY_ITERSEARCH_INDEX: 0-based index of first occurrence of obj in seq;
1866 set ValueError and return -1 if none found; also return -1 on error.
Tim Peters16a77ad2001-09-08 04:00:12 +00001867 Py_ITERSEARCH_CONTAINS: return 1 if obj in seq, else 0; -1 on error.
1868*/
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001869Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001870_PySequence_IterSearch(PyObject *seq, PyObject *obj, int operation)
Guido van Rossume15dee51995-07-18 14:12:02 +00001871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 Py_ssize_t n;
1873 int wrapped; /* for PY_ITERSEARCH_INDEX, true iff n wrapped around */
1874 PyObject *it; /* iter(seq) */
Guido van Rossume15dee51995-07-18 14:12:02 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (seq == NULL || obj == NULL) {
1877 null_error();
1878 return -1;
1879 }
Tim Peters75f8e352001-05-05 11:33:43 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 it = PyObject_GetIter(seq);
1882 if (it == NULL) {
1883 type_error("argument of type '%.200s' is not iterable", seq);
1884 return -1;
1885 }
Guido van Rossume15dee51995-07-18 14:12:02 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 n = wrapped = 0;
1888 for (;;) {
1889 int cmp;
1890 PyObject *item = PyIter_Next(it);
1891 if (item == NULL) {
1892 if (PyErr_Occurred())
1893 goto Fail;
1894 break;
1895 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 cmp = PyObject_RichCompareBool(obj, item, Py_EQ);
1898 Py_DECREF(item);
1899 if (cmp < 0)
1900 goto Fail;
1901 if (cmp > 0) {
1902 switch (operation) {
1903 case PY_ITERSEARCH_COUNT:
1904 if (n == PY_SSIZE_T_MAX) {
1905 PyErr_SetString(PyExc_OverflowError,
1906 "count exceeds C integer size");
1907 goto Fail;
1908 }
1909 ++n;
1910 break;
Tim Peters16a77ad2001-09-08 04:00:12 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 case PY_ITERSEARCH_INDEX:
1913 if (wrapped) {
1914 PyErr_SetString(PyExc_OverflowError,
1915 "index exceeds C integer size");
1916 goto Fail;
1917 }
1918 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 case PY_ITERSEARCH_CONTAINS:
1921 n = 1;
1922 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 default:
1925 assert(!"unknown operation");
1926 }
1927 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 if (operation == PY_ITERSEARCH_INDEX) {
1930 if (n == PY_SSIZE_T_MAX)
1931 wrapped = 1;
1932 ++n;
1933 }
1934 }
Tim Peters16a77ad2001-09-08 04:00:12 +00001935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001936 if (operation != PY_ITERSEARCH_INDEX)
1937 goto Done;
Tim Peters16a77ad2001-09-08 04:00:12 +00001938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 PyErr_SetString(PyExc_ValueError,
1940 "sequence.index(x): x not in sequence");
1941 /* fall into failure code */
Tim Peters16a77ad2001-09-08 04:00:12 +00001942Fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 n = -1;
1944 /* fall through */
Tim Peters16a77ad2001-09-08 04:00:12 +00001945Done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 Py_DECREF(it);
1947 return n;
Tim Peters75f8e352001-05-05 11:33:43 +00001948
Guido van Rossume15dee51995-07-18 14:12:02 +00001949}
1950
Tim Peters16a77ad2001-09-08 04:00:12 +00001951/* Return # of times o appears in s. */
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001952Py_ssize_t
Tim Peters16a77ad2001-09-08 04:00:12 +00001953PySequence_Count(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001954{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001955 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_COUNT);
Guido van Rossume15dee51995-07-18 14:12:02 +00001956}
1957
Tim Peterscb8d3682001-05-05 21:05:01 +00001958/* Return -1 if error; 1 if ob in seq; 0 if ob not in seq.
Tim Peters16a77ad2001-09-08 04:00:12 +00001959 * Use sq_contains if possible, else defer to _PySequence_IterSearch().
Tim Peterscb8d3682001-05-05 21:05:01 +00001960 */
1961int
1962PySequence_Contains(PyObject *seq, PyObject *ob)
1963{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 Py_ssize_t result;
1965 PySequenceMethods *sqm = seq->ob_type->tp_as_sequence;
1966 if (sqm != NULL && sqm->sq_contains != NULL)
1967 return (*sqm->sq_contains)(seq, ob);
1968 result = _PySequence_IterSearch(seq, ob, PY_ITERSEARCH_CONTAINS);
1969 return Py_SAFE_DOWNCAST(result, Py_ssize_t, int);
Tim Peterscb8d3682001-05-05 21:05:01 +00001970}
1971
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001972/* Backwards compatibility */
1973#undef PySequence_In
1974int
Fred Drake79912472000-07-09 04:06:11 +00001975PySequence_In(PyObject *w, PyObject *v)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001976{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 return PySequence_Contains(w, v);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001978}
1979
Neal Norwitz1fc4b772006-03-04 18:49:58 +00001980Py_ssize_t
Fred Drake79912472000-07-09 04:06:11 +00001981PySequence_Index(PyObject *s, PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 return _PySequence_IterSearch(s, o, PY_ITERSEARCH_INDEX);
Guido van Rossume15dee51995-07-18 14:12:02 +00001984}
1985
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00001986/* Operations on mappings */
1987
1988int
Fred Drake79912472000-07-09 04:06:11 +00001989PyMapping_Check(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001990{
Benjamin Peterson21992272011-12-28 12:01:31 -06001991 return o && o->ob_type->tp_as_mapping &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 o->ob_type->tp_as_mapping->mp_subscript;
Guido van Rossume15dee51995-07-18 14:12:02 +00001993}
1994
Martin v. Löwis18e16552006-02-15 17:27:45 +00001995Py_ssize_t
Jeremy Hylton6253f832000-07-12 12:56:19 +00001996PyMapping_Size(PyObject *o)
Guido van Rossume15dee51995-07-18 14:12:02 +00001997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 PyMappingMethods *m;
Guido van Rossume15dee51995-07-18 14:12:02 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 if (o == NULL) {
2001 null_error();
2002 return -1;
2003 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 m = o->ob_type->tp_as_mapping;
2006 if (m && m->mp_length)
2007 return m->mp_length(o);
Guido van Rossume15dee51995-07-18 14:12:02 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 type_error("object of type '%.200s' has no len()", o);
2010 return -1;
Guido van Rossume15dee51995-07-18 14:12:02 +00002011}
2012
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002013#undef PyMapping_Length
Martin v. Löwis18e16552006-02-15 17:27:45 +00002014Py_ssize_t
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002015PyMapping_Length(PyObject *o)
2016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 return PyMapping_Size(o);
Marc-André Lemburgcf5f3582000-07-17 09:22:55 +00002018}
2019#define PyMapping_Length PyMapping_Size
2020
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002021PyObject *
Serhiy Storchakac6792272013-10-19 21:03:34 +03002022PyMapping_GetItemString(PyObject *o, const char *key)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002024 PyObject *okey, *r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002025
Victor Stinner71aea8e2016-08-19 16:59:55 +02002026 if (key == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002028 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 okey = PyUnicode_FromString(key);
2031 if (okey == NULL)
2032 return NULL;
2033 r = PyObject_GetItem(o, okey);
2034 Py_DECREF(okey);
2035 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002036}
2037
2038int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002039PyMapping_SetItemString(PyObject *o, const char *key, PyObject *value)
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 PyObject *okey;
2042 int r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002044 if (key == NULL) {
2045 null_error();
2046 return -1;
2047 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 okey = PyUnicode_FromString(key);
2050 if (okey == NULL)
2051 return -1;
2052 r = PyObject_SetItem(o, okey, value);
2053 Py_DECREF(okey);
2054 return r;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002055}
2056
2057int
Serhiy Storchakac6792272013-10-19 21:03:34 +03002058PyMapping_HasKeyString(PyObject *o, const char *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 v = PyMapping_GetItemString(o, key);
2063 if (v) {
2064 Py_DECREF(v);
2065 return 1;
2066 }
2067 PyErr_Clear();
2068 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002069}
2070
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002071int
Fred Drake79912472000-07-09 04:06:11 +00002072PyMapping_HasKey(PyObject *o, PyObject *key)
Guido van Rossume15dee51995-07-18 14:12:02 +00002073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 PyObject *v;
Guido van Rossume15dee51995-07-18 14:12:02 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 v = PyObject_GetItem(o, key);
2077 if (v) {
2078 Py_DECREF(v);
2079 return 1;
2080 }
2081 PyErr_Clear();
2082 return 0;
Guido van Rossume15dee51995-07-18 14:12:02 +00002083}
2084
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002085PyObject *
2086PyMapping_Keys(PyObject *o)
2087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 PyObject *keys;
2089 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002090 _Py_IDENTIFIER(keys);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 if (PyDict_CheckExact(o))
2093 return PyDict_Keys(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002094 keys = _PyObject_CallMethodId(o, &PyId_keys, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 if (keys == NULL)
2096 return NULL;
2097 fast = PySequence_Fast(keys, "o.keys() are not iterable");
2098 Py_DECREF(keys);
2099 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002100}
2101
2102PyObject *
2103PyMapping_Items(PyObject *o)
2104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 PyObject *items;
2106 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002107 _Py_IDENTIFIER(items);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 if (PyDict_CheckExact(o))
2110 return PyDict_Items(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002111 items = _PyObject_CallMethodId(o, &PyId_items, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (items == NULL)
2113 return NULL;
2114 fast = PySequence_Fast(items, "o.items() are not iterable");
2115 Py_DECREF(items);
2116 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002117}
2118
2119PyObject *
2120PyMapping_Values(PyObject *o)
2121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 PyObject *values;
2123 PyObject *fast;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002124 _Py_IDENTIFIER(values);
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 if (PyDict_CheckExact(o))
2127 return PyDict_Values(o);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002128 values = _PyObject_CallMethodId(o, &PyId_values, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 if (values == NULL)
2130 return NULL;
2131 fast = PySequence_Fast(values, "o.values() are not iterable");
2132 Py_DECREF(values);
2133 return fast;
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002134}
2135
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002136/* Operations on callable objects */
2137
2138/* XXX PyCallable_Check() is in object.c */
2139
Guido van Rossume15dee51995-07-18 14:12:02 +00002140PyObject *
Fred Drake79912472000-07-09 04:06:11 +00002141PyObject_CallObject(PyObject *o, PyObject *a)
Guido van Rossume15dee51995-07-18 14:12:02 +00002142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 return PyEval_CallObjectWithKeywords(o, a, NULL);
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002144}
Guido van Rossume15dee51995-07-18 14:12:02 +00002145
Victor Stinner4a7cc882015-03-06 23:35:27 +01002146PyObject*
Victor Stinnerefde1462015-03-21 15:04:43 +01002147_Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
Victor Stinner4a7cc882015-03-06 23:35:27 +01002148{
2149 int err_occurred = (PyErr_Occurred() != NULL);
2150
Victor Stinnerefde1462015-03-21 15:04:43 +01002151 assert((func != NULL) ^ (where != NULL));
2152
Victor Stinner4a7cc882015-03-06 23:35:27 +01002153 if (result == NULL) {
2154 if (!err_occurred) {
Victor Stinnerefde1462015-03-21 15:04:43 +01002155 if (func)
2156 PyErr_Format(PyExc_SystemError,
2157 "%R returned NULL without setting an error",
2158 func);
2159 else
2160 PyErr_Format(PyExc_SystemError,
2161 "%s returned NULL without setting an error",
2162 where);
Victor Stinner944fbcc2015-03-24 16:28:52 +01002163#ifdef Py_DEBUG
Serhiy Storchaka5697c4b2016-06-12 17:02:10 +03002164 /* Ensure that the bug is caught in debug mode */
Victor Stinner944fbcc2015-03-24 16:28:52 +01002165 Py_FatalError("a function returned NULL without setting an error");
2166#endif
2167 return NULL;
Victor Stinner4a7cc882015-03-06 23:35:27 +01002168 }
2169 }
2170 else {
2171 if (err_occurred) {
2172 PyObject *exc, *val, *tb;
2173 PyErr_Fetch(&exc, &val, &tb);
2174
2175 Py_DECREF(result);
2176
Victor Stinnerefde1462015-03-21 15:04:43 +01002177 if (func)
2178 PyErr_Format(PyExc_SystemError,
2179 "%R returned a result with an error set",
2180 func);
2181 else
2182 PyErr_Format(PyExc_SystemError,
2183 "%s returned a result with an error set",
2184 where);
Victor Stinner4a7cc882015-03-06 23:35:27 +01002185 _PyErr_ChainExceptions(exc, val, tb);
Victor Stinner944fbcc2015-03-24 16:28:52 +01002186#ifdef Py_DEBUG
Martin Panter2275e622016-06-20 07:52:50 +00002187 /* Ensure that the bug is caught in debug mode */
Victor Stinner944fbcc2015-03-24 16:28:52 +01002188 Py_FatalError("a function returned a result with an error set");
2189#endif
2190 return NULL;
Victor Stinner4a7cc882015-03-06 23:35:27 +01002191 }
2192 }
2193 return result;
2194}
2195
Guido van Rossume15dee51995-07-18 14:12:02 +00002196PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002197PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)
2198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 ternaryfunc call;
Victor Stinner4a7cc882015-03-06 23:35:27 +01002200 PyObject *result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002201
Victor Stinner8f4ec8d2014-09-05 01:10:29 +02002202 /* PyObject_Call() must not be called with an exception set,
2203 because it may clear it (directly or indirectly) and so the
Martin Panterec1aa5c2015-10-07 11:03:53 +00002204 caller loses its exception */
Victor Stinner8f4ec8d2014-09-05 01:10:29 +02002205 assert(!PyErr_Occurred());
2206
Victor Stinner4a7cc882015-03-06 23:35:27 +01002207 call = func->ob_type->tp_call;
2208 if (call == NULL) {
2209 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2210 func->ob_type->tp_name);
2211 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 }
Victor Stinner4a7cc882015-03-06 23:35:27 +01002213
2214 if (Py_EnterRecursiveCall(" while calling a Python object"))
2215 return NULL;
2216
2217 result = (*call)(func, arg, kw);
2218
2219 Py_LeaveRecursiveCall();
2220
Victor Stinnerefde1462015-03-21 15:04:43 +01002221 return _Py_CheckFunctionResult(func, result, NULL);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002222}
2223
Victor Stinner9be7e7b2016-08-19 16:11:43 +02002224PyObject*
2225_PyStack_AsTuple(PyObject **stack, Py_ssize_t nargs)
2226{
2227 PyObject *args;
2228 Py_ssize_t i;
2229
2230 args = PyTuple_New(nargs);
2231 if (args == NULL) {
2232 return NULL;
2233 }
2234
2235 for (i=0; i < nargs; i++) {
2236 PyObject *item = stack[i];
2237 Py_INCREF(item);
2238 PyTuple_SET_ITEM(args, i, item);
2239 }
2240
2241 return args;
2242}
2243
2244PyObject *
2245_PyObject_FastCall(PyObject *func, PyObject **args, int nargs, PyObject *kwargs)
2246{
2247 ternaryfunc call;
2248 PyObject *result = NULL;
2249
2250 /* _PyObject_FastCall() must not be called with an exception set,
2251 because it may clear it (directly or indirectly) and so the
2252 caller loses its exception */
2253 assert(!PyErr_Occurred());
2254
2255 assert(func != NULL);
2256 assert(nargs >= 0);
2257 assert(nargs == 0 || args != NULL);
2258 /* issue #27128: support for keywords will come later:
2259 _PyFunction_FastCall() doesn't support keyword arguments yet */
2260 assert(kwargs == NULL);
2261
2262 if (Py_EnterRecursiveCall(" while calling a Python object")) {
2263 return NULL;
2264 }
2265
2266 if (PyFunction_Check(func)) {
2267 result = _PyFunction_FastCall(func, args, nargs, kwargs);
2268 }
2269 else if (PyCFunction_Check(func)) {
2270 result = _PyCFunction_FastCall(func, args, nargs, kwargs);
2271 }
2272 else {
2273 PyObject *tuple;
2274
2275 /* Slow-path: build a temporary tuple */
2276 call = func->ob_type->tp_call;
2277 if (call == NULL) {
2278 PyErr_Format(PyExc_TypeError, "'%.200s' object is not callable",
2279 func->ob_type->tp_name);
2280 goto exit;
2281 }
2282
2283 tuple = _PyStack_AsTuple(args, nargs);
2284 if (tuple == NULL) {
2285 goto exit;
2286 }
2287
2288 result = (*call)(func, tuple, kwargs);
2289 Py_DECREF(tuple);
2290 }
2291
2292 result = _Py_CheckFunctionResult(func, result, NULL);
2293
2294exit:
2295 Py_LeaveRecursiveCall();
2296
2297 return result;
2298}
2299
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002300static PyObject*
2301call_function_tail(PyObject *callable, PyObject *args)
2302{
Victor Stinner88807082016-08-19 16:44:19 +02002303 PyObject *result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002304
Victor Stinner64faad62016-08-19 16:50:49 +02002305 assert(args != NULL);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002307 if (!PyTuple_Check(args)) {
Victor Stinner88807082016-08-19 16:44:19 +02002308 result = _PyObject_FastCall(callable, &args, 1, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 }
Victor Stinner88807082016-08-19 16:44:19 +02002310 else {
2311 result = PyObject_Call(callable, args, NULL);
2312 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002313
Victor Stinner88807082016-08-19 16:44:19 +02002314 return result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002315}
2316
Tim Peters6d6c1a32001-08-02 04:15:00 +00002317PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002318PyObject_CallFunction(PyObject *callable, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 va_list va;
Victor Stinner64faad62016-08-19 16:50:49 +02002321 PyObject *args, *result;
Guido van Rossume15dee51995-07-18 14:12:02 +00002322
Victor Stinner71aea8e2016-08-19 16:59:55 +02002323 if (callable == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002325 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002326
Victor Stinner0d1a7992016-08-19 17:04:54 +02002327 if (!format || !*format) {
2328 return _PyObject_FastCall(callable, NULL, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 }
Victor Stinner0d1a7992016-08-19 17:04:54 +02002330
2331 va_start(va, format);
2332 args = Py_VaBuildValue(format, va);
2333 va_end(va);
Victor Stinner64faad62016-08-19 16:50:49 +02002334 if (args == NULL) {
Victor Stinner0b0c8672013-10-29 19:29:52 +01002335 return NULL;
Victor Stinner64faad62016-08-19 16:50:49 +02002336 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002337
Victor Stinner64faad62016-08-19 16:50:49 +02002338 result = call_function_tail(callable, args);
2339 Py_DECREF(args);
2340 return result;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002341}
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002342
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002343PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002344_PyObject_CallFunction_SizeT(PyObject *callable, const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002345{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002346 va_list va;
Victor Stinner64faad62016-08-19 16:50:49 +02002347 PyObject *args, *result;
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002348
Victor Stinner71aea8e2016-08-19 16:59:55 +02002349 if (callable == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002351 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002352
Victor Stinner0d1a7992016-08-19 17:04:54 +02002353 if (!format || !*format) {
2354 return _PyObject_FastCall(callable, NULL, 0, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 }
Victor Stinner0d1a7992016-08-19 17:04:54 +02002356
2357 va_start(va, format);
2358 args = _Py_VaBuildValue_SizeT(format, va);
2359 va_end(va);
Victor Stinner64faad62016-08-19 16:50:49 +02002360 if (args == NULL) {
2361 return NULL;
2362 }
Guido van Rossumcea1c8c1998-05-22 00:47:05 +00002363
Victor Stinner64faad62016-08-19 16:50:49 +02002364 result = call_function_tail(callable, args);
2365 Py_DECREF(args);
2366 return result;
Guido van Rossume15dee51995-07-18 14:12:02 +00002367}
2368
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002369static PyObject*
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002370callmethod(PyObject* func, const char *format, va_list va, int is_size_t)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002371{
Victor Stinner64faad62016-08-19 16:50:49 +02002372 PyObject *args, *result;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002373
Victor Stinnerd042f1f2016-08-19 16:56:49 +02002374 assert(func != NULL);
2375
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002376 if (!PyCallable_Check(func)) {
2377 type_error("attribute of type '%.200s' is not callable", func);
Victor Stinner64faad62016-08-19 16:50:49 +02002378 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002379 }
2380
Victor Stinner0d1a7992016-08-19 17:04:54 +02002381 if (!format || !*format) {
2382 return _PyObject_FastCall(func, NULL, 0, NULL);
2383 }
2384
2385 if (is_size_t) {
2386 args = _Py_VaBuildValue_SizeT(format, va);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002387 }
Victor Stinner64faad62016-08-19 16:50:49 +02002388 else {
Victor Stinner0d1a7992016-08-19 17:04:54 +02002389 args = Py_VaBuildValue(format, va);
Victor Stinner64faad62016-08-19 16:50:49 +02002390 }
2391 if (args == NULL) {
2392 return NULL;
2393 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002394
Victor Stinner64faad62016-08-19 16:50:49 +02002395 result = call_function_tail(func, args);
Victor Stinner64faad62016-08-19 16:50:49 +02002396 Py_DECREF(args);
2397 return result;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002398}
2399
Guido van Rossume15dee51995-07-18 14:12:02 +00002400PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002401PyObject_CallMethod(PyObject *o, const char *name, const char *format, ...)
Guido van Rossume15dee51995-07-18 14:12:02 +00002402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 PyObject *func = NULL;
2405 PyObject *retval = NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002406
Victor Stinner71aea8e2016-08-19 16:59:55 +02002407 if (o == NULL || name == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002408 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002409 }
Guido van Rossume15dee51995-07-18 14:12:02 +00002410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002412 if (func == NULL)
2413 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002414
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002415 va_start(va, format);
2416 retval = callmethod(func, format, va, 0);
2417 va_end(va);
Victor Stinnerd042f1f2016-08-19 16:56:49 +02002418 Py_DECREF(func);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002419 return retval;
2420}
2421
2422PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002423_PyObject_CallMethodId(PyObject *o, _Py_Identifier *name,
2424 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002425{
2426 va_list va;
2427 PyObject *func = NULL;
2428 PyObject *retval = NULL;
2429
Victor Stinner71aea8e2016-08-19 16:59:55 +02002430 if (o == NULL || name == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002431 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002432 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002433
2434 func = _PyObject_GetAttrId(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002435 if (func == NULL)
2436 return NULL;
Guido van Rossume15dee51995-07-18 14:12:02 +00002437
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002438 va_start(va, format);
2439 retval = callmethod(func, format, va, 0);
2440 va_end(va);
Victor Stinnerd042f1f2016-08-19 16:56:49 +02002441 Py_DECREF(func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 return retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002443}
2444
2445PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002446_PyObject_CallMethod_SizeT(PyObject *o, const char *name,
2447 const char *format, ...)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 va_list va;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 PyObject *func = NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002451 PyObject *retval;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002452
Victor Stinner71aea8e2016-08-19 16:59:55 +02002453 if (o == NULL || name == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002455 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 func = PyObject_GetAttrString(o, name);
Benjamin Peterson1791c222014-06-26 23:29:13 -07002458 if (func == NULL)
2459 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002460 va_start(va, format);
2461 retval = callmethod(func, format, va, 1);
2462 va_end(va);
Victor Stinnerd042f1f2016-08-19 16:56:49 +02002463 Py_DECREF(func);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 return retval;
Guido van Rossume15dee51995-07-18 14:12:02 +00002465}
Guido van Rossum823649d2001-03-21 18:40:58 +00002466
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002467PyObject *
Serhiy Storchaka1cfebc72013-05-29 18:50:54 +03002468_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name,
2469 const char *format, ...)
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002470{
2471 va_list va;
2472 PyObject *func = NULL;
2473 PyObject *retval;
2474
Victor Stinner71aea8e2016-08-19 16:59:55 +02002475 if (o == NULL || name == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002476 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002477 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002478
2479 func = _PyObject_GetAttrId(o, name);
2480 if (func == NULL) {
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002481 return NULL;
2482 }
2483 va_start(va, format);
2484 retval = callmethod(func, format, va, 1);
2485 va_end(va);
Victor Stinnerd042f1f2016-08-19 16:56:49 +02002486 Py_DECREF(func);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02002487 return retval;
2488}
Guido van Rossum823649d2001-03-21 18:40:58 +00002489
Fred Drakeb421b8c2001-10-26 16:21:32 +00002490static PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002491objargs_mktuple(va_list va)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002492{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 int i, n = 0;
2494 va_list countva;
2495 PyObject *result, *tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002496
Alexander Belopolskyf0f45142010-08-11 17:31:17 +00002497 Py_VA_COPY(countva, va);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 while (((PyObject *)va_arg(countva, PyObject *)) != NULL)
2500 ++n;
2501 result = PyTuple_New(n);
2502 if (result != NULL && n > 0) {
2503 for (i = 0; i < n; ++i) {
2504 tmp = (PyObject *)va_arg(va, PyObject *);
2505 PyTuple_SET_ITEM(result, i, tmp);
2506 Py_INCREF(tmp);
2507 }
2508 }
2509 return result;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002510}
2511
2512PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002513PyObject_CallMethodObjArgs(PyObject *callable, PyObject *name, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 PyObject *args, *tmp;
2516 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002517
Victor Stinner71aea8e2016-08-19 16:59:55 +02002518 if (callable == NULL || name == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002520 }
Fred Drakeb421b8c2001-10-26 16:21:32 +00002521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 callable = PyObject_GetAttr(callable, name);
2523 if (callable == NULL)
2524 return NULL;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 /* count the args */
2527 va_start(vargs, name);
2528 args = objargs_mktuple(vargs);
2529 va_end(vargs);
2530 if (args == NULL) {
2531 Py_DECREF(callable);
2532 return NULL;
2533 }
2534 tmp = PyObject_Call(callable, args, NULL);
2535 Py_DECREF(args);
2536 Py_DECREF(callable);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002539}
2540
2541PyObject *
Alexandre Vassalotti865eaa12013-05-02 10:44:04 -07002542_PyObject_CallMethodIdObjArgs(PyObject *callable,
Brett Cannonfd074152012-04-14 14:10:13 -04002543 struct _Py_Identifier *name, ...)
2544{
2545 PyObject *args, *tmp;
2546 va_list vargs;
2547
Victor Stinner71aea8e2016-08-19 16:59:55 +02002548 if (callable == NULL || name == NULL) {
Brett Cannonfd074152012-04-14 14:10:13 -04002549 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002550 }
Brett Cannonfd074152012-04-14 14:10:13 -04002551
2552 callable = _PyObject_GetAttrId(callable, name);
2553 if (callable == NULL)
2554 return NULL;
2555
2556 /* count the args */
2557 va_start(vargs, name);
2558 args = objargs_mktuple(vargs);
2559 va_end(vargs);
2560 if (args == NULL) {
2561 Py_DECREF(callable);
2562 return NULL;
2563 }
2564 tmp = PyObject_Call(callable, args, NULL);
2565 Py_DECREF(args);
2566 Py_DECREF(callable);
2567
2568 return tmp;
2569}
2570
2571PyObject *
Fred Drakeb0c079e2001-10-28 02:39:03 +00002572PyObject_CallFunctionObjArgs(PyObject *callable, ...)
Fred Drakeb421b8c2001-10-26 16:21:32 +00002573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 PyObject *args, *tmp;
2575 va_list vargs;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002576
Victor Stinner71aea8e2016-08-19 16:59:55 +02002577 if (callable == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 return null_error();
Victor Stinner71aea8e2016-08-19 16:59:55 +02002579 }
Fred Drakeb421b8c2001-10-26 16:21:32 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 /* count the args */
2582 va_start(vargs, callable);
2583 args = objargs_mktuple(vargs);
2584 va_end(vargs);
2585 if (args == NULL)
2586 return NULL;
2587 tmp = PyObject_Call(callable, args, NULL);
2588 Py_DECREF(args);
Fred Drakeb421b8c2001-10-26 16:21:32 +00002589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 return tmp;
Fred Drakeb421b8c2001-10-26 16:21:32 +00002591}
2592
2593
Guido van Rossum823649d2001-03-21 18:40:58 +00002594/* isinstance(), issubclass() */
2595
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002596/* abstract_get_bases() has logically 4 return states:
Barry Warsawf16951c2002-04-23 22:45:44 +00002597 *
Barry Warsawf16951c2002-04-23 22:45:44 +00002598 * 1. getattr(cls, '__bases__') could raise an AttributeError
2599 * 2. getattr(cls, '__bases__') could raise some other exception
2600 * 3. getattr(cls, '__bases__') could return a tuple
2601 * 4. getattr(cls, '__bases__') could return something other than a tuple
2602 *
2603 * Only state #3 is a non-error state and only it returns a non-NULL object
2604 * (it returns the retrieved tuple).
2605 *
2606 * Any raised AttributeErrors are masked by clearing the exception and
2607 * returning NULL. If an object other than a tuple comes out of __bases__,
2608 * then again, the return value is NULL. So yes, these two situations
2609 * produce exactly the same results: NULL is returned and no error is set.
2610 *
2611 * If some exception other than AttributeError is raised, then NULL is also
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 * returned, but the exception is not cleared. That's because we want the
Barry Warsawf16951c2002-04-23 22:45:44 +00002613 * exception to be propagated along.
2614 *
2615 * Callers are expected to test for PyErr_Occurred() when the return value
2616 * is NULL to decide whether a valid exception should be propagated or not.
2617 * When there's no exception to propagate, it's customary for the caller to
2618 * set a TypeError.
2619 */
Neil Schemenauer6b471292001-10-18 03:18:43 +00002620static PyObject *
2621abstract_get_bases(PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002622{
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002623 _Py_IDENTIFIER(__bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002624 PyObject *bases;
Guido van Rossum823649d2001-03-21 18:40:58 +00002625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002626 Py_ALLOW_RECURSION
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002627 bases = _PyObject_GetAttrId(cls, &PyId___bases__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 Py_END_ALLOW_RECURSION
2629 if (bases == NULL) {
2630 if (PyErr_ExceptionMatches(PyExc_AttributeError))
2631 PyErr_Clear();
2632 return NULL;
2633 }
2634 if (!PyTuple_Check(bases)) {
2635 Py_DECREF(bases);
2636 return NULL;
2637 }
2638 return bases;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002639}
2640
2641
2642static int
2643abstract_issubclass(PyObject *derived, PyObject *cls)
2644{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 PyObject *bases = NULL;
2646 Py_ssize_t i, n;
2647 int r = 0;
Neil Schemenauer6b471292001-10-18 03:18:43 +00002648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002649 while (1) {
2650 if (derived == cls)
2651 return 1;
2652 bases = abstract_get_bases(derived);
2653 if (bases == NULL) {
2654 if (PyErr_Occurred())
2655 return -1;
2656 return 0;
2657 }
2658 n = PyTuple_GET_SIZE(bases);
2659 if (n == 0) {
2660 Py_DECREF(bases);
2661 return 0;
2662 }
2663 /* Avoid recursivity in the single inheritance case */
2664 if (n == 1) {
2665 derived = PyTuple_GET_ITEM(bases, 0);
2666 Py_DECREF(bases);
2667 continue;
2668 }
2669 for (i = 0; i < n; i++) {
2670 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls);
2671 if (r != 0)
2672 break;
2673 }
2674 Py_DECREF(bases);
2675 return r;
2676 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002677}
2678
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002679static int
2680check_class(PyObject *cls, const char *error)
2681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 PyObject *bases = abstract_get_bases(cls);
2683 if (bases == NULL) {
2684 /* Do not mask errors. */
2685 if (!PyErr_Occurred())
2686 PyErr_SetString(PyExc_TypeError, error);
2687 return 0;
2688 }
2689 Py_DECREF(bases);
2690 return -1;
Walter Dörwaldd9a6ad32002-12-12 16:41:44 +00002691}
2692
Brett Cannon4f653312004-03-20 22:52:14 +00002693static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002694recursive_isinstance(PyObject *inst, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 PyObject *icls;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 int retval = 0;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002698 _Py_IDENTIFIER(__class__);
Guido van Rossum03bc7d32003-02-12 03:32:58 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 if (PyType_Check(cls)) {
2701 retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls);
2702 if (retval == 0) {
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002703 PyObject *c = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 if (c == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002705 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002706 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002707 else
R. David Murray6bb99892010-11-20 16:33:30 +00002708 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 }
2710 else {
2711 if (c != (PyObject *)(inst->ob_type) &&
2712 PyType_Check(c))
2713 retval = PyType_IsSubtype(
2714 (PyTypeObject *)c,
2715 (PyTypeObject *)cls);
2716 Py_DECREF(c);
2717 }
2718 }
2719 }
2720 else {
2721 if (!check_class(cls,
Benjamin Petersone893af52010-06-28 19:43:42 +00002722 "isinstance() arg 2 must be a type or tuple of types"))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 return -1;
Benjamin Peterson9fc9bf42012-03-20 23:26:41 -04002724 icls = _PyObject_GetAttrId(inst, &PyId___class__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 if (icls == NULL) {
Benjamin Peterson72288d42010-11-20 17:21:08 +00002726 if (PyErr_ExceptionMatches(PyExc_AttributeError))
R. David Murray6bb99892010-11-20 16:33:30 +00002727 PyErr_Clear();
Benjamin Peterson72288d42010-11-20 17:21:08 +00002728 else
R. David Murray6bb99892010-11-20 16:33:30 +00002729 retval = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 }
2731 else {
2732 retval = abstract_issubclass(icls, cls);
2733 Py_DECREF(icls);
2734 }
2735 }
Guido van Rossum823649d2001-03-21 18:40:58 +00002736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 return retval;
Guido van Rossum823649d2001-03-21 18:40:58 +00002738}
2739
2740int
Brett Cannon4f653312004-03-20 22:52:14 +00002741PyObject_IsInstance(PyObject *inst, PyObject *cls)
2742{
Benjamin Petersonce798522012-01-22 11:24:29 -05002743 _Py_IDENTIFIER(__instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 PyObject *checker;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 /* Quick test for an exact match */
2747 if (Py_TYPE(inst) == (PyTypeObject *)cls)
2748 return 1;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00002749
Georg Brandl72b8a802014-10-03 09:26:37 +02002750 /* We know what type's __instancecheck__ does. */
2751 if (PyType_CheckExact(cls)) {
2752 return recursive_isinstance(inst, cls);
2753 }
2754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 if (PyTuple_Check(cls)) {
2756 Py_ssize_t i;
2757 Py_ssize_t n;
2758 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 if (Py_EnterRecursiveCall(" in __instancecheck__"))
2761 return -1;
2762 n = PyTuple_GET_SIZE(cls);
2763 for (i = 0; i < n; ++i) {
2764 PyObject *item = PyTuple_GET_ITEM(cls, i);
2765 r = PyObject_IsInstance(inst, item);
2766 if (r != 0)
2767 /* either found it, or got an error */
2768 break;
2769 }
2770 Py_LeaveRecursiveCall();
2771 return r;
2772 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002773
Benjamin Petersonce798522012-01-22 11:24:29 -05002774 checker = _PyObject_LookupSpecial(cls, &PyId___instancecheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 if (checker != NULL) {
2776 PyObject *res;
2777 int ok = -1;
2778 if (Py_EnterRecursiveCall(" in __instancecheck__")) {
2779 Py_DECREF(checker);
2780 return ok;
2781 }
2782 res = PyObject_CallFunctionObjArgs(checker, inst, NULL);
2783 Py_LeaveRecursiveCall();
2784 Py_DECREF(checker);
2785 if (res != NULL) {
2786 ok = PyObject_IsTrue(res);
2787 Py_DECREF(res);
2788 }
2789 return ok;
2790 }
2791 else if (PyErr_Occurred())
2792 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002793 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002794 return recursive_isinstance(inst, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002795}
2796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797static int
Antoine Pitrouec569b72008-08-26 22:40:48 +00002798recursive_issubclass(PyObject *derived, PyObject *cls)
Guido van Rossum823649d2001-03-21 18:40:58 +00002799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 if (PyType_Check(cls) && PyType_Check(derived)) {
2801 /* Fast path (non-recursive) */
2802 return PyType_IsSubtype((PyTypeObject *)derived, (PyTypeObject *)cls);
2803 }
2804 if (!check_class(derived,
2805 "issubclass() arg 1 must be a class"))
2806 return -1;
2807 if (!check_class(cls,
2808 "issubclass() arg 2 must be a class"
2809 " or tuple of classes"))
2810 return -1;
Guido van Rossum823649d2001-03-21 18:40:58 +00002811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 return abstract_issubclass(derived, cls);
Guido van Rossum823649d2001-03-21 18:40:58 +00002813}
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002814
Brett Cannon4f653312004-03-20 22:52:14 +00002815int
2816PyObject_IsSubclass(PyObject *derived, PyObject *cls)
2817{
Benjamin Petersonce798522012-01-22 11:24:29 -05002818 _Py_IDENTIFIER(__subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 PyObject *checker;
Georg Brandldcfe8e42009-05-17 08:22:45 +00002820
Georg Brandl72b8a802014-10-03 09:26:37 +02002821 /* We know what type's __subclasscheck__ does. */
2822 if (PyType_CheckExact(cls)) {
2823 /* Quick test for an exact match */
2824 if (derived == cls)
2825 return 1;
2826 return recursive_issubclass(derived, cls);
2827 }
2828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 if (PyTuple_Check(cls)) {
2830 Py_ssize_t i;
2831 Py_ssize_t n;
2832 int r = 0;
Antoine Pitrouec569b72008-08-26 22:40:48 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 if (Py_EnterRecursiveCall(" in __subclasscheck__"))
2835 return -1;
2836 n = PyTuple_GET_SIZE(cls);
2837 for (i = 0; i < n; ++i) {
2838 PyObject *item = PyTuple_GET_ITEM(cls, i);
2839 r = PyObject_IsSubclass(derived, item);
2840 if (r != 0)
2841 /* either found it, or got an error */
2842 break;
2843 }
2844 Py_LeaveRecursiveCall();
2845 return r;
2846 }
Benjamin Peterson88fe5f92009-05-16 21:55:24 +00002847
Benjamin Petersonce798522012-01-22 11:24:29 -05002848 checker = _PyObject_LookupSpecial(cls, &PyId___subclasscheck__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (checker != NULL) {
2850 PyObject *res;
2851 int ok = -1;
2852 if (Py_EnterRecursiveCall(" in __subclasscheck__")) {
2853 Py_DECREF(checker);
2854 return ok;
2855 }
2856 res = PyObject_CallFunctionObjArgs(checker, derived, NULL);
2857 Py_LeaveRecursiveCall();
2858 Py_DECREF(checker);
2859 if (res != NULL) {
2860 ok = PyObject_IsTrue(res);
2861 Py_DECREF(res);
2862 }
2863 return ok;
2864 }
2865 else if (PyErr_Occurred())
2866 return -1;
Georg Brandl72b8a802014-10-03 09:26:37 +02002867 /* Probably never reached anymore. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 return recursive_issubclass(derived, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002869}
2870
2871int
2872_PyObject_RealIsInstance(PyObject *inst, PyObject *cls)
2873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 return recursive_isinstance(inst, cls);
Antoine Pitrouec569b72008-08-26 22:40:48 +00002875}
2876
2877int
2878_PyObject_RealIsSubclass(PyObject *derived, PyObject *cls)
2879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 return recursive_issubclass(derived, cls);
Brett Cannon4f653312004-03-20 22:52:14 +00002881}
2882
2883
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002884PyObject *
2885PyObject_GetIter(PyObject *o)
2886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 PyTypeObject *t = o->ob_type;
2888 getiterfunc f = NULL;
2889 f = t->tp_iter;
2890 if (f == NULL) {
2891 if (PySequence_Check(o))
2892 return PySeqIter_New(o);
2893 return type_error("'%.200s' object is not iterable", o);
2894 }
2895 else {
2896 PyObject *res = (*f)(o);
2897 if (res != NULL && !PyIter_Check(res)) {
2898 PyErr_Format(PyExc_TypeError,
2899 "iter() returned non-iterator "
2900 "of type '%.100s'",
2901 res->ob_type->tp_name);
2902 Py_DECREF(res);
2903 res = NULL;
2904 }
2905 return res;
2906 }
Guido van Rossum213c7a62001-04-23 14:08:49 +00002907}
2908
Tim Petersf4848da2001-05-05 00:14:56 +00002909/* Return next item.
2910 * If an error occurs, return NULL. PyErr_Occurred() will be true.
2911 * If the iteration terminates normally, return NULL and clear the
2912 * PyExc_StopIteration exception (if it was set). PyErr_Occurred()
2913 * will be false.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 * Else return the next object. PyErr_Occurred() will be false.
Tim Petersf4848da2001-05-05 00:14:56 +00002915 */
Guido van Rossum213c7a62001-04-23 14:08:49 +00002916PyObject *
2917PyIter_Next(PyObject *iter)
2918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 PyObject *result;
2920 result = (*iter->ob_type->tp_iternext)(iter);
2921 if (result == NULL &&
2922 PyErr_Occurred() &&
2923 PyErr_ExceptionMatches(PyExc_StopIteration))
2924 PyErr_Clear();
2925 return result;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002926}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002927
2928
2929/*
2930 * Flatten a sequence of bytes() objects into a C array of
2931 * NULL terminated string pointers with a NULL char* terminating the array.
2932 * (ie: an argv or env list)
2933 *
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002934 * Memory allocated for the returned list is allocated using PyMem_Malloc()
2935 * and MUST be freed by _Py_FreeCharPArray().
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002936 */
2937char *const *
2938_PySequence_BytesToCharpArray(PyObject* self)
2939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 char **array;
2941 Py_ssize_t i, argc;
2942 PyObject *item = NULL;
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002943 Py_ssize_t size;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 argc = PySequence_Size(self);
2946 if (argc == -1)
2947 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002948
Stefan Krah7cacd2e2012-08-21 08:16:09 +02002949 assert(argc >= 0);
2950
2951 if ((size_t)argc > (PY_SSIZE_T_MAX-sizeof(char *)) / sizeof(char *)) {
2952 PyErr_NoMemory();
2953 return NULL;
2954 }
2955
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002956 array = PyMem_Malloc((argc + 1) * sizeof(char *));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002957 if (array == NULL) {
2958 PyErr_NoMemory();
2959 return NULL;
2960 }
2961 for (i = 0; i < argc; ++i) {
2962 char *data;
2963 item = PySequence_GetItem(self, i);
Stefan Krahfd24f9e2012-08-20 11:04:24 +02002964 if (item == NULL) {
2965 /* NULL terminate before freeing. */
2966 array[i] = NULL;
2967 goto fail;
2968 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 data = PyBytes_AsString(item);
2970 if (data == NULL) {
2971 /* NULL terminate before freeing. */
2972 array[i] = NULL;
2973 goto fail;
2974 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002975 size = PyBytes_GET_SIZE(item) + 1;
2976 array[i] = PyMem_Malloc(size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 if (!array[i]) {
2978 PyErr_NoMemory();
2979 goto fail;
2980 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02002981 memcpy(array[i], data, size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 Py_DECREF(item);
2983 }
2984 array[argc] = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 return array;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002987
2988fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 Py_XDECREF(item);
2990 _Py_FreeCharPArray(array);
2991 return NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00002992}
2993
2994
2995/* Free's a NULL terminated char** array of C strings. */
2996void
2997_Py_FreeCharPArray(char *const array[])
2998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 Py_ssize_t i;
3000 for (i = 0; array[i] != NULL; ++i) {
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02003001 PyMem_Free(array[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 }
Victor Stinner0e2d3cf2013-07-07 17:22:41 +02003003 PyMem_Free((void*)array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00003004}