blob: fc2d2742dd2ca69adf3b96c39565c624d637e6a4 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Tuple object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Victor Stinnerbcda8f12018-11-21 22:27:47 +01005#include "pycore_object.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01006#include "pycore_pystate.h"
Victor Stinnere281f7d2018-11-01 02:30:36 +01007#include "pycore_accu.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00008
Serhiy Storchaka0b561592017-03-19 08:47:58 +02009/*[clinic input]
10class tuple "PyTupleObject *" "&PyTuple_Type"
11[clinic start generated code]*/
12/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f051ba3cfdf9a189]*/
13
14#include "clinic/tupleobject.c.h"
15
Guido van Rossum5ce78f82000-04-21 21:15:05 +000016/* Speed optimization to avoid frequent malloc/free of small tuples */
Christian Heimes2202f872008-02-06 14:31:34 +000017#ifndef PyTuple_MAXSAVESIZE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018#define PyTuple_MAXSAVESIZE 20 /* Largest tuple to save on free list */
Guido van Rossum5ce78f82000-04-21 21:15:05 +000019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020#ifndef PyTuple_MAXFREELIST
Christian Heimes2202f872008-02-06 14:31:34 +000021#define PyTuple_MAXFREELIST 2000 /* Maximum number of tuples of each size to save */
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000022#endif
23
Christian Heimes2202f872008-02-06 14:31:34 +000024#if PyTuple_MAXSAVESIZE > 0
25/* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000026 tuple () of which at most one instance will be allocated.
27*/
Christian Heimes2202f872008-02-06 14:31:34 +000028static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
29static int numfree[PyTuple_MAXSAVESIZE];
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000030#endif
31#ifdef COUNT_ALLOCS
Pablo Galindo49c75a82018-10-28 15:02:17 +000032Py_ssize_t _Py_fast_tuple_allocs;
33Py_ssize_t _Py_tuple_zero_allocs;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000034#endif
35
Antoine Pitrou3a652b12009-03-23 18:52:06 +000036/* Debug statistic to count GC tracking of tuples.
37 Please note that tuples are only untracked when considered by the GC, and
38 many of them will be dead before. Therefore, a tracking rate close to 100%
39 does not necessarily prove that the heuristic is inefficient.
40*/
41#ifdef SHOW_TRACK_COUNT
42static Py_ssize_t count_untracked = 0;
43static Py_ssize_t count_tracked = 0;
44
45static void
46show_track(void)
47{
Victor Stinnercaba55b2018-08-03 15:33:52 +020048 PyInterpreterState *interp = _PyInterpreterState_Get();
Victor Stinner331a6a52019-05-27 16:39:22 +020049 if (!interp->config.show_alloc_count) {
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +030050 return;
Victor Stinner25420fe2017-11-20 18:12:22 -080051 }
Serhiy Storchaka7e160ce2016-07-03 21:03:53 +030052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000053 fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
54 count_tracked + count_untracked);
55 fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
56 "d\n", count_tracked);
57 fprintf(stderr, "%.2f%% tuple tracking rate\n\n",
58 (100.0*count_tracked/(count_untracked+count_tracked)));
Antoine Pitrou3a652b12009-03-23 18:52:06 +000059}
60#endif
61
David Malcolm49526f42012-06-22 14:55:41 -040062/* Print summary info about the state of the optimized allocator */
63void
64_PyTuple_DebugMallocStats(FILE *out)
65{
66#if PyTuple_MAXSAVESIZE > 0
67 int i;
68 char buf[128];
69 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
70 PyOS_snprintf(buf, sizeof(buf),
71 "free %d-sized PyTupleObject", i);
72 _PyDebugAllocatorStats(out,
73 buf,
74 numfree[i], _PyObject_VAR_SIZE(&PyTuple_Type, i));
75 }
76#endif
77}
Antoine Pitrou3a652b12009-03-23 18:52:06 +000078
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020080PyTuple_New(Py_ssize_t size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +020082 PyTupleObject *op;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 Py_ssize_t i;
84 if (size < 0) {
85 PyErr_BadInternalCall();
86 return NULL;
87 }
Christian Heimes2202f872008-02-06 14:31:34 +000088#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 if (size == 0 && free_list[0]) {
90 op = free_list[0];
91 Py_INCREF(op);
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000092#ifdef COUNT_ALLOCS
Pablo Galindo49c75a82018-10-28 15:02:17 +000093 _Py_tuple_zero_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 return (PyObject *) op;
96 }
97 if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
98 free_list[size] = (PyTupleObject *) op->ob_item[0];
99 numfree[size]--;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000100#ifdef COUNT_ALLOCS
Pablo Galindo49c75a82018-10-28 15:02:17 +0000101 _Py_fast_tuple_allocs++;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 /* Inline PyObject_InitVar */
Guido van Rossum68055ce1998-12-11 14:56:38 +0000104#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 Py_SIZE(op) = size;
106 Py_TYPE(op) = &PyTuple_Type;
Guido van Rossum68055ce1998-12-11 14:56:38 +0000107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 _Py_NewReference((PyObject *)op);
109 }
110 else
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000113 /* Check for overflow */
Victor Stinner049e5092014-08-17 22:20:00 +0200114 if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - sizeof(PyTupleObject) -
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100115 sizeof(PyObject *)) / sizeof(PyObject *)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000116 return PyErr_NoMemory();
117 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
119 if (op == NULL)
120 return NULL;
121 }
122 for (i=0; i < size; i++)
123 op->ob_item[i] = NULL;
Christian Heimes2202f872008-02-06 14:31:34 +0000124#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 if (size == 0) {
126 free_list[0] = op;
127 ++numfree[0];
128 Py_INCREF(op); /* extra INCREF so that this is never freed */
129 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000130#endif
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000131#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 count_tracked++;
Antoine Pitrouacc5d6b2009-03-23 19:19:54 +0000133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 _PyObject_GC_TRACK(op);
135 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000136}
137
Martin v. Löwis18e16552006-02-15 17:27:45 +0000138Py_ssize_t
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200139PyTuple_Size(PyObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 if (!PyTuple_Check(op)) {
142 PyErr_BadInternalCall();
143 return -1;
144 }
145 else
146 return Py_SIZE(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147}
148
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200150PyTuple_GetItem(PyObject *op, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 if (!PyTuple_Check(op)) {
153 PyErr_BadInternalCall();
154 return NULL;
155 }
156 if (i < 0 || i >= Py_SIZE(op)) {
157 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
158 return NULL;
159 }
160 return ((PyTupleObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
163int
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200164PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200166 PyObject **p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
168 Py_XDECREF(newitem);
169 PyErr_BadInternalCall();
170 return -1;
171 }
172 if (i < 0 || i >= Py_SIZE(op)) {
173 Py_XDECREF(newitem);
174 PyErr_SetString(PyExc_IndexError,
175 "tuple assignment index out of range");
176 return -1;
177 }
178 p = ((PyTupleObject *)op) -> ob_item + i;
Serhiy Storchakaec397562016-04-06 09:50:03 +0300179 Py_XSETREF(*p, newitem);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181}
182
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000183void
184_PyTuple_MaybeUntrack(PyObject *op)
185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 PyTupleObject *t;
187 Py_ssize_t i, n;
188
189 if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
190 return;
191 t = (PyTupleObject *) op;
192 n = Py_SIZE(t);
193 for (i = 0; i < n; i++) {
194 PyObject *elt = PyTuple_GET_ITEM(t, i);
195 /* Tuple with NULL elements aren't
196 fully constructed, don't untrack
197 them yet. */
198 if (!elt ||
199 _PyObject_GC_MAY_BE_TRACKED(elt))
200 return;
201 }
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000202#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 count_tracked--;
204 count_untracked++;
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 _PyObject_GC_UNTRACK(op);
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000207}
208
Raymond Hettingercb2da432003-10-12 18:24:34 +0000209PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000210PyTuple_Pack(Py_ssize_t n, ...)
Raymond Hettingercb2da432003-10-12 18:24:34 +0000211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 Py_ssize_t i;
213 PyObject *o;
214 PyObject *result;
215 PyObject **items;
216 va_list vargs;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 va_start(vargs, n);
219 result = PyTuple_New(n);
Christian Heimesd5a88042012-09-10 02:54:51 +0200220 if (result == NULL) {
221 va_end(vargs);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 return NULL;
Christian Heimesd5a88042012-09-10 02:54:51 +0200223 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 items = ((PyTupleObject *)result)->ob_item;
225 for (i = 0; i < n; i++) {
226 o = va_arg(vargs, PyObject *);
227 Py_INCREF(o);
228 items[i] = o;
229 }
230 va_end(vargs);
231 return result;
Raymond Hettingercb2da432003-10-12 18:24:34 +0000232}
233
234
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235/* Methods */
236
237static void
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200238tupledealloc(PyTupleObject *op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200240 Py_ssize_t i;
241 Py_ssize_t len = Py_SIZE(op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 PyObject_GC_UnTrack(op);
Jeroen Demeyer351c6742019-05-10 19:21:11 +0200243 Py_TRASHCAN_BEGIN(op, tupledealloc)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (len > 0) {
245 i = len;
246 while (--i >= 0)
247 Py_XDECREF(op->ob_item[i]);
Christian Heimes2202f872008-02-06 14:31:34 +0000248#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 if (len < PyTuple_MAXSAVESIZE &&
250 numfree[len] < PyTuple_MAXFREELIST &&
251 Py_TYPE(op) == &PyTuple_Type)
252 {
253 op->ob_item[0] = (PyObject *) free_list[len];
254 numfree[len]++;
255 free_list[len] = op;
256 goto done; /* return */
257 }
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +0000258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 }
260 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000261done:
Jeroen Demeyer351c6742019-05-10 19:21:11 +0200262 Py_TRASHCAN_END
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263}
264
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000265static PyObject *
Fred Drakeba096332000-07-09 07:04:36 +0000266tuplerepr(PyTupleObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 Py_ssize_t i, n;
Victor Stinner88a9cd92013-11-19 12:59:46 +0100269 _PyUnicodeWriter writer;
Tim Petersa7259592001-06-16 05:11:17 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 n = Py_SIZE(v);
272 if (n == 0)
273 return PyUnicode_FromString("()");
Tim Petersa7259592001-06-16 05:11:17 +0000274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 /* While not mutable, it is still possible to end up with a cycle in a
276 tuple through an object that stores itself within a tuple (and thus
277 infinitely asks for the repr of itself). This should only be
278 possible within a type. */
279 i = Py_ReprEnter((PyObject *)v);
280 if (i != 0) {
281 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
282 }
Guido van Rossum8ce8a782007-11-01 19:42:39 +0000283
Victor Stinner88a9cd92013-11-19 12:59:46 +0100284 _PyUnicodeWriter_Init(&writer);
285 writer.overallocate = 1;
286 if (Py_SIZE(v) > 1) {
287 /* "(" + "1" + ", 2" * (len - 1) + ")" */
288 writer.min_length = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
289 }
290 else {
291 /* "(1,)" */
292 writer.min_length = 4;
293 }
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200294
Victor Stinner88a9cd92013-11-19 12:59:46 +0100295 if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0)
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200296 goto error;
Tim Petersa7259592001-06-16 05:11:17 +0000297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 /* Do repr() on each element. */
299 for (i = 0; i < n; ++i) {
Victor Stinner88a9cd92013-11-19 12:59:46 +0100300 PyObject *s;
301
302 if (i > 0) {
303 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
304 goto error;
305 }
306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 s = PyObject_Repr(v->ob_item[i]);
Victor Stinner88a9cd92013-11-19 12:59:46 +0100308 if (s == NULL)
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200309 goto error;
Victor Stinner88a9cd92013-11-19 12:59:46 +0100310
311 if (_PyUnicodeWriter_WriteStr(&writer, s) < 0) {
312 Py_DECREF(s);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200313 goto error;
Victor Stinner88a9cd92013-11-19 12:59:46 +0100314 }
315 Py_DECREF(s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 }
Victor Stinner88a9cd92013-11-19 12:59:46 +0100317
318 writer.overallocate = 0;
319 if (n > 1) {
320 if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0)
321 goto error;
322 }
323 else {
324 if (_PyUnicodeWriter_WriteASCIIString(&writer, ",)", 2) < 0)
325 goto error;
326 }
Tim Petersa7259592001-06-16 05:11:17 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 Py_ReprLeave((PyObject *)v);
Victor Stinner88a9cd92013-11-19 12:59:46 +0100329 return _PyUnicodeWriter_Finish(&writer);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200330
331error:
Victor Stinner88a9cd92013-11-19 12:59:46 +0100332 _PyUnicodeWriter_Dealloc(&writer);
Antoine Pitroueeb7eea2011-10-06 18:57:27 +0200333 Py_ReprLeave((PyObject *)v);
334 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335}
336
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000337
jdemeyeraeb1be52018-10-28 02:06:38 +0200338/* Hash for tuples. This is a slightly simplified version of the xxHash
339 non-cryptographic hash:
340 - we do not use any parallellism, there is only 1 accumulator.
341 - we drop the final mixing since this is just a permutation of the
342 output space: it does not help against collisions.
343 - at the end, we mangle the length with a single constant.
344 For the xxHash specification, see
345 https://github.com/Cyan4973/xxHash/blob/master/doc/xxhash_spec.md
Christian Heimes34bdeb52013-01-07 21:24:18 +0100346
jdemeyeraeb1be52018-10-28 02:06:38 +0200347 Below are the official constants from the xxHash specification. Optimizing
348 compilers should emit a single "rotate" instruction for the
349 _PyHASH_XXROTATE() expansion. If that doesn't happen for some important
350 platform, the macro could be changed to expand to a platform-specific rotate
351 spelling instead.
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000352*/
jdemeyeraeb1be52018-10-28 02:06:38 +0200353#if SIZEOF_PY_UHASH_T > 4
354#define _PyHASH_XXPRIME_1 ((Py_uhash_t)11400714785074694791ULL)
355#define _PyHASH_XXPRIME_2 ((Py_uhash_t)14029467366897019727ULL)
356#define _PyHASH_XXPRIME_5 ((Py_uhash_t)2870177450012600261ULL)
357#define _PyHASH_XXROTATE(x) ((x << 31) | (x >> 33)) /* Rotate left 31 bits */
358#else
359#define _PyHASH_XXPRIME_1 ((Py_uhash_t)2654435761UL)
360#define _PyHASH_XXPRIME_2 ((Py_uhash_t)2246822519UL)
361#define _PyHASH_XXPRIME_5 ((Py_uhash_t)374761393UL)
362#define _PyHASH_XXROTATE(x) ((x << 13) | (x >> 19)) /* Rotate left 13 bits */
363#endif
Raymond Hettinger4ec44e82004-06-04 06:35:20 +0000364
jdemeyeraeb1be52018-10-28 02:06:38 +0200365/* Tests have shown that it's not worth to cache the hash value, see
366 https://bugs.python.org/issue9685 */
Benjamin Peterson8f67d082010-10-17 20:54:53 +0000367static Py_hash_t
Fred Drakeba096332000-07-09 07:04:36 +0000368tuplehash(PyTupleObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000369{
jdemeyeraeb1be52018-10-28 02:06:38 +0200370 Py_ssize_t i, len = Py_SIZE(v);
371 PyObject **item = v->ob_item;
372
373 Py_uhash_t acc = _PyHASH_XXPRIME_5;
374 for (i = 0; i < len; i++) {
375 Py_uhash_t lane = PyObject_Hash(item[i]);
376 if (lane == (Py_uhash_t)-1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 return -1;
jdemeyeraeb1be52018-10-28 02:06:38 +0200378 }
379 acc += lane * _PyHASH_XXPRIME_2;
380 acc = _PyHASH_XXROTATE(acc);
381 acc *= _PyHASH_XXPRIME_1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 }
jdemeyeraeb1be52018-10-28 02:06:38 +0200383
384 /* Add input length, mangled to keep the historical value of hash(()). */
385 acc += len ^ (_PyHASH_XXPRIME_5 ^ 3527539UL);
386
387 if (acc == (Py_uhash_t)-1) {
388 return 1546275796;
389 }
390 return acc;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000391}
392
Martin v. Löwis18e16552006-02-15 17:27:45 +0000393static Py_ssize_t
Fred Drakeba096332000-07-09 07:04:36 +0000394tuplelength(PyTupleObject *a)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 return Py_SIZE(a);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397}
398
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000399static int
Fred Drakeba096332000-07-09 07:04:36 +0000400tuplecontains(PyTupleObject *a, PyObject *el)
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 Py_ssize_t i;
403 int cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
406 cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
407 Py_EQ);
408 return cmp;
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000409}
410
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000411static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200412tupleitem(PyTupleObject *a, Py_ssize_t i)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 if (i < 0 || i >= Py_SIZE(a)) {
415 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
416 return NULL;
417 }
418 Py_INCREF(a->ob_item[i]);
419 return a->ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420}
421
Sergey Fedoseev234531b2019-02-25 21:59:12 +0500422PyObject *
423_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n)
424{
425 PyTupleObject *tuple = (PyTupleObject *)PyTuple_New(n);
426 if (tuple == NULL) {
427 return NULL;
428 }
429 PyObject **dst = tuple->ob_item;
430 for (Py_ssize_t i = 0; i < n; i++) {
431 PyObject *item = src[i];
432 Py_INCREF(item);
433 dst[i] = item;
434 }
435 return (PyObject *)tuple;
436}
437
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200439tupleslice(PyTupleObject *a, Py_ssize_t ilow,
440 Py_ssize_t ihigh)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 if (ilow < 0)
443 ilow = 0;
444 if (ihigh > Py_SIZE(a))
445 ihigh = Py_SIZE(a);
446 if (ihigh < ilow)
447 ihigh = ilow;
448 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
449 Py_INCREF(a);
450 return (PyObject *)a;
451 }
Sergey Fedoseev234531b2019-02-25 21:59:12 +0500452 return _PyTuple_FromArray(a->ob_item + ilow, ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453}
454
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000455PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 if (op == NULL || !PyTuple_Check(op)) {
459 PyErr_BadInternalCall();
460 return NULL;
461 }
462 return tupleslice((PyTupleObject *)op, i, j);
Guido van Rossum7c36ad71992-01-14 18:45:33 +0000463}
464
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465static PyObject *
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200466tupleconcat(PyTupleObject *a, PyObject *bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200468 Py_ssize_t size;
469 Py_ssize_t i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 PyObject **src, **dest;
471 PyTupleObject *np;
Serhiy Storchaka98e80c22017-03-06 23:39:35 +0200472 if (Py_SIZE(a) == 0 && PyTuple_CheckExact(bb)) {
473 Py_INCREF(bb);
474 return bb;
475 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (!PyTuple_Check(bb)) {
477 PyErr_Format(PyExc_TypeError,
478 "can only concatenate tuple (not \"%.200s\") to tuple",
479 Py_TYPE(bb)->tp_name);
480 return NULL;
481 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482#define b ((PyTupleObject *)bb)
Serhiy Storchaka98e80c22017-03-06 23:39:35 +0200483 if (Py_SIZE(b) == 0 && PyTuple_CheckExact(a)) {
484 Py_INCREF(a);
485 return (PyObject *)a;
486 }
Martin Panterb93d8632016-07-25 02:39:20 +0000487 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 return PyErr_NoMemory();
Martin Panterb93d8632016-07-25 02:39:20 +0000489 size = Py_SIZE(a) + Py_SIZE(b);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 np = (PyTupleObject *) PyTuple_New(size);
491 if (np == NULL) {
492 return NULL;
493 }
494 src = a->ob_item;
495 dest = np->ob_item;
496 for (i = 0; i < Py_SIZE(a); i++) {
497 PyObject *v = src[i];
498 Py_INCREF(v);
499 dest[i] = v;
500 }
501 src = b->ob_item;
502 dest = np->ob_item + Py_SIZE(a);
503 for (i = 0; i < Py_SIZE(b); i++) {
504 PyObject *v = src[i];
505 Py_INCREF(v);
506 dest[i] = v;
507 }
508 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509#undef b
510}
511
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000513tuplerepeat(PyTupleObject *a, Py_ssize_t n)
Guido van Rossumb8393da1991-06-04 19:35:24 +0000514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 Py_ssize_t i, j;
516 Py_ssize_t size;
517 PyTupleObject *np;
518 PyObject **p, **items;
519 if (n < 0)
520 n = 0;
521 if (Py_SIZE(a) == 0 || n == 1) {
522 if (PyTuple_CheckExact(a)) {
523 /* Since tuples are immutable, we can return a shared
524 copy in this case */
525 Py_INCREF(a);
526 return (PyObject *)a;
527 }
528 if (Py_SIZE(a) == 0)
529 return PyTuple_New(0);
530 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100531 if (n > PY_SSIZE_T_MAX / Py_SIZE(a))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 return PyErr_NoMemory();
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100533 size = Py_SIZE(a) * n;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 np = (PyTupleObject *) PyTuple_New(size);
535 if (np == NULL)
536 return NULL;
537 p = np->ob_item;
538 items = a->ob_item;
539 for (i = 0; i < n; i++) {
540 for (j = 0; j < Py_SIZE(a); j++) {
541 *p = items[j];
542 Py_INCREF(*p);
543 p++;
544 }
545 }
546 return (PyObject *) np;
Guido van Rossumb8393da1991-06-04 19:35:24 +0000547}
548
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200549/*[clinic input]
550tuple.index
Raymond Hettinger65baa342008-02-07 00:41:02 +0000551
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200552 value: object
Serhiy Storchakad4edfc92017-03-30 18:29:23 +0300553 start: slice_index(accept={int}) = 0
554 stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200555 /
556
557Return first index of value.
558
559Raises ValueError if the value is not present.
560[clinic start generated code]*/
561
562static PyObject *
563tuple_index_impl(PyTupleObject *self, PyObject *value, Py_ssize_t start,
564 Py_ssize_t stop)
Serhiy Storchakad4edfc92017-03-30 18:29:23 +0300565/*[clinic end generated code: output=07b6f9f3cb5c33eb input=fb39e9874a21fe3f]*/
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200566{
567 Py_ssize_t i;
568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 if (start < 0) {
570 start += Py_SIZE(self);
571 if (start < 0)
572 start = 0;
573 }
574 if (stop < 0) {
575 stop += Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 }
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200577 else if (stop > Py_SIZE(self)) {
578 stop = Py_SIZE(self);
579 }
580 for (i = start; i < stop; i++) {
581 int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 if (cmp > 0)
583 return PyLong_FromSsize_t(i);
584 else if (cmp < 0)
585 return NULL;
586 }
587 PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
588 return NULL;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000589}
590
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200591/*[clinic input]
592tuple.count
593
594 value: object
595 /
596
597Return number of occurrences of value.
598[clinic start generated code]*/
599
Raymond Hettinger65baa342008-02-07 00:41:02 +0000600static PyObject *
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200601tuple_count(PyTupleObject *self, PyObject *value)
602/*[clinic end generated code: output=aa927affc5a97605 input=531721aff65bd772]*/
Raymond Hettinger65baa342008-02-07 00:41:02 +0000603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 Py_ssize_t count = 0;
605 Py_ssize_t i;
Raymond Hettinger65baa342008-02-07 00:41:02 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 for (i = 0; i < Py_SIZE(self); i++) {
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200608 int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (cmp > 0)
610 count++;
611 else if (cmp < 0)
612 return NULL;
613 }
614 return PyLong_FromSsize_t(count);
Raymond Hettinger65baa342008-02-07 00:41:02 +0000615}
616
Jeremy Hylton8caad492000-06-23 14:18:11 +0000617static int
618tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 Py_ssize_t i;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 for (i = Py_SIZE(o); --i >= 0; )
623 Py_VISIT(o->ob_item[i]);
624 return 0;
Jeremy Hylton8caad492000-06-23 14:18:11 +0000625}
626
Guido van Rossumf77bc622001-01-18 00:00:53 +0000627static PyObject *
628tuplerichcompare(PyObject *v, PyObject *w, int op)
629{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 PyTupleObject *vt, *wt;
631 Py_ssize_t i;
632 Py_ssize_t vlen, wlen;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000633
Brian Curtindfc80e32011-08-10 20:28:54 -0500634 if (!PyTuple_Check(v) || !PyTuple_Check(w))
635 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 vt = (PyTupleObject *)v;
638 wt = (PyTupleObject *)w;
Guido van Rossumf77bc622001-01-18 00:00:53 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 vlen = Py_SIZE(vt);
641 wlen = Py_SIZE(wt);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Note: the corresponding code for lists has an "early out" test
644 * here when op is EQ or NE and the lengths differ. That pays there,
645 * but Tim was unable to find any real code where EQ/NE tuple
646 * compares don't have the same length, so testing for it here would
647 * have cost without benefit.
648 */
Tim Petersd7ed3bf2001-05-15 20:12:59 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 /* Search for the first index where items are different.
651 * Note that because tuples are immutable, it's safe to reuse
652 * vlen and wlen across the comparison calls.
653 */
654 for (i = 0; i < vlen && i < wlen; i++) {
655 int k = PyObject_RichCompareBool(vt->ob_item[i],
656 wt->ob_item[i], Py_EQ);
657 if (k < 0)
658 return NULL;
659 if (!k)
660 break;
661 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 if (i >= vlen || i >= wlen) {
664 /* No more items to compare -- compare sizes */
stratakise8b19652017-11-02 11:32:54 +0100665 Py_RETURN_RICHCOMPARE(vlen, wlen, op);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 /* We have an item that differs -- shortcuts for EQ/NE */
669 if (op == Py_EQ) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200670 Py_RETURN_FALSE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 }
672 if (op == Py_NE) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200673 Py_RETURN_TRUE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
Guido van Rossumf77bc622001-01-18 00:00:53 +0000675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 /* Compare the final item again using the proper operator */
677 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
Guido van Rossumf77bc622001-01-18 00:00:53 +0000678}
679
Jeremy Hylton938ace62002-07-17 16:30:39 +0000680static PyObject *
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200681tuple_subtype_new(PyTypeObject *type, PyObject *iterable);
682
683/*[clinic input]
684@classmethod
685tuple.__new__ as tuple_new
686 iterable: object(c_default="NULL") = ()
687 /
688
689Built-in immutable sequence.
690
691If no argument is given, the constructor returns an empty tuple.
692If iterable is specified the tuple is initialized from iterable's items.
693
694If the argument is a tuple, the return value is the same object.
695[clinic start generated code]*/
Guido van Rossumae960af2001-08-30 03:11:59 +0000696
Tim Peters6d6c1a32001-08-02 04:15:00 +0000697static PyObject *
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200698tuple_new_impl(PyTypeObject *type, PyObject *iterable)
699/*[clinic end generated code: output=4546d9f0d469bce7 input=86963bcde633b5a2]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +0000700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 if (type != &PyTuple_Type)
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200702 return tuple_subtype_new(type, iterable);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200704 if (iterable == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 return PyTuple_New(0);
706 else
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200707 return PySequence_Tuple(iterable);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000708}
709
Guido van Rossumae960af2001-08-30 03:11:59 +0000710static PyObject *
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200711tuple_subtype_new(PyTypeObject *type, PyObject *iterable)
Guido van Rossumae960af2001-08-30 03:11:59 +0000712{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 PyObject *tmp, *newobj, *item;
714 Py_ssize_t i, n;
Guido van Rossumae960af2001-08-30 03:11:59 +0000715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 assert(PyType_IsSubtype(type, &PyTuple_Type));
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200717 tmp = tuple_new_impl(&PyTuple_Type, iterable);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 if (tmp == NULL)
719 return NULL;
720 assert(PyTuple_Check(tmp));
721 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
722 if (newobj == NULL)
723 return NULL;
724 for (i = 0; i < n; i++) {
725 item = PyTuple_GET_ITEM(tmp, i);
726 Py_INCREF(item);
727 PyTuple_SET_ITEM(newobj, i, item);
728 }
729 Py_DECREF(tmp);
730 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000731}
732
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000733static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 (lenfunc)tuplelength, /* sq_length */
735 (binaryfunc)tupleconcat, /* sq_concat */
736 (ssizeargfunc)tuplerepeat, /* sq_repeat */
737 (ssizeargfunc)tupleitem, /* sq_item */
738 0, /* sq_slice */
739 0, /* sq_ass_item */
740 0, /* sq_ass_slice */
741 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742};
743
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000744static PyObject*
745tuplesubscript(PyTupleObject* self, PyObject* item)
746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000747 if (PyIndex_Check(item)) {
748 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
749 if (i == -1 && PyErr_Occurred())
750 return NULL;
751 if (i < 0)
752 i += PyTuple_GET_SIZE(self);
753 return tupleitem(self, i);
754 }
755 else if (PySlice_Check(item)) {
Zackery Spytz14514d92019-05-17 01:13:03 -0600756 Py_ssize_t start, stop, step, slicelength, i;
757 size_t cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 PyObject* result;
759 PyObject* it;
760 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000761
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300762 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 return NULL;
764 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300765 slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
766 &stop, step);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 if (slicelength <= 0) {
769 return PyTuple_New(0);
770 }
771 else if (start == 0 && step == 1 &&
772 slicelength == PyTuple_GET_SIZE(self) &&
773 PyTuple_CheckExact(self)) {
774 Py_INCREF(self);
775 return (PyObject *)self;
776 }
777 else {
778 result = PyTuple_New(slicelength);
779 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 src = self->ob_item;
782 dest = ((PyTupleObject *)result)->ob_item;
783 for (cur = start, i = 0; i < slicelength;
784 cur += step, i++) {
785 it = src[cur];
786 Py_INCREF(it);
787 dest[i] = it;
788 }
789
790 return result;
791 }
792 }
793 else {
794 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400795 "tuple indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 Py_TYPE(item)->tp_name);
797 return NULL;
798 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000799}
800
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200801/*[clinic input]
802tuple.__getnewargs__
803[clinic start generated code]*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200805static PyObject *
806tuple___getnewargs___impl(PyTupleObject *self)
807/*[clinic end generated code: output=25e06e3ee56027e2 input=1aeb4b286a21639a]*/
808{
809 return Py_BuildValue("(N)", tupleslice(self, 0, Py_SIZE(self)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000810}
811
812static PyMethodDef tuple_methods[] = {
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200813 TUPLE___GETNEWARGS___METHODDEF
814 TUPLE_INDEX_METHODDEF
815 TUPLE_COUNT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000817};
818
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000819static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 (lenfunc)tuplelength,
821 (binaryfunc)tuplesubscript,
822 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000823};
824
Raymond Hettinger48923c52002-08-09 01:30:17 +0000825static PyObject *tuple_iter(PyObject *seq);
826
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827PyTypeObject PyTuple_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 PyVarObject_HEAD_INIT(&PyType_Type, 0)
829 "tuple",
830 sizeof(PyTupleObject) - sizeof(PyObject *),
831 sizeof(PyObject *),
832 (destructor)tupledealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200833 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 0, /* tp_getattr */
835 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200836 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 (reprfunc)tuplerepr, /* tp_repr */
838 0, /* tp_as_number */
839 &tuple_as_sequence, /* tp_as_sequence */
840 &tuple_as_mapping, /* tp_as_mapping */
841 (hashfunc)tuplehash, /* tp_hash */
842 0, /* tp_call */
843 0, /* tp_str */
844 PyObject_GenericGetAttr, /* tp_getattro */
845 0, /* tp_setattro */
846 0, /* tp_as_buffer */
847 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
848 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200849 tuple_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 (traverseproc)tupletraverse, /* tp_traverse */
851 0, /* tp_clear */
852 tuplerichcompare, /* tp_richcompare */
853 0, /* tp_weaklistoffset */
854 tuple_iter, /* tp_iter */
855 0, /* tp_iternext */
856 tuple_methods, /* tp_methods */
857 0, /* tp_members */
858 0, /* tp_getset */
859 0, /* tp_base */
860 0, /* tp_dict */
861 0, /* tp_descr_get */
862 0, /* tp_descr_set */
863 0, /* tp_dictoffset */
864 0, /* tp_init */
865 0, /* tp_alloc */
866 tuple_new, /* tp_new */
867 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000868};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000869
870/* The following function breaks the notion that tuples are immutable:
871 it changes the size of a tuple. We get away with this only if there
872 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000873 as creating a new tuple object and destroying the old one, only more
874 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000875 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000876
877int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000878_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000879{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200880 PyTupleObject *v;
881 PyTupleObject *sv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 Py_ssize_t i;
883 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 v = (PyTupleObject *) *pv;
886 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
887 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
888 *pv = 0;
889 Py_XDECREF(v);
890 PyErr_BadInternalCall();
891 return -1;
892 }
893 oldsize = Py_SIZE(v);
894 if (oldsize == newsize)
895 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 if (oldsize == 0) {
898 /* Empty tuples are often shared, so we should never
899 resize them in-place even if we do own the only
900 (current) reference */
901 Py_DECREF(v);
902 *pv = PyTuple_New(newsize);
903 return *pv == NULL ? -1 : 0;
904 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 /* XXX UNREF/NEWREF interface should be more symmetrical */
907 _Py_DEC_REFTOTAL;
908 if (_PyObject_GC_IS_TRACKED(v))
909 _PyObject_GC_UNTRACK(v);
910 _Py_ForgetReference((PyObject *) v);
911 /* DECREF items deleted by shrinkage */
912 for (i = newsize; i < oldsize; i++) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200913 Py_CLEAR(v->ob_item[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 }
915 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
916 if (sv == NULL) {
917 *pv = NULL;
918 PyObject_GC_Del(v);
919 return -1;
920 }
921 _Py_NewReference((PyObject *) sv);
922 /* Zero out items added by growing */
923 if (newsize > oldsize)
924 memset(&sv->ob_item[oldsize], 0,
925 sizeof(*sv->ob_item) * (newsize - oldsize));
926 *pv = (PyObject *) sv;
927 _PyObject_GC_TRACK(sv);
928 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000929}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000930
Christian Heimesa156e092008-02-16 07:38:31 +0000931int
932PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000935#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 int i;
937 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
938 PyTupleObject *p, *q;
939 p = free_list[i];
940 freelist_size += numfree[i];
941 free_list[i] = NULL;
942 numfree[i] = 0;
943 while (p) {
944 q = p;
945 p = (PyTupleObject *)(p->ob_item[0]);
946 PyObject_GC_Del(q);
947 }
948 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 return freelist_size;
Christian Heimesa156e092008-02-16 07:38:31 +0000951}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952
Christian Heimesa156e092008-02-16 07:38:31 +0000953void
954PyTuple_Fini(void)
955{
956#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 /* empty tuples are used all over the place and applications may
958 * rely on the fact that an empty tuple is a singleton. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200959 Py_CLEAR(free_list[0]);
Christian Heimesa156e092008-02-16 07:38:31 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 (void)PyTuple_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000962#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000963#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 show_track();
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000965#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000966}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000967
968/*********************** Tuple Iterator **************************/
969
970typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 PyObject_HEAD
Victor Stinnera2d56982013-06-05 00:11:34 +0200972 Py_ssize_t it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000974} tupleiterobject;
975
Raymond Hettinger48923c52002-08-09 01:30:17 +0000976static void
977tupleiter_dealloc(tupleiterobject *it)
978{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 _PyObject_GC_UNTRACK(it);
980 Py_XDECREF(it->it_seq);
981 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000982}
983
984static int
985tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 Py_VISIT(it->it_seq);
988 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000989}
990
Raymond Hettinger48923c52002-08-09 01:30:17 +0000991static PyObject *
992tupleiter_next(tupleiterobject *it)
993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 PyTupleObject *seq;
995 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 assert(it != NULL);
998 seq = it->it_seq;
999 if (seq == NULL)
1000 return NULL;
1001 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +00001002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 if (it->it_index < PyTuple_GET_SIZE(seq)) {
1004 item = PyTuple_GET_ITEM(seq, it->it_index);
1005 ++it->it_index;
1006 Py_INCREF(item);
1007 return item;
1008 }
Raymond Hettinger48923c52002-08-09 01:30:17 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03001011 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +00001013}
1014
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001015static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301016tupleiter_len(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
Raymond Hettinger435bf582004-03-18 22:43:10 +00001017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 Py_ssize_t len = 0;
1019 if (it->it_seq)
1020 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
1021 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +00001022}
1023
Armin Rigof5b3e362006-02-11 21:32:43 +00001024PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001025
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001026static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301027tupleiter_reduce(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001028{
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001029 _Py_IDENTIFIER(iter);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001030 if (it->it_seq)
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001031 return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001032 it->it_seq, it->it_index);
1033 else
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001034 return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001035}
1036
1037static PyObject *
1038tupleiter_setstate(tupleiterobject *it, PyObject *state)
1039{
Victor Stinner7660b882013-06-24 23:59:24 +02001040 Py_ssize_t index = PyLong_AsSsize_t(state);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001041 if (index == -1 && PyErr_Occurred())
1042 return NULL;
1043 if (it->it_seq != NULL) {
1044 if (index < 0)
1045 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00001046 else if (index > PyTuple_GET_SIZE(it->it_seq))
1047 index = PyTuple_GET_SIZE(it->it_seq); /* exhausted iterator */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001048 it->it_index = index;
1049 }
1050 Py_RETURN_NONE;
1051}
1052
1053PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1054PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
1055
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001056static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001058 {"__reduce__", (PyCFunction)tupleiter_reduce, METH_NOARGS, reduce_doc},
1059 {"__setstate__", (PyCFunction)tupleiter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00001061};
1062
Raymond Hettinger48923c52002-08-09 01:30:17 +00001063PyTypeObject PyTupleIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1065 "tuple_iterator", /* tp_name */
1066 sizeof(tupleiterobject), /* tp_basicsize */
1067 0, /* tp_itemsize */
1068 /* methods */
1069 (destructor)tupleiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001070 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 0, /* tp_getattr */
1072 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001073 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 0, /* tp_repr */
1075 0, /* tp_as_number */
1076 0, /* tp_as_sequence */
1077 0, /* tp_as_mapping */
1078 0, /* tp_hash */
1079 0, /* tp_call */
1080 0, /* tp_str */
1081 PyObject_GenericGetAttr, /* tp_getattro */
1082 0, /* tp_setattro */
1083 0, /* tp_as_buffer */
1084 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1085 0, /* tp_doc */
1086 (traverseproc)tupleiter_traverse, /* tp_traverse */
1087 0, /* tp_clear */
1088 0, /* tp_richcompare */
1089 0, /* tp_weaklistoffset */
1090 PyObject_SelfIter, /* tp_iter */
1091 (iternextfunc)tupleiter_next, /* tp_iternext */
1092 tupleiter_methods, /* tp_methods */
1093 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001094};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001095
1096static PyObject *
1097tuple_iter(PyObject *seq)
1098{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 tupleiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 if (!PyTuple_Check(seq)) {
1102 PyErr_BadInternalCall();
1103 return NULL;
1104 }
1105 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1106 if (it == NULL)
1107 return NULL;
1108 it->it_index = 0;
1109 Py_INCREF(seq);
1110 it->it_seq = (PyTupleObject *)seq;
1111 _PyObject_GC_TRACK(it);
1112 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113}