blob: bd580946b7eb9992ecb568a3034d057552c57c72 [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));
Miss Islington (bot)890dcfe2020-03-15 12:55:39 -0700722 if (newobj == NULL) {
723 Py_DECREF(tmp);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 return NULL;
Miss Islington (bot)890dcfe2020-03-15 12:55:39 -0700725 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 for (i = 0; i < n; i++) {
727 item = PyTuple_GET_ITEM(tmp, i);
728 Py_INCREF(item);
729 PyTuple_SET_ITEM(newobj, i, item);
730 }
731 Py_DECREF(tmp);
732 return newobj;
Guido van Rossumae960af2001-08-30 03:11:59 +0000733}
734
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000735static PySequenceMethods tuple_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 (lenfunc)tuplelength, /* sq_length */
737 (binaryfunc)tupleconcat, /* sq_concat */
738 (ssizeargfunc)tuplerepeat, /* sq_repeat */
739 (ssizeargfunc)tupleitem, /* sq_item */
740 0, /* sq_slice */
741 0, /* sq_ass_item */
742 0, /* sq_ass_slice */
743 (objobjproc)tuplecontains, /* sq_contains */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000744};
745
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000746static PyObject*
747tuplesubscript(PyTupleObject* self, PyObject* item)
748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 if (PyIndex_Check(item)) {
750 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
751 if (i == -1 && PyErr_Occurred())
752 return NULL;
753 if (i < 0)
754 i += PyTuple_GET_SIZE(self);
755 return tupleitem(self, i);
756 }
757 else if (PySlice_Check(item)) {
Zackery Spytz14514d92019-05-17 01:13:03 -0600758 Py_ssize_t start, stop, step, slicelength, i;
759 size_t cur;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 PyObject* result;
761 PyObject* it;
762 PyObject **src, **dest;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000763
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300764 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 return NULL;
766 }
Serhiy Storchakab879fe82017-04-08 09:53:51 +0300767 slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
768 &stop, step);
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 if (slicelength <= 0) {
771 return PyTuple_New(0);
772 }
773 else if (start == 0 && step == 1 &&
774 slicelength == PyTuple_GET_SIZE(self) &&
775 PyTuple_CheckExact(self)) {
776 Py_INCREF(self);
777 return (PyObject *)self;
778 }
779 else {
780 result = PyTuple_New(slicelength);
781 if (!result) return NULL;
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 src = self->ob_item;
784 dest = ((PyTupleObject *)result)->ob_item;
785 for (cur = start, i = 0; i < slicelength;
786 cur += step, i++) {
787 it = src[cur];
788 Py_INCREF(it);
789 dest[i] = it;
790 }
791
792 return result;
793 }
794 }
795 else {
796 PyErr_Format(PyExc_TypeError,
Terry Jan Reedyffff1442014-08-02 01:30:37 -0400797 "tuple indices must be integers or slices, not %.200s",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000798 Py_TYPE(item)->tp_name);
799 return NULL;
800 }
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000801}
802
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200803/*[clinic input]
804tuple.__getnewargs__
805[clinic start generated code]*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200807static PyObject *
808tuple___getnewargs___impl(PyTupleObject *self)
809/*[clinic end generated code: output=25e06e3ee56027e2 input=1aeb4b286a21639a]*/
810{
811 return Py_BuildValue("(N)", tupleslice(self, 0, Py_SIZE(self)));
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000812}
813
814static PyMethodDef tuple_methods[] = {
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200815 TUPLE___GETNEWARGS___METHODDEF
816 TUPLE_INDEX_METHODDEF
817 TUPLE_COUNT_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 {NULL, NULL} /* sentinel */
Guido van Rossum5d9113d2003-01-29 17:58:45 +0000819};
820
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000821static PyMappingMethods tuple_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 (lenfunc)tuplelength,
823 (binaryfunc)tuplesubscript,
824 0
Michael W. Hudson5efaf7e2002-06-11 10:55:12 +0000825};
826
Raymond Hettinger48923c52002-08-09 01:30:17 +0000827static PyObject *tuple_iter(PyObject *seq);
828
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000829PyTypeObject PyTuple_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PyVarObject_HEAD_INIT(&PyType_Type, 0)
831 "tuple",
832 sizeof(PyTupleObject) - sizeof(PyObject *),
833 sizeof(PyObject *),
834 (destructor)tupledealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200835 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 0, /* tp_getattr */
837 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200838 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 (reprfunc)tuplerepr, /* tp_repr */
840 0, /* tp_as_number */
841 &tuple_as_sequence, /* tp_as_sequence */
842 &tuple_as_mapping, /* tp_as_mapping */
843 (hashfunc)tuplehash, /* tp_hash */
844 0, /* tp_call */
845 0, /* tp_str */
846 PyObject_GenericGetAttr, /* tp_getattro */
847 0, /* tp_setattro */
848 0, /* tp_as_buffer */
849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
850 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
Serhiy Storchaka0b561592017-03-19 08:47:58 +0200851 tuple_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 (traverseproc)tupletraverse, /* tp_traverse */
853 0, /* tp_clear */
854 tuplerichcompare, /* tp_richcompare */
855 0, /* tp_weaklistoffset */
856 tuple_iter, /* tp_iter */
857 0, /* tp_iternext */
858 tuple_methods, /* tp_methods */
859 0, /* tp_members */
860 0, /* tp_getset */
861 0, /* tp_base */
862 0, /* tp_dict */
863 0, /* tp_descr_get */
864 0, /* tp_descr_set */
865 0, /* tp_dictoffset */
866 0, /* tp_init */
867 0, /* tp_alloc */
868 tuple_new, /* tp_new */
869 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000870};
Guido van Rossum12d12c51993-10-26 17:58:25 +0000871
872/* The following function breaks the notion that tuples are immutable:
873 it changes the size of a tuple. We get away with this only if there
874 is only one module referencing the object. You can also think of it
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000875 as creating a new tuple object and destroying the old one, only more
876 efficiently. In any case, don't use this if the tuple may already be
Tim Peters4324aa32001-05-28 22:30:08 +0000877 known to some other part of the code. */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000878
879int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000880_PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000881{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200882 PyTupleObject *v;
883 PyTupleObject *sv;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 Py_ssize_t i;
885 Py_ssize_t oldsize;
Sjoerd Mullender615194a1993-11-01 13:46:50 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 v = (PyTupleObject *) *pv;
888 if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
889 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
890 *pv = 0;
891 Py_XDECREF(v);
892 PyErr_BadInternalCall();
893 return -1;
894 }
895 oldsize = Py_SIZE(v);
896 if (oldsize == newsize)
897 return 0;
Neil Schemenauer08b53e62000-10-05 19:36:49 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 if (oldsize == 0) {
900 /* Empty tuples are often shared, so we should never
901 resize them in-place even if we do own the only
902 (current) reference */
903 Py_DECREF(v);
904 *pv = PyTuple_New(newsize);
905 return *pv == NULL ? -1 : 0;
906 }
Thomas Wouters6a922372001-05-28 13:11:02 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 /* XXX UNREF/NEWREF interface should be more symmetrical */
909 _Py_DEC_REFTOTAL;
910 if (_PyObject_GC_IS_TRACKED(v))
911 _PyObject_GC_UNTRACK(v);
912 _Py_ForgetReference((PyObject *) v);
913 /* DECREF items deleted by shrinkage */
914 for (i = newsize; i < oldsize; i++) {
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200915 Py_CLEAR(v->ob_item[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 }
917 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
918 if (sv == NULL) {
919 *pv = NULL;
920 PyObject_GC_Del(v);
921 return -1;
922 }
923 _Py_NewReference((PyObject *) sv);
924 /* Zero out items added by growing */
925 if (newsize > oldsize)
926 memset(&sv->ob_item[oldsize], 0,
927 sizeof(*sv->ob_item) * (newsize - oldsize));
928 *pv = (PyObject *) sv;
929 _PyObject_GC_TRACK(sv);
930 return 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000931}
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000932
Christian Heimesa156e092008-02-16 07:38:31 +0000933int
934PyTuple_ClearFreeList(void)
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 int freelist_size = 0;
Christian Heimes2202f872008-02-06 14:31:34 +0000937#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 int i;
939 for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
940 PyTupleObject *p, *q;
941 p = free_list[i];
942 freelist_size += numfree[i];
943 free_list[i] = NULL;
944 numfree[i] = 0;
945 while (p) {
946 q = p;
947 p = (PyTupleObject *)(p->ob_item[0]);
948 PyObject_GC_Del(q);
949 }
950 }
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 return freelist_size;
Christian Heimesa156e092008-02-16 07:38:31 +0000953}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954
Christian Heimesa156e092008-02-16 07:38:31 +0000955void
956PyTuple_Fini(void)
957{
958#if PyTuple_MAXSAVESIZE > 0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 /* empty tuples are used all over the place and applications may
960 * rely on the fact that an empty tuple is a singleton. */
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200961 Py_CLEAR(free_list[0]);
Christian Heimesa156e092008-02-16 07:38:31 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 (void)PyTuple_ClearFreeList();
Christian Heimesa156e092008-02-16 07:38:31 +0000964#endif
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000965#ifdef SHOW_TRACK_COUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 show_track();
Antoine Pitrou3a652b12009-03-23 18:52:06 +0000967#endif
Guido van Rossumfbbd57e1997-08-05 02:16:08 +0000968}
Raymond Hettinger48923c52002-08-09 01:30:17 +0000969
970/*********************** Tuple Iterator **************************/
971
972typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 PyObject_HEAD
Victor Stinnera2d56982013-06-05 00:11:34 +0200974 Py_ssize_t it_index;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
Raymond Hettinger48923c52002-08-09 01:30:17 +0000976} tupleiterobject;
977
Raymond Hettinger48923c52002-08-09 01:30:17 +0000978static void
979tupleiter_dealloc(tupleiterobject *it)
980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 _PyObject_GC_UNTRACK(it);
982 Py_XDECREF(it->it_seq);
983 PyObject_GC_Del(it);
Raymond Hettinger48923c52002-08-09 01:30:17 +0000984}
985
986static int
987tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 Py_VISIT(it->it_seq);
990 return 0;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000991}
992
Raymond Hettinger48923c52002-08-09 01:30:17 +0000993static PyObject *
994tupleiter_next(tupleiterobject *it)
995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 PyTupleObject *seq;
997 PyObject *item;
Raymond Hettinger48923c52002-08-09 01:30:17 +0000998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 assert(it != NULL);
1000 seq = it->it_seq;
1001 if (seq == NULL)
1002 return NULL;
1003 assert(PyTuple_Check(seq));
Raymond Hettinger48923c52002-08-09 01:30:17 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 if (it->it_index < PyTuple_GET_SIZE(seq)) {
1006 item = PyTuple_GET_ITEM(seq, it->it_index);
1007 ++it->it_index;
1008 Py_INCREF(item);
1009 return item;
1010 }
Raymond Hettinger48923c52002-08-09 01:30:17 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 it->it_seq = NULL;
Serhiy Storchakafbb1c5e2016-03-30 20:40:02 +03001013 Py_DECREF(seq);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 return NULL;
Raymond Hettinger48923c52002-08-09 01:30:17 +00001015}
1016
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001017static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301018tupleiter_len(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
Raymond Hettinger435bf582004-03-18 22:43:10 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 Py_ssize_t len = 0;
1021 if (it->it_seq)
1022 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
1023 return PyLong_FromSsize_t(len);
Raymond Hettinger435bf582004-03-18 22:43:10 +00001024}
1025
Armin Rigof5b3e362006-02-11 21:32:43 +00001026PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001027
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001028static PyObject *
Siddhesh Poyarekar55edd0c2018-04-30 00:29:33 +05301029tupleiter_reduce(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001030{
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001031 _Py_IDENTIFIER(iter);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001032 if (it->it_seq)
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001033 return Py_BuildValue("N(O)n", _PyEval_GetBuiltinId(&PyId_iter),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001034 it->it_seq, it->it_index);
1035 else
Serhiy Storchakabb86bf42018-12-11 08:28:18 +02001036 return Py_BuildValue("N(())", _PyEval_GetBuiltinId(&PyId_iter));
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001037}
1038
1039static PyObject *
1040tupleiter_setstate(tupleiterobject *it, PyObject *state)
1041{
Victor Stinner7660b882013-06-24 23:59:24 +02001042 Py_ssize_t index = PyLong_AsSsize_t(state);
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001043 if (index == -1 && PyErr_Occurred())
1044 return NULL;
1045 if (it->it_seq != NULL) {
1046 if (index < 0)
1047 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00001048 else if (index > PyTuple_GET_SIZE(it->it_seq))
1049 index = PyTuple_GET_SIZE(it->it_seq); /* exhausted iterator */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001050 it->it_index = index;
1051 }
1052 Py_RETURN_NONE;
1053}
1054
1055PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1056PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
1057
Raymond Hettinger6b27cda2005-09-24 21:23:05 +00001058static PyMethodDef tupleiter_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00001060 {"__reduce__", (PyCFunction)tupleiter_reduce, METH_NOARGS, reduce_doc},
1061 {"__setstate__", (PyCFunction)tupleiter_setstate, METH_O, setstate_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 {NULL, NULL} /* sentinel */
Raymond Hettinger435bf582004-03-18 22:43:10 +00001063};
1064
Raymond Hettinger48923c52002-08-09 01:30:17 +00001065PyTypeObject PyTupleIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1067 "tuple_iterator", /* tp_name */
1068 sizeof(tupleiterobject), /* tp_basicsize */
1069 0, /* tp_itemsize */
1070 /* methods */
1071 (destructor)tupleiter_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001072 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 0, /* tp_getattr */
1074 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +02001075 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 0, /* tp_repr */
1077 0, /* tp_as_number */
1078 0, /* tp_as_sequence */
1079 0, /* tp_as_mapping */
1080 0, /* tp_hash */
1081 0, /* tp_call */
1082 0, /* tp_str */
1083 PyObject_GenericGetAttr, /* tp_getattro */
1084 0, /* tp_setattro */
1085 0, /* tp_as_buffer */
1086 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1087 0, /* tp_doc */
1088 (traverseproc)tupleiter_traverse, /* tp_traverse */
1089 0, /* tp_clear */
1090 0, /* tp_richcompare */
1091 0, /* tp_weaklistoffset */
1092 PyObject_SelfIter, /* tp_iter */
1093 (iternextfunc)tupleiter_next, /* tp_iternext */
1094 tupleiter_methods, /* tp_methods */
1095 0,
Raymond Hettinger48923c52002-08-09 01:30:17 +00001096};
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001097
1098static PyObject *
1099tuple_iter(PyObject *seq)
1100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 tupleiterobject *it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 if (!PyTuple_Check(seq)) {
1104 PyErr_BadInternalCall();
1105 return NULL;
1106 }
1107 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1108 if (it == NULL)
1109 return NULL;
1110 it->it_index = 0;
1111 Py_INCREF(seq);
1112 it->it_seq = (PyTupleObject *)seq;
1113 _PyObject_GC_TRACK(it);
1114 return (PyObject *)it;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001115}