1
2 /* Tuple object implementation */
3
4 #include "Python.h"
5 #include "pycore_abstract.h" // _PyIndex_Check()
6 #include "pycore_gc.h" // _PyObject_GC_IS_TRACKED()
7 #include "pycore_initconfig.h" // _PyStatus_OK()
8 #include "pycore_object.h" // _PyObject_GC_TRACK(), _Py_FatalRefcountError()
9
10 /*[clinic input]
11 class tuple "PyTupleObject *" "&PyTuple_Type"
12 [clinic start generated code]*/
13 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=f051ba3cfdf9a189]*/
14
15 #include "clinic/tupleobject.c.h"
16
17
18 static inline PyTupleObject * maybe_freelist_pop(Py_ssize_t);
19 static inline int maybe_freelist_push(PyTupleObject *);
20
21
22 /* Allocate an uninitialized tuple object. Before making it public, following
23 steps must be done:
24
25 - Initialize its items.
26 - Call _PyObject_GC_TRACK() on it.
27
28 Because the empty tuple is always reused and it's already tracked by GC,
29 this function must not be called with size == 0 (unless from PyTuple_New()
30 which wraps this function).
31 */
32 static PyTupleObject *
tuple_alloc(Py_ssize_t size)33 tuple_alloc(Py_ssize_t size)
34 {
35 if (size < 0) {
36 PyErr_BadInternalCall();
37 return NULL;
38 }
39 #ifdef Py_DEBUG
40 assert(size != 0); // The empty tuple is statically allocated.
41 #endif
42
43 PyTupleObject *op = maybe_freelist_pop(size);
44 if (op == NULL) {
45 /* Check for overflow */
46 if ((size_t)size > ((size_t)PY_SSIZE_T_MAX - (sizeof(PyTupleObject) -
47 sizeof(PyObject *))) / sizeof(PyObject *)) {
48 return (PyTupleObject *)PyErr_NoMemory();
49 }
50 op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
51 if (op == NULL)
52 return NULL;
53 }
54 return op;
55 }
56
57 // The empty tuple singleton is not tracked by the GC.
58 // It does not contain any Python object.
59 // Note that tuple subclasses have their own empty instances.
60
61 static inline PyObject *
tuple_get_empty(void)62 tuple_get_empty(void)
63 {
64 Py_INCREF(&_Py_SINGLETON(tuple_empty));
65 return (PyObject *)&_Py_SINGLETON(tuple_empty);
66 }
67
68 PyObject *
PyTuple_New(Py_ssize_t size)69 PyTuple_New(Py_ssize_t size)
70 {
71 PyTupleObject *op;
72 if (size == 0) {
73 return tuple_get_empty();
74 }
75 op = tuple_alloc(size);
76 if (op == NULL) {
77 return NULL;
78 }
79 for (Py_ssize_t i = 0; i < size; i++) {
80 op->ob_item[i] = NULL;
81 }
82 _PyObject_GC_TRACK(op);
83 return (PyObject *) op;
84 }
85
86 Py_ssize_t
PyTuple_Size(PyObject * op)87 PyTuple_Size(PyObject *op)
88 {
89 if (!PyTuple_Check(op)) {
90 PyErr_BadInternalCall();
91 return -1;
92 }
93 else
94 return Py_SIZE(op);
95 }
96
97 PyObject *
PyTuple_GetItem(PyObject * op,Py_ssize_t i)98 PyTuple_GetItem(PyObject *op, Py_ssize_t i)
99 {
100 if (!PyTuple_Check(op)) {
101 PyErr_BadInternalCall();
102 return NULL;
103 }
104 if (i < 0 || i >= Py_SIZE(op)) {
105 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
106 return NULL;
107 }
108 return ((PyTupleObject *)op) -> ob_item[i];
109 }
110
111 int
PyTuple_SetItem(PyObject * op,Py_ssize_t i,PyObject * newitem)112 PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
113 {
114 PyObject **p;
115 if (!PyTuple_Check(op) || Py_REFCNT(op) != 1) {
116 Py_XDECREF(newitem);
117 PyErr_BadInternalCall();
118 return -1;
119 }
120 if (i < 0 || i >= Py_SIZE(op)) {
121 Py_XDECREF(newitem);
122 PyErr_SetString(PyExc_IndexError,
123 "tuple assignment index out of range");
124 return -1;
125 }
126 p = ((PyTupleObject *)op) -> ob_item + i;
127 Py_XSETREF(*p, newitem);
128 return 0;
129 }
130
131 void
_PyTuple_MaybeUntrack(PyObject * op)132 _PyTuple_MaybeUntrack(PyObject *op)
133 {
134 PyTupleObject *t;
135 Py_ssize_t i, n;
136
137 if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
138 return;
139 t = (PyTupleObject *) op;
140 n = Py_SIZE(t);
141 for (i = 0; i < n; i++) {
142 PyObject *elt = PyTuple_GET_ITEM(t, i);
143 /* Tuple with NULL elements aren't
144 fully constructed, don't untrack
145 them yet. */
146 if (!elt ||
147 _PyObject_GC_MAY_BE_TRACKED(elt))
148 return;
149 }
150 _PyObject_GC_UNTRACK(op);
151 }
152
153 PyObject *
PyTuple_Pack(Py_ssize_t n,...)154 PyTuple_Pack(Py_ssize_t n, ...)
155 {
156 Py_ssize_t i;
157 PyObject *o;
158 PyObject **items;
159 va_list vargs;
160
161 if (n == 0) {
162 return tuple_get_empty();
163 }
164
165 va_start(vargs, n);
166 PyTupleObject *result = tuple_alloc(n);
167 if (result == NULL) {
168 va_end(vargs);
169 return NULL;
170 }
171 items = result->ob_item;
172 for (i = 0; i < n; i++) {
173 o = va_arg(vargs, PyObject *);
174 Py_INCREF(o);
175 items[i] = o;
176 }
177 va_end(vargs);
178 _PyObject_GC_TRACK(result);
179 return (PyObject *)result;
180 }
181
182
183 /* Methods */
184
185 static void
tupledealloc(PyTupleObject * op)186 tupledealloc(PyTupleObject *op)
187 {
188 if (Py_SIZE(op) == 0) {
189 /* The empty tuple is statically allocated. */
190 if (op == &_Py_SINGLETON(tuple_empty)) {
191 #ifdef Py_DEBUG
192 _Py_FatalRefcountError("deallocating the empty tuple singleton");
193 #else
194 return;
195 #endif
196 }
197 #ifdef Py_DEBUG
198 /* tuple subclasses have their own empty instances. */
199 assert(!PyTuple_CheckExact(op));
200 #endif
201 }
202
203 PyObject_GC_UnTrack(op);
204 Py_TRASHCAN_BEGIN(op, tupledealloc)
205
206 Py_ssize_t i = Py_SIZE(op);
207 while (--i >= 0) {
208 Py_XDECREF(op->ob_item[i]);
209 }
210 // This will abort on the empty singleton (if there is one).
211 if (!maybe_freelist_push(op)) {
212 Py_TYPE(op)->tp_free((PyObject *)op);
213 }
214
215 Py_TRASHCAN_END
216 }
217
218 static PyObject *
tuplerepr(PyTupleObject * v)219 tuplerepr(PyTupleObject *v)
220 {
221 Py_ssize_t i, n;
222 _PyUnicodeWriter writer;
223
224 n = Py_SIZE(v);
225 if (n == 0)
226 return PyUnicode_FromString("()");
227
228 /* While not mutable, it is still possible to end up with a cycle in a
229 tuple through an object that stores itself within a tuple (and thus
230 infinitely asks for the repr of itself). This should only be
231 possible within a type. */
232 i = Py_ReprEnter((PyObject *)v);
233 if (i != 0) {
234 return i > 0 ? PyUnicode_FromString("(...)") : NULL;
235 }
236
237 _PyUnicodeWriter_Init(&writer);
238 writer.overallocate = 1;
239 if (Py_SIZE(v) > 1) {
240 /* "(" + "1" + ", 2" * (len - 1) + ")" */
241 writer.min_length = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1;
242 }
243 else {
244 /* "(1,)" */
245 writer.min_length = 4;
246 }
247
248 if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0)
249 goto error;
250
251 /* Do repr() on each element. */
252 for (i = 0; i < n; ++i) {
253 PyObject *s;
254
255 if (i > 0) {
256 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0)
257 goto error;
258 }
259
260 s = PyObject_Repr(v->ob_item[i]);
261 if (s == NULL)
262 goto error;
263
264 if (_PyUnicodeWriter_WriteStr(&writer, s) < 0) {
265 Py_DECREF(s);
266 goto error;
267 }
268 Py_DECREF(s);
269 }
270
271 writer.overallocate = 0;
272 if (n > 1) {
273 if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0)
274 goto error;
275 }
276 else {
277 if (_PyUnicodeWriter_WriteASCIIString(&writer, ",)", 2) < 0)
278 goto error;
279 }
280
281 Py_ReprLeave((PyObject *)v);
282 return _PyUnicodeWriter_Finish(&writer);
283
284 error:
285 _PyUnicodeWriter_Dealloc(&writer);
286 Py_ReprLeave((PyObject *)v);
287 return NULL;
288 }
289
290
291 /* Hash for tuples. This is a slightly simplified version of the xxHash
292 non-cryptographic hash:
293 - we do not use any parallellism, there is only 1 accumulator.
294 - we drop the final mixing since this is just a permutation of the
295 output space: it does not help against collisions.
296 - at the end, we mangle the length with a single constant.
297 For the xxHash specification, see
298 https://github.com/Cyan4973/xxHash/blob/master/doc/xxhash_spec.md
299
300 Below are the official constants from the xxHash specification. Optimizing
301 compilers should emit a single "rotate" instruction for the
302 _PyHASH_XXROTATE() expansion. If that doesn't happen for some important
303 platform, the macro could be changed to expand to a platform-specific rotate
304 spelling instead.
305 */
306 #if SIZEOF_PY_UHASH_T > 4
307 #define _PyHASH_XXPRIME_1 ((Py_uhash_t)11400714785074694791ULL)
308 #define _PyHASH_XXPRIME_2 ((Py_uhash_t)14029467366897019727ULL)
309 #define _PyHASH_XXPRIME_5 ((Py_uhash_t)2870177450012600261ULL)
310 #define _PyHASH_XXROTATE(x) ((x << 31) | (x >> 33)) /* Rotate left 31 bits */
311 #else
312 #define _PyHASH_XXPRIME_1 ((Py_uhash_t)2654435761UL)
313 #define _PyHASH_XXPRIME_2 ((Py_uhash_t)2246822519UL)
314 #define _PyHASH_XXPRIME_5 ((Py_uhash_t)374761393UL)
315 #define _PyHASH_XXROTATE(x) ((x << 13) | (x >> 19)) /* Rotate left 13 bits */
316 #endif
317
318 /* Tests have shown that it's not worth to cache the hash value, see
319 https://bugs.python.org/issue9685 */
320 static Py_hash_t
tuplehash(PyTupleObject * v)321 tuplehash(PyTupleObject *v)
322 {
323 Py_ssize_t i, len = Py_SIZE(v);
324 PyObject **item = v->ob_item;
325
326 Py_uhash_t acc = _PyHASH_XXPRIME_5;
327 for (i = 0; i < len; i++) {
328 Py_uhash_t lane = PyObject_Hash(item[i]);
329 if (lane == (Py_uhash_t)-1) {
330 return -1;
331 }
332 acc += lane * _PyHASH_XXPRIME_2;
333 acc = _PyHASH_XXROTATE(acc);
334 acc *= _PyHASH_XXPRIME_1;
335 }
336
337 /* Add input length, mangled to keep the historical value of hash(()). */
338 acc += len ^ (_PyHASH_XXPRIME_5 ^ 3527539UL);
339
340 if (acc == (Py_uhash_t)-1) {
341 return 1546275796;
342 }
343 return acc;
344 }
345
346 static Py_ssize_t
tuplelength(PyTupleObject * a)347 tuplelength(PyTupleObject *a)
348 {
349 return Py_SIZE(a);
350 }
351
352 static int
tuplecontains(PyTupleObject * a,PyObject * el)353 tuplecontains(PyTupleObject *a, PyObject *el)
354 {
355 Py_ssize_t i;
356 int cmp;
357
358 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
359 cmp = PyObject_RichCompareBool(PyTuple_GET_ITEM(a, i), el, Py_EQ);
360 return cmp;
361 }
362
363 static PyObject *
tupleitem(PyTupleObject * a,Py_ssize_t i)364 tupleitem(PyTupleObject *a, Py_ssize_t i)
365 {
366 if (i < 0 || i >= Py_SIZE(a)) {
367 PyErr_SetString(PyExc_IndexError, "tuple index out of range");
368 return NULL;
369 }
370 Py_INCREF(a->ob_item[i]);
371 return a->ob_item[i];
372 }
373
374 PyObject *
_PyTuple_FromArray(PyObject * const * src,Py_ssize_t n)375 _PyTuple_FromArray(PyObject *const *src, Py_ssize_t n)
376 {
377 if (n == 0) {
378 return tuple_get_empty();
379 }
380
381 PyTupleObject *tuple = tuple_alloc(n);
382 if (tuple == NULL) {
383 return NULL;
384 }
385 PyObject **dst = tuple->ob_item;
386 for (Py_ssize_t i = 0; i < n; i++) {
387 PyObject *item = src[i];
388 Py_INCREF(item);
389 dst[i] = item;
390 }
391 _PyObject_GC_TRACK(tuple);
392 return (PyObject *)tuple;
393 }
394
395 PyObject *
_PyTuple_FromArraySteal(PyObject * const * src,Py_ssize_t n)396 _PyTuple_FromArraySteal(PyObject *const *src, Py_ssize_t n)
397 {
398 if (n == 0) {
399 return tuple_get_empty();
400 }
401 PyTupleObject *tuple = tuple_alloc(n);
402 if (tuple == NULL) {
403 for (Py_ssize_t i = 0; i < n; i++) {
404 Py_DECREF(src[i]);
405 }
406 return NULL;
407 }
408 PyObject **dst = tuple->ob_item;
409 for (Py_ssize_t i = 0; i < n; i++) {
410 PyObject *item = src[i];
411 dst[i] = item;
412 }
413 _PyObject_GC_TRACK(tuple);
414 return (PyObject *)tuple;
415 }
416
417 static PyObject *
tupleslice(PyTupleObject * a,Py_ssize_t ilow,Py_ssize_t ihigh)418 tupleslice(PyTupleObject *a, Py_ssize_t ilow,
419 Py_ssize_t ihigh)
420 {
421 if (ilow < 0)
422 ilow = 0;
423 if (ihigh > Py_SIZE(a))
424 ihigh = Py_SIZE(a);
425 if (ihigh < ilow)
426 ihigh = ilow;
427 if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
428 Py_INCREF(a);
429 return (PyObject *)a;
430 }
431 return _PyTuple_FromArray(a->ob_item + ilow, ihigh - ilow);
432 }
433
434 PyObject *
PyTuple_GetSlice(PyObject * op,Py_ssize_t i,Py_ssize_t j)435 PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
436 {
437 if (op == NULL || !PyTuple_Check(op)) {
438 PyErr_BadInternalCall();
439 return NULL;
440 }
441 return tupleslice((PyTupleObject *)op, i, j);
442 }
443
444 static PyObject *
tupleconcat(PyTupleObject * a,PyObject * bb)445 tupleconcat(PyTupleObject *a, PyObject *bb)
446 {
447 Py_ssize_t size;
448 Py_ssize_t i;
449 PyObject **src, **dest;
450 PyTupleObject *np;
451 if (Py_SIZE(a) == 0 && PyTuple_CheckExact(bb)) {
452 Py_INCREF(bb);
453 return bb;
454 }
455 if (!PyTuple_Check(bb)) {
456 PyErr_Format(PyExc_TypeError,
457 "can only concatenate tuple (not \"%.200s\") to tuple",
458 Py_TYPE(bb)->tp_name);
459 return NULL;
460 }
461 PyTupleObject *b = (PyTupleObject *)bb;
462
463 if (Py_SIZE(b) == 0 && PyTuple_CheckExact(a)) {
464 Py_INCREF(a);
465 return (PyObject *)a;
466 }
467 assert((size_t)Py_SIZE(a) + (size_t)Py_SIZE(b) < PY_SSIZE_T_MAX);
468 size = Py_SIZE(a) + Py_SIZE(b);
469 if (size == 0) {
470 return tuple_get_empty();
471 }
472
473 np = tuple_alloc(size);
474 if (np == NULL) {
475 return NULL;
476 }
477 src = a->ob_item;
478 dest = np->ob_item;
479 for (i = 0; i < Py_SIZE(a); i++) {
480 PyObject *v = src[i];
481 Py_INCREF(v);
482 dest[i] = v;
483 }
484 src = b->ob_item;
485 dest = np->ob_item + Py_SIZE(a);
486 for (i = 0; i < Py_SIZE(b); i++) {
487 PyObject *v = src[i];
488 Py_INCREF(v);
489 dest[i] = v;
490 }
491 _PyObject_GC_TRACK(np);
492 return (PyObject *)np;
493 }
494
495 static PyObject *
tuplerepeat(PyTupleObject * a,Py_ssize_t n)496 tuplerepeat(PyTupleObject *a, Py_ssize_t n)
497 {
498 Py_ssize_t size;
499 PyTupleObject *np;
500 if (Py_SIZE(a) == 0 || n == 1) {
501 if (PyTuple_CheckExact(a)) {
502 /* Since tuples are immutable, we can return a shared
503 copy in this case */
504 Py_INCREF(a);
505 return (PyObject *)a;
506 }
507 }
508 if (Py_SIZE(a) == 0 || n <= 0) {
509 return tuple_get_empty();
510 }
511 if (n > PY_SSIZE_T_MAX / Py_SIZE(a))
512 return PyErr_NoMemory();
513 size = Py_SIZE(a) * n;
514 np = tuple_alloc(size);
515 if (np == NULL)
516 return NULL;
517 PyObject **dest = np->ob_item;
518 PyObject **dest_end = dest + size;
519 if (Py_SIZE(a) == 1) {
520 PyObject *elem = a->ob_item[0];
521 Py_SET_REFCNT(elem, Py_REFCNT(elem) + n);
522 #ifdef Py_REF_DEBUG
523 _Py_RefTotal += n;
524 #endif
525 while (dest < dest_end) {
526 *dest++ = elem;
527 }
528 }
529 else {
530 PyObject **src = a->ob_item;
531 PyObject **src_end = src + Py_SIZE(a);
532 while (src < src_end) {
533 Py_SET_REFCNT(*src, Py_REFCNT(*src) + n);
534 #ifdef Py_REF_DEBUG
535 _Py_RefTotal += n;
536 #endif
537 *dest++ = *src++;
538 }
539 // Now src chases after dest in the same buffer
540 src = np->ob_item;
541 while (dest < dest_end) {
542 *dest++ = *src++;
543 }
544 }
545 _PyObject_GC_TRACK(np);
546 return (PyObject *) np;
547 }
548
549 /*[clinic input]
550 tuple.index
551
552 value: object
553 start: slice_index(accept={int}) = 0
554 stop: slice_index(accept={int}, c_default="PY_SSIZE_T_MAX") = sys.maxsize
555 /
556
557 Return first index of value.
558
559 Raises ValueError if the value is not present.
560 [clinic start generated code]*/
561
562 static PyObject *
tuple_index_impl(PyTupleObject * self,PyObject * value,Py_ssize_t start,Py_ssize_t stop)563 tuple_index_impl(PyTupleObject *self, PyObject *value, Py_ssize_t start,
564 Py_ssize_t stop)
565 /*[clinic end generated code: output=07b6f9f3cb5c33eb input=fb39e9874a21fe3f]*/
566 {
567 Py_ssize_t i;
568
569 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);
576 }
577 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);
582 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;
589 }
590
591 /*[clinic input]
592 tuple.count
593
594 value: object
595 /
596
597 Return number of occurrences of value.
598 [clinic start generated code]*/
599
600 static PyObject *
tuple_count(PyTupleObject * self,PyObject * value)601 tuple_count(PyTupleObject *self, PyObject *value)
602 /*[clinic end generated code: output=aa927affc5a97605 input=531721aff65bd772]*/
603 {
604 Py_ssize_t count = 0;
605 Py_ssize_t i;
606
607 for (i = 0; i < Py_SIZE(self); i++) {
608 int cmp = PyObject_RichCompareBool(self->ob_item[i], value, Py_EQ);
609 if (cmp > 0)
610 count++;
611 else if (cmp < 0)
612 return NULL;
613 }
614 return PyLong_FromSsize_t(count);
615 }
616
617 static int
tupletraverse(PyTupleObject * o,visitproc visit,void * arg)618 tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
619 {
620 Py_ssize_t i;
621
622 for (i = Py_SIZE(o); --i >= 0; )
623 Py_VISIT(o->ob_item[i]);
624 return 0;
625 }
626
627 static PyObject *
tuplerichcompare(PyObject * v,PyObject * w,int op)628 tuplerichcompare(PyObject *v, PyObject *w, int op)
629 {
630 PyTupleObject *vt, *wt;
631 Py_ssize_t i;
632 Py_ssize_t vlen, wlen;
633
634 if (!PyTuple_Check(v) || !PyTuple_Check(w))
635 Py_RETURN_NOTIMPLEMENTED;
636
637 vt = (PyTupleObject *)v;
638 wt = (PyTupleObject *)w;
639
640 vlen = Py_SIZE(vt);
641 wlen = Py_SIZE(wt);
642
643 /* 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 */
649
650 /* 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 }
662
663 if (i >= vlen || i >= wlen) {
664 /* No more items to compare -- compare sizes */
665 Py_RETURN_RICHCOMPARE(vlen, wlen, op);
666 }
667
668 /* We have an item that differs -- shortcuts for EQ/NE */
669 if (op == Py_EQ) {
670 Py_RETURN_FALSE;
671 }
672 if (op == Py_NE) {
673 Py_RETURN_TRUE;
674 }
675
676 /* Compare the final item again using the proper operator */
677 return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
678 }
679
680 static PyObject *
681 tuple_subtype_new(PyTypeObject *type, PyObject *iterable);
682
683 /*[clinic input]
684 @classmethod
685 tuple.__new__ as tuple_new
686 iterable: object(c_default="NULL") = ()
687 /
688
689 Built-in immutable sequence.
690
691 If no argument is given, the constructor returns an empty tuple.
692 If iterable is specified the tuple is initialized from iterable's items.
693
694 If the argument is a tuple, the return value is the same object.
695 [clinic start generated code]*/
696
697 static PyObject *
tuple_new_impl(PyTypeObject * type,PyObject * iterable)698 tuple_new_impl(PyTypeObject *type, PyObject *iterable)
699 /*[clinic end generated code: output=4546d9f0d469bce7 input=86963bcde633b5a2]*/
700 {
701 if (type != &PyTuple_Type)
702 return tuple_subtype_new(type, iterable);
703
704 if (iterable == NULL) {
705 return tuple_get_empty();
706 }
707 else {
708 return PySequence_Tuple(iterable);
709 }
710 }
711
712 static PyObject *
tuple_vectorcall(PyObject * type,PyObject * const * args,size_t nargsf,PyObject * kwnames)713 tuple_vectorcall(PyObject *type, PyObject * const*args,
714 size_t nargsf, PyObject *kwnames)
715 {
716 if (!_PyArg_NoKwnames("tuple", kwnames)) {
717 return NULL;
718 }
719
720 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
721 if (!_PyArg_CheckPositional("tuple", nargs, 0, 1)) {
722 return NULL;
723 }
724
725 if (nargs) {
726 return tuple_new_impl(_PyType_CAST(type), args[0]);
727 }
728 else {
729 return tuple_get_empty();
730 }
731 }
732
733 static PyObject *
tuple_subtype_new(PyTypeObject * type,PyObject * iterable)734 tuple_subtype_new(PyTypeObject *type, PyObject *iterable)
735 {
736 PyObject *tmp, *newobj, *item;
737 Py_ssize_t i, n;
738
739 assert(PyType_IsSubtype(type, &PyTuple_Type));
740 // tuple subclasses must implement the GC protocol
741 assert(_PyType_IS_GC(type));
742
743 tmp = tuple_new_impl(&PyTuple_Type, iterable);
744 if (tmp == NULL)
745 return NULL;
746 assert(PyTuple_Check(tmp));
747 /* This may allocate an empty tuple that is not the global one. */
748 newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
749 if (newobj == NULL) {
750 Py_DECREF(tmp);
751 return NULL;
752 }
753 for (i = 0; i < n; i++) {
754 item = PyTuple_GET_ITEM(tmp, i);
755 Py_INCREF(item);
756 PyTuple_SET_ITEM(newobj, i, item);
757 }
758 Py_DECREF(tmp);
759
760 // Don't track if a subclass tp_alloc is PyType_GenericAlloc()
761 if (!_PyObject_GC_IS_TRACKED(newobj)) {
762 _PyObject_GC_TRACK(newobj);
763 }
764 return newobj;
765 }
766
767 static PySequenceMethods tuple_as_sequence = {
768 (lenfunc)tuplelength, /* sq_length */
769 (binaryfunc)tupleconcat, /* sq_concat */
770 (ssizeargfunc)tuplerepeat, /* sq_repeat */
771 (ssizeargfunc)tupleitem, /* sq_item */
772 0, /* sq_slice */
773 0, /* sq_ass_item */
774 0, /* sq_ass_slice */
775 (objobjproc)tuplecontains, /* sq_contains */
776 };
777
778 static PyObject*
tuplesubscript(PyTupleObject * self,PyObject * item)779 tuplesubscript(PyTupleObject* self, PyObject* item)
780 {
781 if (_PyIndex_Check(item)) {
782 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
783 if (i == -1 && PyErr_Occurred())
784 return NULL;
785 if (i < 0)
786 i += PyTuple_GET_SIZE(self);
787 return tupleitem(self, i);
788 }
789 else if (PySlice_Check(item)) {
790 Py_ssize_t start, stop, step, slicelength, i;
791 size_t cur;
792 PyObject* it;
793 PyObject **src, **dest;
794
795 if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
796 return NULL;
797 }
798 slicelength = PySlice_AdjustIndices(PyTuple_GET_SIZE(self), &start,
799 &stop, step);
800
801 if (slicelength <= 0) {
802 return tuple_get_empty();
803 }
804 else if (start == 0 && step == 1 &&
805 slicelength == PyTuple_GET_SIZE(self) &&
806 PyTuple_CheckExact(self)) {
807 Py_INCREF(self);
808 return (PyObject *)self;
809 }
810 else {
811 PyTupleObject* result = tuple_alloc(slicelength);
812 if (!result) return NULL;
813
814 src = self->ob_item;
815 dest = result->ob_item;
816 for (cur = start, i = 0; i < slicelength;
817 cur += step, i++) {
818 it = src[cur];
819 Py_INCREF(it);
820 dest[i] = it;
821 }
822
823 _PyObject_GC_TRACK(result);
824 return (PyObject *)result;
825 }
826 }
827 else {
828 PyErr_Format(PyExc_TypeError,
829 "tuple indices must be integers or slices, not %.200s",
830 Py_TYPE(item)->tp_name);
831 return NULL;
832 }
833 }
834
835 /*[clinic input]
836 tuple.__getnewargs__
837 [clinic start generated code]*/
838
839 static PyObject *
tuple___getnewargs___impl(PyTupleObject * self)840 tuple___getnewargs___impl(PyTupleObject *self)
841 /*[clinic end generated code: output=25e06e3ee56027e2 input=1aeb4b286a21639a]*/
842 {
843 return Py_BuildValue("(N)", tupleslice(self, 0, Py_SIZE(self)));
844 }
845
846 static PyMethodDef tuple_methods[] = {
847 TUPLE___GETNEWARGS___METHODDEF
848 TUPLE_INDEX_METHODDEF
849 TUPLE_COUNT_METHODDEF
850 {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")},
851 {NULL, NULL} /* sentinel */
852 };
853
854 static PyMappingMethods tuple_as_mapping = {
855 (lenfunc)tuplelength,
856 (binaryfunc)tuplesubscript,
857 0
858 };
859
860 static PyObject *tuple_iter(PyObject *seq);
861
862 PyTypeObject PyTuple_Type = {
863 PyVarObject_HEAD_INIT(&PyType_Type, 0)
864 "tuple",
865 sizeof(PyTupleObject) - sizeof(PyObject *),
866 sizeof(PyObject *),
867 (destructor)tupledealloc, /* tp_dealloc */
868 0, /* tp_vectorcall_offset */
869 0, /* tp_getattr */
870 0, /* tp_setattr */
871 0, /* tp_as_async */
872 (reprfunc)tuplerepr, /* tp_repr */
873 0, /* tp_as_number */
874 &tuple_as_sequence, /* tp_as_sequence */
875 &tuple_as_mapping, /* tp_as_mapping */
876 (hashfunc)tuplehash, /* tp_hash */
877 0, /* tp_call */
878 0, /* tp_str */
879 PyObject_GenericGetAttr, /* tp_getattro */
880 0, /* tp_setattro */
881 0, /* tp_as_buffer */
882 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
883 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS |
884 _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_SEQUENCE, /* tp_flags */
885 tuple_new__doc__, /* tp_doc */
886 (traverseproc)tupletraverse, /* tp_traverse */
887 0, /* tp_clear */
888 tuplerichcompare, /* tp_richcompare */
889 0, /* tp_weaklistoffset */
890 tuple_iter, /* tp_iter */
891 0, /* tp_iternext */
892 tuple_methods, /* tp_methods */
893 0, /* tp_members */
894 0, /* tp_getset */
895 0, /* tp_base */
896 0, /* tp_dict */
897 0, /* tp_descr_get */
898 0, /* tp_descr_set */
899 0, /* tp_dictoffset */
900 0, /* tp_init */
901 0, /* tp_alloc */
902 tuple_new, /* tp_new */
903 PyObject_GC_Del, /* tp_free */
904 .tp_vectorcall = tuple_vectorcall,
905 };
906
907 /* The following function breaks the notion that tuples are immutable:
908 it changes the size of a tuple. We get away with this only if there
909 is only one module referencing the object. You can also think of it
910 as creating a new tuple object and destroying the old one, only more
911 efficiently. In any case, don't use this if the tuple may already be
912 known to some other part of the code. */
913
914 int
_PyTuple_Resize(PyObject ** pv,Py_ssize_t newsize)915 _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
916 {
917 PyTupleObject *v;
918 PyTupleObject *sv;
919 Py_ssize_t i;
920 Py_ssize_t oldsize;
921
922 v = (PyTupleObject *) *pv;
923 if (v == NULL || !Py_IS_TYPE(v, &PyTuple_Type) ||
924 (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
925 *pv = 0;
926 Py_XDECREF(v);
927 PyErr_BadInternalCall();
928 return -1;
929 }
930
931 oldsize = Py_SIZE(v);
932 if (oldsize == newsize) {
933 return 0;
934 }
935 if (newsize == 0) {
936 Py_DECREF(v);
937 *pv = tuple_get_empty();
938 return 0;
939 }
940 if (oldsize == 0) {
941 #ifdef Py_DEBUG
942 assert(v == &_Py_SINGLETON(tuple_empty));
943 #endif
944 /* The empty tuple is statically allocated so we never
945 resize it in-place. */
946 Py_DECREF(v);
947 *pv = PyTuple_New(newsize);
948 return *pv == NULL ? -1 : 0;
949 }
950
951 /* XXX UNREF/NEWREF interface should be more symmetrical */
952 #ifdef Py_REF_DEBUG
953 _Py_RefTotal--;
954 #endif
955 if (_PyObject_GC_IS_TRACKED(v)) {
956 _PyObject_GC_UNTRACK(v);
957 }
958 #ifdef Py_TRACE_REFS
959 _Py_ForgetReference((PyObject *) v);
960 #endif
961 /* DECREF items deleted by shrinkage */
962 for (i = newsize; i < oldsize; i++) {
963 Py_CLEAR(v->ob_item[i]);
964 }
965 sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
966 if (sv == NULL) {
967 *pv = NULL;
968 PyObject_GC_Del(v);
969 return -1;
970 }
971 _Py_NewReference((PyObject *) sv);
972 /* Zero out items added by growing */
973 if (newsize > oldsize)
974 memset(&sv->ob_item[oldsize], 0,
975 sizeof(*sv->ob_item) * (newsize - oldsize));
976 *pv = (PyObject *) sv;
977 _PyObject_GC_TRACK(sv);
978 return 0;
979 }
980
981
982 PyStatus
_PyTuple_InitTypes(PyInterpreterState * interp)983 _PyTuple_InitTypes(PyInterpreterState *interp)
984 {
985 if (!_Py_IsMainInterpreter(interp)) {
986 return _PyStatus_OK();
987 }
988
989 if (PyType_Ready(&PyTuple_Type) < 0) {
990 return _PyStatus_ERR("Can't initialize tuple type");
991 }
992
993 if (PyType_Ready(&PyTupleIter_Type) < 0) {
994 return _PyStatus_ERR("Can't initialize tuple iterator type");
995 }
996
997 return _PyStatus_OK();
998 }
999
1000 static void maybe_freelist_clear(PyInterpreterState *, int);
1001
1002 void
_PyTuple_Fini(PyInterpreterState * interp)1003 _PyTuple_Fini(PyInterpreterState *interp)
1004 {
1005 maybe_freelist_clear(interp, 1);
1006 }
1007
1008 void
_PyTuple_ClearFreeList(PyInterpreterState * interp)1009 _PyTuple_ClearFreeList(PyInterpreterState *interp)
1010 {
1011 maybe_freelist_clear(interp, 0);
1012 }
1013
1014 /*********************** Tuple Iterator **************************/
1015
1016 typedef struct {
1017 PyObject_HEAD
1018 Py_ssize_t it_index;
1019 PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
1020 } tupleiterobject;
1021
1022 static void
tupleiter_dealloc(tupleiterobject * it)1023 tupleiter_dealloc(tupleiterobject *it)
1024 {
1025 _PyObject_GC_UNTRACK(it);
1026 Py_XDECREF(it->it_seq);
1027 PyObject_GC_Del(it);
1028 }
1029
1030 static int
tupleiter_traverse(tupleiterobject * it,visitproc visit,void * arg)1031 tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
1032 {
1033 Py_VISIT(it->it_seq);
1034 return 0;
1035 }
1036
1037 static PyObject *
tupleiter_next(tupleiterobject * it)1038 tupleiter_next(tupleiterobject *it)
1039 {
1040 PyTupleObject *seq;
1041 PyObject *item;
1042
1043 assert(it != NULL);
1044 seq = it->it_seq;
1045 if (seq == NULL)
1046 return NULL;
1047 assert(PyTuple_Check(seq));
1048
1049 if (it->it_index < PyTuple_GET_SIZE(seq)) {
1050 item = PyTuple_GET_ITEM(seq, it->it_index);
1051 ++it->it_index;
1052 Py_INCREF(item);
1053 return item;
1054 }
1055
1056 it->it_seq = NULL;
1057 Py_DECREF(seq);
1058 return NULL;
1059 }
1060
1061 static PyObject *
tupleiter_len(tupleiterobject * it,PyObject * Py_UNUSED (ignored))1062 tupleiter_len(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
1063 {
1064 Py_ssize_t len = 0;
1065 if (it->it_seq)
1066 len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
1067 return PyLong_FromSsize_t(len);
1068 }
1069
1070 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
1071
1072 static PyObject *
tupleiter_reduce(tupleiterobject * it,PyObject * Py_UNUSED (ignored))1073 tupleiter_reduce(tupleiterobject *it, PyObject *Py_UNUSED(ignored))
1074 {
1075 PyObject *iter = _PyEval_GetBuiltin(&_Py_ID(iter));
1076
1077 /* _PyEval_GetBuiltin can invoke arbitrary code,
1078 * call must be before access of iterator pointers.
1079 * see issue #101765 */
1080
1081 if (it->it_seq)
1082 return Py_BuildValue("N(O)n", iter, it->it_seq, it->it_index);
1083 else
1084 return Py_BuildValue("N(())", iter);
1085 }
1086
1087 static PyObject *
tupleiter_setstate(tupleiterobject * it,PyObject * state)1088 tupleiter_setstate(tupleiterobject *it, PyObject *state)
1089 {
1090 Py_ssize_t index = PyLong_AsSsize_t(state);
1091 if (index == -1 && PyErr_Occurred())
1092 return NULL;
1093 if (it->it_seq != NULL) {
1094 if (index < 0)
1095 index = 0;
1096 else if (index > PyTuple_GET_SIZE(it->it_seq))
1097 index = PyTuple_GET_SIZE(it->it_seq); /* exhausted iterator */
1098 it->it_index = index;
1099 }
1100 Py_RETURN_NONE;
1101 }
1102
1103 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1104 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
1105
1106 static PyMethodDef tupleiter_methods[] = {
1107 {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
1108 {"__reduce__", (PyCFunction)tupleiter_reduce, METH_NOARGS, reduce_doc},
1109 {"__setstate__", (PyCFunction)tupleiter_setstate, METH_O, setstate_doc},
1110 {NULL, NULL} /* sentinel */
1111 };
1112
1113 PyTypeObject PyTupleIter_Type = {
1114 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1115 "tuple_iterator", /* tp_name */
1116 sizeof(tupleiterobject), /* tp_basicsize */
1117 0, /* tp_itemsize */
1118 /* methods */
1119 (destructor)tupleiter_dealloc, /* tp_dealloc */
1120 0, /* tp_vectorcall_offset */
1121 0, /* tp_getattr */
1122 0, /* tp_setattr */
1123 0, /* tp_as_async */
1124 0, /* tp_repr */
1125 0, /* tp_as_number */
1126 0, /* tp_as_sequence */
1127 0, /* tp_as_mapping */
1128 0, /* tp_hash */
1129 0, /* tp_call */
1130 0, /* tp_str */
1131 PyObject_GenericGetAttr, /* tp_getattro */
1132 0, /* tp_setattro */
1133 0, /* tp_as_buffer */
1134 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
1135 0, /* tp_doc */
1136 (traverseproc)tupleiter_traverse, /* tp_traverse */
1137 0, /* tp_clear */
1138 0, /* tp_richcompare */
1139 0, /* tp_weaklistoffset */
1140 PyObject_SelfIter, /* tp_iter */
1141 (iternextfunc)tupleiter_next, /* tp_iternext */
1142 tupleiter_methods, /* tp_methods */
1143 0,
1144 };
1145
1146 static PyObject *
tuple_iter(PyObject * seq)1147 tuple_iter(PyObject *seq)
1148 {
1149 tupleiterobject *it;
1150
1151 if (!PyTuple_Check(seq)) {
1152 PyErr_BadInternalCall();
1153 return NULL;
1154 }
1155 it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
1156 if (it == NULL)
1157 return NULL;
1158 it->it_index = 0;
1159 Py_INCREF(seq);
1160 it->it_seq = (PyTupleObject *)seq;
1161 _PyObject_GC_TRACK(it);
1162 return (PyObject *)it;
1163 }
1164
1165
1166 /*************
1167 * freelists *
1168 *************/
1169
1170 #define STATE (interp->tuple)
1171 #define FREELIST_FINALIZED (STATE.numfree[0] < 0)
1172
1173 static inline PyTupleObject *
maybe_freelist_pop(Py_ssize_t size)1174 maybe_freelist_pop(Py_ssize_t size)
1175 {
1176 #if PyTuple_NFREELISTS > 0
1177 PyInterpreterState *interp = _PyInterpreterState_GET();
1178 #ifdef Py_DEBUG
1179 /* maybe_freelist_pop() must not be called after maybe_freelist_fini(). */
1180 assert(!FREELIST_FINALIZED);
1181 #endif
1182 if (size == 0) {
1183 return NULL;
1184 }
1185 assert(size > 0);
1186 if (size < PyTuple_MAXSAVESIZE) {
1187 Py_ssize_t index = size - 1;
1188 PyTupleObject *op = STATE.free_list[index];
1189 if (op != NULL) {
1190 /* op is the head of a linked list, with the first item
1191 pointing to the next node. Here we pop off the old head. */
1192 STATE.free_list[index] = (PyTupleObject *) op->ob_item[0];
1193 STATE.numfree[index]--;
1194 /* Inlined _PyObject_InitVar() without _PyType_HasFeature() test */
1195 #ifdef Py_TRACE_REFS
1196 /* maybe_freelist_push() ensures these were already set. */
1197 // XXX Can we drop these? See commit 68055ce6fe01 (GvR, Dec 1998).
1198 Py_SET_SIZE(op, size);
1199 Py_SET_TYPE(op, &PyTuple_Type);
1200 #endif
1201 _Py_NewReference((PyObject *)op);
1202 /* END inlined _PyObject_InitVar() */
1203 OBJECT_STAT_INC(from_freelist);
1204 return op;
1205 }
1206 }
1207 #endif
1208 return NULL;
1209 }
1210
1211 static inline int
maybe_freelist_push(PyTupleObject * op)1212 maybe_freelist_push(PyTupleObject *op)
1213 {
1214 #if PyTuple_NFREELISTS > 0
1215 PyInterpreterState *interp = _PyInterpreterState_GET();
1216 #ifdef Py_DEBUG
1217 /* maybe_freelist_push() must not be called after maybe_freelist_fini(). */
1218 assert(!FREELIST_FINALIZED);
1219 #endif
1220 if (Py_SIZE(op) == 0) {
1221 return 0;
1222 }
1223 Py_ssize_t index = Py_SIZE(op) - 1;
1224 if (index < PyTuple_NFREELISTS
1225 && STATE.numfree[index] < PyTuple_MAXFREELIST
1226 && Py_IS_TYPE(op, &PyTuple_Type))
1227 {
1228 /* op is the head of a linked list, with the first item
1229 pointing to the next node. Here we set op as the new head. */
1230 op->ob_item[0] = (PyObject *) STATE.free_list[index];
1231 STATE.free_list[index] = op;
1232 STATE.numfree[index]++;
1233 OBJECT_STAT_INC(to_freelist);
1234 return 1;
1235 }
1236 #endif
1237 return 0;
1238 }
1239
1240 static void
maybe_freelist_clear(PyInterpreterState * interp,int fini)1241 maybe_freelist_clear(PyInterpreterState *interp, int fini)
1242 {
1243 #if PyTuple_NFREELISTS > 0
1244 for (Py_ssize_t i = 0; i < PyTuple_NFREELISTS; i++) {
1245 PyTupleObject *p = STATE.free_list[i];
1246 STATE.free_list[i] = NULL;
1247 STATE.numfree[i] = fini ? -1 : 0;
1248 while (p) {
1249 PyTupleObject *q = p;
1250 p = (PyTupleObject *)(p->ob_item[0]);
1251 PyObject_GC_Del(q);
1252 }
1253 }
1254 #endif
1255 }
1256
1257 /* Print summary info about the state of the optimized allocator */
1258 void
_PyTuple_DebugMallocStats(FILE * out)1259 _PyTuple_DebugMallocStats(FILE *out)
1260 {
1261 #if PyTuple_NFREELISTS > 0
1262 PyInterpreterState *interp = _PyInterpreterState_GET();
1263 for (int i = 0; i < PyTuple_NFREELISTS; i++) {
1264 int len = i + 1;
1265 char buf[128];
1266 PyOS_snprintf(buf, sizeof(buf),
1267 "free %d-sized PyTupleObject", len);
1268 _PyDebugAllocatorStats(out, buf, STATE.numfree[i],
1269 _PyObject_VAR_SIZE(&PyTuple_Type, len));
1270 }
1271 #endif
1272 }
1273
1274 #undef STATE
1275 #undef FREELIST_FINALIZED
1276