Home | History | Annotate | Download | only in Objects
      1 
      2 /* Tuple object implementation */
      3 
      4 #include "Python.h"
      5 
      6 /* Speed optimization to avoid frequent malloc/free of small tuples */
      7 #ifndef PyTuple_MAXSAVESIZE
      8 #define PyTuple_MAXSAVESIZE     20  /* Largest tuple to save on free list */
      9 #endif
     10 #ifndef PyTuple_MAXFREELIST
     11 #define PyTuple_MAXFREELIST  2000  /* Maximum number of tuples of each size to save */
     12 #endif
     13 
     14 #if PyTuple_MAXSAVESIZE > 0
     15 /* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, entry 0 is the empty
     16    tuple () of which at most one instance will be allocated.
     17 */
     18 static PyTupleObject *free_list[PyTuple_MAXSAVESIZE];
     19 static int numfree[PyTuple_MAXSAVESIZE];
     20 #endif
     21 #ifdef COUNT_ALLOCS
     22 Py_ssize_t fast_tuple_allocs;
     23 Py_ssize_t tuple_zero_allocs;
     24 #endif
     25 
     26 /* Debug statistic to count GC tracking of tuples.
     27    Please note that tuples are only untracked when considered by the GC, and
     28    many of them will be dead before. Therefore, a tracking rate close to 100%
     29    does not necessarily prove that the heuristic is inefficient.
     30 */
     31 #ifdef SHOW_TRACK_COUNT
     32 static Py_ssize_t count_untracked = 0;
     33 static Py_ssize_t count_tracked = 0;
     34 
     35 static void
     36 show_track(void)
     37 {
     38     fprintf(stderr, "Tuples created: %" PY_FORMAT_SIZE_T "d\n",
     39         count_tracked + count_untracked);
     40     fprintf(stderr, "Tuples tracked by the GC: %" PY_FORMAT_SIZE_T
     41         "d\n", count_tracked);
     42     fprintf(stderr, "%.2f%% tuple tracking rate\n\n",
     43         (100.0*count_tracked/(count_untracked+count_tracked)));
     44 }
     45 #endif
     46 
     47 
     48 PyObject *
     49 PyTuple_New(register Py_ssize_t size)
     50 {
     51     register PyTupleObject *op;
     52     Py_ssize_t i;
     53     if (size < 0) {
     54         PyErr_BadInternalCall();
     55         return NULL;
     56     }
     57 #if PyTuple_MAXSAVESIZE > 0
     58     if (size == 0 && free_list[0]) {
     59         op = free_list[0];
     60         Py_INCREF(op);
     61 #ifdef COUNT_ALLOCS
     62         tuple_zero_allocs++;
     63 #endif
     64         return (PyObject *) op;
     65     }
     66     if (size < PyTuple_MAXSAVESIZE && (op = free_list[size]) != NULL) {
     67         free_list[size] = (PyTupleObject *) op->ob_item[0];
     68         numfree[size]--;
     69 #ifdef COUNT_ALLOCS
     70         fast_tuple_allocs++;
     71 #endif
     72         /* Inline PyObject_InitVar */
     73 #ifdef Py_TRACE_REFS
     74         Py_SIZE(op) = size;
     75         Py_TYPE(op) = &PyTuple_Type;
     76 #endif
     77         _Py_NewReference((PyObject *)op);
     78     }
     79     else
     80 #endif
     81     {
     82         Py_ssize_t nbytes = size * sizeof(PyObject *);
     83         /* Check for overflow */
     84         if (nbytes / sizeof(PyObject *) != (size_t)size ||
     85             (nbytes > PY_SSIZE_T_MAX - sizeof(PyTupleObject) - sizeof(PyObject *)))
     86         {
     87             return PyErr_NoMemory();
     88         }
     89 
     90         op = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size);
     91         if (op == NULL)
     92             return NULL;
     93     }
     94     for (i=0; i < size; i++)
     95         op->ob_item[i] = NULL;
     96 #if PyTuple_MAXSAVESIZE > 0
     97     if (size == 0) {
     98         free_list[0] = op;
     99         ++numfree[0];
    100         Py_INCREF(op);          /* extra INCREF so that this is never freed */
    101     }
    102 #endif
    103 #ifdef SHOW_TRACK_COUNT
    104     count_tracked++;
    105 #endif
    106     _PyObject_GC_TRACK(op);
    107     return (PyObject *) op;
    108 }
    109 
    110 Py_ssize_t
    111 PyTuple_Size(register PyObject *op)
    112 {
    113     if (!PyTuple_Check(op)) {
    114         PyErr_BadInternalCall();
    115         return -1;
    116     }
    117     else
    118         return Py_SIZE(op);
    119 }
    120 
    121 PyObject *
    122 PyTuple_GetItem(register PyObject *op, register Py_ssize_t i)
    123 {
    124     if (!PyTuple_Check(op)) {
    125         PyErr_BadInternalCall();
    126         return NULL;
    127     }
    128     if (i < 0 || i >= Py_SIZE(op)) {
    129         PyErr_SetString(PyExc_IndexError, "tuple index out of range");
    130         return NULL;
    131     }
    132     return ((PyTupleObject *)op) -> ob_item[i];
    133 }
    134 
    135 int
    136 PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
    137 {
    138     register PyObject *olditem;
    139     register PyObject **p;
    140     if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
    141         Py_XDECREF(newitem);
    142         PyErr_BadInternalCall();
    143         return -1;
    144     }
    145     if (i < 0 || i >= Py_SIZE(op)) {
    146         Py_XDECREF(newitem);
    147         PyErr_SetString(PyExc_IndexError,
    148                         "tuple assignment index out of range");
    149         return -1;
    150     }
    151     p = ((PyTupleObject *)op) -> ob_item + i;
    152     olditem = *p;
    153     *p = newitem;
    154     Py_XDECREF(olditem);
    155     return 0;
    156 }
    157 
    158 void
    159 _PyTuple_MaybeUntrack(PyObject *op)
    160 {
    161     PyTupleObject *t;
    162     Py_ssize_t i, n;
    163 
    164     if (!PyTuple_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op))
    165         return;
    166     t = (PyTupleObject *) op;
    167     n = Py_SIZE(t);
    168     for (i = 0; i < n; i++) {
    169         PyObject *elt = PyTuple_GET_ITEM(t, i);
    170         /* Tuple with NULL elements aren't
    171            fully constructed, don't untrack
    172            them yet. */
    173         if (!elt ||
    174             _PyObject_GC_MAY_BE_TRACKED(elt))
    175             return;
    176     }
    177 #ifdef SHOW_TRACK_COUNT
    178     count_tracked--;
    179     count_untracked++;
    180 #endif
    181     _PyObject_GC_UNTRACK(op);
    182 }
    183 
    184 PyObject *
    185 PyTuple_Pack(Py_ssize_t n, ...)
    186 {
    187     Py_ssize_t i;
    188     PyObject *o;
    189     PyObject *result;
    190     PyObject **items;
    191     va_list vargs;
    192 
    193     va_start(vargs, n);
    194     result = PyTuple_New(n);
    195     if (result == NULL)
    196         return NULL;
    197     items = ((PyTupleObject *)result)->ob_item;
    198     for (i = 0; i < n; i++) {
    199         o = va_arg(vargs, PyObject *);
    200         Py_INCREF(o);
    201         items[i] = o;
    202     }
    203     va_end(vargs);
    204     return result;
    205 }
    206 
    207 
    208 /* Methods */
    209 
    210 static void
    211 tupledealloc(register PyTupleObject *op)
    212 {
    213     register Py_ssize_t i;
    214     register Py_ssize_t len =  Py_SIZE(op);
    215     PyObject_GC_UnTrack(op);
    216     Py_TRASHCAN_SAFE_BEGIN(op)
    217     if (len > 0) {
    218         i = len;
    219         while (--i >= 0)
    220             Py_XDECREF(op->ob_item[i]);
    221 #if PyTuple_MAXSAVESIZE > 0
    222         if (len < PyTuple_MAXSAVESIZE &&
    223             numfree[len] < PyTuple_MAXFREELIST &&
    224             Py_TYPE(op) == &PyTuple_Type)
    225         {
    226             op->ob_item[0] = (PyObject *) free_list[len];
    227             numfree[len]++;
    228             free_list[len] = op;
    229             goto done; /* return */
    230         }
    231 #endif
    232     }
    233     Py_TYPE(op)->tp_free((PyObject *)op);
    234 done:
    235     Py_TRASHCAN_SAFE_END(op)
    236 }
    237 
    238 static int
    239 tupleprint(PyTupleObject *op, FILE *fp, int flags)
    240 {
    241     Py_ssize_t i;
    242     Py_BEGIN_ALLOW_THREADS
    243     fprintf(fp, "(");
    244     Py_END_ALLOW_THREADS
    245     for (i = 0; i < Py_SIZE(op); i++) {
    246         if (i > 0) {
    247             Py_BEGIN_ALLOW_THREADS
    248             fprintf(fp, ", ");
    249             Py_END_ALLOW_THREADS
    250         }
    251         if (PyObject_Print(op->ob_item[i], fp, 0) != 0)
    252             return -1;
    253     }
    254     i = Py_SIZE(op);
    255     Py_BEGIN_ALLOW_THREADS
    256     if (i == 1)
    257         fprintf(fp, ",");
    258     fprintf(fp, ")");
    259     Py_END_ALLOW_THREADS
    260     return 0;
    261 }
    262 
    263 static PyObject *
    264 tuplerepr(PyTupleObject *v)
    265 {
    266     Py_ssize_t i, n;
    267     PyObject *s, *temp;
    268     PyObject *pieces, *result = NULL;
    269 
    270     n = Py_SIZE(v);
    271     if (n == 0)
    272         return PyString_FromString("()");
    273 
    274     /* While not mutable, it is still possible to end up with a cycle in a
    275        tuple through an object that stores itself within a tuple (and thus
    276        infinitely asks for the repr of itself). This should only be
    277        possible within a type. */
    278     i = Py_ReprEnter((PyObject *)v);
    279     if (i != 0) {
    280         return i > 0 ? PyString_FromString("(...)") : NULL;
    281     }
    282 
    283     pieces = PyTuple_New(n);
    284     if (pieces == NULL)
    285         return NULL;
    286 
    287     /* Do repr() on each element. */
    288     for (i = 0; i < n; ++i) {
    289         if (Py_EnterRecursiveCall(" while getting the repr of a tuple"))
    290             goto Done;
    291         s = PyObject_Repr(v->ob_item[i]);
    292         Py_LeaveRecursiveCall();
    293         if (s == NULL)
    294             goto Done;
    295         PyTuple_SET_ITEM(pieces, i, s);
    296     }
    297 
    298     /* Add "()" decorations to the first and last items. */
    299     assert(n > 0);
    300     s = PyString_FromString("(");
    301     if (s == NULL)
    302         goto Done;
    303     temp = PyTuple_GET_ITEM(pieces, 0);
    304     PyString_ConcatAndDel(&s, temp);
    305     PyTuple_SET_ITEM(pieces, 0, s);
    306     if (s == NULL)
    307         goto Done;
    308 
    309     s = PyString_FromString(n == 1 ? ",)" : ")");
    310     if (s == NULL)
    311         goto Done;
    312     temp = PyTuple_GET_ITEM(pieces, n-1);
    313     PyString_ConcatAndDel(&temp, s);
    314     PyTuple_SET_ITEM(pieces, n-1, temp);
    315     if (temp == NULL)
    316         goto Done;
    317 
    318     /* Paste them all together with ", " between. */
    319     s = PyString_FromString(", ");
    320     if (s == NULL)
    321         goto Done;
    322     result = _PyString_Join(s, pieces);
    323     Py_DECREF(s);
    324 
    325 Done:
    326     Py_DECREF(pieces);
    327     Py_ReprLeave((PyObject *)v);
    328     return result;
    329 }
    330 
    331 /* The addend 82520, was selected from the range(0, 1000000) for
    332    generating the greatest number of prime multipliers for tuples
    333    upto length eight:
    334 
    335      1082527, 1165049, 1082531, 1165057, 1247581, 1330103, 1082533,
    336      1330111, 1412633, 1165069, 1247599, 1495177, 1577699
    337 */
    338 
    339 static long
    340 tuplehash(PyTupleObject *v)
    341 {
    342     register long x, y;
    343     register Py_ssize_t len = Py_SIZE(v);
    344     register PyObject **p;
    345     long mult = 1000003L;
    346     x = 0x345678L;
    347     p = v->ob_item;
    348     while (--len >= 0) {
    349         y = PyObject_Hash(*p++);
    350         if (y == -1)
    351             return -1;
    352         x = (x ^ y) * mult;
    353         /* the cast might truncate len; that doesn't change hash stability */
    354         mult += (long)(82520L + len + len);
    355     }
    356     x += 97531L;
    357     if (x == -1)
    358         x = -2;
    359     return x;
    360 }
    361 
    362 static Py_ssize_t
    363 tuplelength(PyTupleObject *a)
    364 {
    365     return Py_SIZE(a);
    366 }
    367 
    368 static int
    369 tuplecontains(PyTupleObject *a, PyObject *el)
    370 {
    371     Py_ssize_t i;
    372     int cmp;
    373 
    374     for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
    375         cmp = PyObject_RichCompareBool(el, PyTuple_GET_ITEM(a, i),
    376                                            Py_EQ);
    377     return cmp;
    378 }
    379 
    380 static PyObject *
    381 tupleitem(register PyTupleObject *a, register Py_ssize_t i)
    382 {
    383     if (i < 0 || i >= Py_SIZE(a)) {
    384         PyErr_SetString(PyExc_IndexError, "tuple index out of range");
    385         return NULL;
    386     }
    387     Py_INCREF(a->ob_item[i]);
    388     return a->ob_item[i];
    389 }
    390 
    391 static PyObject *
    392 tupleslice(register PyTupleObject *a, register Py_ssize_t ilow,
    393            register Py_ssize_t ihigh)
    394 {
    395     register PyTupleObject *np;
    396     PyObject **src, **dest;
    397     register Py_ssize_t i;
    398     Py_ssize_t len;
    399     if (ilow < 0)
    400         ilow = 0;
    401     if (ihigh > Py_SIZE(a))
    402         ihigh = Py_SIZE(a);
    403     if (ihigh < ilow)
    404         ihigh = ilow;
    405     if (ilow == 0 && ihigh == Py_SIZE(a) && PyTuple_CheckExact(a)) {
    406         Py_INCREF(a);
    407         return (PyObject *)a;
    408     }
    409     len = ihigh - ilow;
    410     np = (PyTupleObject *)PyTuple_New(len);
    411     if (np == NULL)
    412         return NULL;
    413     src = a->ob_item + ilow;
    414     dest = np->ob_item;
    415     for (i = 0; i < len; i++) {
    416         PyObject *v = src[i];
    417         Py_INCREF(v);
    418         dest[i] = v;
    419     }
    420     return (PyObject *)np;
    421 }
    422 
    423 PyObject *
    424 PyTuple_GetSlice(PyObject *op, Py_ssize_t i, Py_ssize_t j)
    425 {
    426     if (op == NULL || !PyTuple_Check(op)) {
    427         PyErr_BadInternalCall();
    428         return NULL;
    429     }
    430     return tupleslice((PyTupleObject *)op, i, j);
    431 }
    432 
    433 static PyObject *
    434 tupleconcat(register PyTupleObject *a, register PyObject *bb)
    435 {
    436     register Py_ssize_t size;
    437     register Py_ssize_t i;
    438     PyObject **src, **dest;
    439     PyTupleObject *np;
    440     if (!PyTuple_Check(bb)) {
    441         PyErr_Format(PyExc_TypeError,
    442              "can only concatenate tuple (not \"%.200s\") to tuple",
    443                  Py_TYPE(bb)->tp_name);
    444         return NULL;
    445     }
    446 #define b ((PyTupleObject *)bb)
    447     size = Py_SIZE(a) + Py_SIZE(b);
    448     if (size < 0)
    449         return PyErr_NoMemory();
    450     np = (PyTupleObject *) PyTuple_New(size);
    451     if (np == NULL) {
    452         return NULL;
    453     }
    454     src = a->ob_item;
    455     dest = np->ob_item;
    456     for (i = 0; i < Py_SIZE(a); i++) {
    457         PyObject *v = src[i];
    458         Py_INCREF(v);
    459         dest[i] = v;
    460     }
    461     src = b->ob_item;
    462     dest = np->ob_item + Py_SIZE(a);
    463     for (i = 0; i < Py_SIZE(b); i++) {
    464         PyObject *v = src[i];
    465         Py_INCREF(v);
    466         dest[i] = v;
    467     }
    468     return (PyObject *)np;
    469 #undef b
    470 }
    471 
    472 static PyObject *
    473 tuplerepeat(PyTupleObject *a, Py_ssize_t n)
    474 {
    475     Py_ssize_t i, j;
    476     Py_ssize_t size;
    477     PyTupleObject *np;
    478     PyObject **p, **items;
    479     if (n < 0)
    480         n = 0;
    481     if (Py_SIZE(a) == 0 || n == 1) {
    482         if (PyTuple_CheckExact(a)) {
    483             /* Since tuples are immutable, we can return a shared
    484                copy in this case */
    485             Py_INCREF(a);
    486             return (PyObject *)a;
    487         }
    488         if (Py_SIZE(a) == 0)
    489             return PyTuple_New(0);
    490     }
    491     size = Py_SIZE(a) * n;
    492     if (size/Py_SIZE(a) != n)
    493         return PyErr_NoMemory();
    494     np = (PyTupleObject *) PyTuple_New(size);
    495     if (np == NULL)
    496         return NULL;
    497     p = np->ob_item;
    498     items = a->ob_item;
    499     for (i = 0; i < n; i++) {
    500         for (j = 0; j < Py_SIZE(a); j++) {
    501             *p = items[j];
    502             Py_INCREF(*p);
    503             p++;
    504         }
    505     }
    506     return (PyObject *) np;
    507 }
    508 
    509 static PyObject *
    510 tupleindex(PyTupleObject *self, PyObject *args)
    511 {
    512     Py_ssize_t i, start=0, stop=Py_SIZE(self);
    513     PyObject *v;
    514 
    515     if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
    516                                 _PyEval_SliceIndex, &start,
    517                                 _PyEval_SliceIndex, &stop))
    518         return NULL;
    519     if (start < 0) {
    520         start += Py_SIZE(self);
    521         if (start < 0)
    522             start = 0;
    523     }
    524     if (stop < 0) {
    525         stop += Py_SIZE(self);
    526         if (stop < 0)
    527             stop = 0;
    528     }
    529     for (i = start; i < stop && i < Py_SIZE(self); i++) {
    530         int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
    531         if (cmp > 0)
    532             return PyInt_FromSsize_t(i);
    533         else if (cmp < 0)
    534             return NULL;
    535     }
    536     PyErr_SetString(PyExc_ValueError, "tuple.index(x): x not in tuple");
    537     return NULL;
    538 }
    539 
    540 static PyObject *
    541 tuplecount(PyTupleObject *self, PyObject *v)
    542 {
    543     Py_ssize_t count = 0;
    544     Py_ssize_t i;
    545 
    546     for (i = 0; i < Py_SIZE(self); i++) {
    547         int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
    548         if (cmp > 0)
    549             count++;
    550         else if (cmp < 0)
    551             return NULL;
    552     }
    553     return PyInt_FromSsize_t(count);
    554 }
    555 
    556 static int
    557 tupletraverse(PyTupleObject *o, visitproc visit, void *arg)
    558 {
    559     Py_ssize_t i;
    560 
    561     for (i = Py_SIZE(o); --i >= 0; )
    562         Py_VISIT(o->ob_item[i]);
    563     return 0;
    564 }
    565 
    566 static PyObject *
    567 tuplerichcompare(PyObject *v, PyObject *w, int op)
    568 {
    569     PyTupleObject *vt, *wt;
    570     Py_ssize_t i;
    571     Py_ssize_t vlen, wlen;
    572 
    573     if (!PyTuple_Check(v) || !PyTuple_Check(w)) {
    574         Py_INCREF(Py_NotImplemented);
    575         return Py_NotImplemented;
    576     }
    577 
    578     vt = (PyTupleObject *)v;
    579     wt = (PyTupleObject *)w;
    580 
    581     vlen = Py_SIZE(vt);
    582     wlen = Py_SIZE(wt);
    583 
    584     /* Note:  the corresponding code for lists has an "early out" test
    585      * here when op is EQ or NE and the lengths differ.  That pays there,
    586      * but Tim was unable to find any real code where EQ/NE tuple
    587      * compares don't have the same length, so testing for it here would
    588      * have cost without benefit.
    589      */
    590 
    591     /* Search for the first index where items are different.
    592      * Note that because tuples are immutable, it's safe to reuse
    593      * vlen and wlen across the comparison calls.
    594      */
    595     for (i = 0; i < vlen && i < wlen; i++) {
    596         int k = PyObject_RichCompareBool(vt->ob_item[i],
    597                                          wt->ob_item[i], Py_EQ);
    598         if (k < 0)
    599             return NULL;
    600         if (!k)
    601             break;
    602     }
    603 
    604     if (i >= vlen || i >= wlen) {
    605         /* No more items to compare -- compare sizes */
    606         int cmp;
    607         PyObject *res;
    608         switch (op) {
    609         case Py_LT: cmp = vlen <  wlen; break;
    610         case Py_LE: cmp = vlen <= wlen; break;
    611         case Py_EQ: cmp = vlen == wlen; break;
    612         case Py_NE: cmp = vlen != wlen; break;
    613         case Py_GT: cmp = vlen >  wlen; break;
    614         case Py_GE: cmp = vlen >= wlen; break;
    615         default: return NULL; /* cannot happen */
    616         }
    617         if (cmp)
    618             res = Py_True;
    619         else
    620             res = Py_False;
    621         Py_INCREF(res);
    622         return res;
    623     }
    624 
    625     /* We have an item that differs -- shortcuts for EQ/NE */
    626     if (op == Py_EQ) {
    627         Py_INCREF(Py_False);
    628         return Py_False;
    629     }
    630     if (op == Py_NE) {
    631         Py_INCREF(Py_True);
    632         return Py_True;
    633     }
    634 
    635     /* Compare the final item again using the proper operator */
    636     return PyObject_RichCompare(vt->ob_item[i], wt->ob_item[i], op);
    637 }
    638 
    639 static PyObject *
    640 tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
    641 
    642 static PyObject *
    643 tuple_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    644 {
    645     PyObject *arg = NULL;
    646     static char *kwlist[] = {"sequence", 0};
    647 
    648     if (type != &PyTuple_Type)
    649         return tuple_subtype_new(type, args, kwds);
    650     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:tuple", kwlist, &arg))
    651         return NULL;
    652 
    653     if (arg == NULL)
    654         return PyTuple_New(0);
    655     else
    656         return PySequence_Tuple(arg);
    657 }
    658 
    659 static PyObject *
    660 tuple_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
    661 {
    662     PyObject *tmp, *newobj, *item;
    663     Py_ssize_t i, n;
    664 
    665     assert(PyType_IsSubtype(type, &PyTuple_Type));
    666     tmp = tuple_new(&PyTuple_Type, args, kwds);
    667     if (tmp == NULL)
    668         return NULL;
    669     assert(PyTuple_Check(tmp));
    670     newobj = type->tp_alloc(type, n = PyTuple_GET_SIZE(tmp));
    671     if (newobj == NULL)
    672         return NULL;
    673     for (i = 0; i < n; i++) {
    674         item = PyTuple_GET_ITEM(tmp, i);
    675         Py_INCREF(item);
    676         PyTuple_SET_ITEM(newobj, i, item);
    677     }
    678     Py_DECREF(tmp);
    679     return newobj;
    680 }
    681 
    682 PyDoc_STRVAR(tuple_doc,
    683 "tuple() -> empty tuple\n\
    684 tuple(iterable) -> tuple initialized from iterable's items\n\
    685 \n\
    686 If the argument is a tuple, the return value is the same object.");
    687 
    688 static PySequenceMethods tuple_as_sequence = {
    689     (lenfunc)tuplelength,                       /* sq_length */
    690     (binaryfunc)tupleconcat,                    /* sq_concat */
    691     (ssizeargfunc)tuplerepeat,                  /* sq_repeat */
    692     (ssizeargfunc)tupleitem,                    /* sq_item */
    693     (ssizessizeargfunc)tupleslice,              /* sq_slice */
    694     0,                                          /* sq_ass_item */
    695     0,                                          /* sq_ass_slice */
    696     (objobjproc)tuplecontains,                  /* sq_contains */
    697 };
    698 
    699 static PyObject*
    700 tuplesubscript(PyTupleObject* self, PyObject* item)
    701 {
    702     if (PyIndex_Check(item)) {
    703         Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
    704         if (i == -1 && PyErr_Occurred())
    705             return NULL;
    706         if (i < 0)
    707             i += PyTuple_GET_SIZE(self);
    708         return tupleitem(self, i);
    709     }
    710     else if (PySlice_Check(item)) {
    711         Py_ssize_t start, stop, step, slicelength, cur, i;
    712         PyObject* result;
    713         PyObject* it;
    714         PyObject **src, **dest;
    715 
    716         if (PySlice_GetIndicesEx((PySliceObject*)item,
    717                          PyTuple_GET_SIZE(self),
    718                          &start, &stop, &step, &slicelength) < 0) {
    719             return NULL;
    720         }
    721 
    722         if (slicelength <= 0) {
    723             return PyTuple_New(0);
    724         }
    725         else if (start == 0 && step == 1 &&
    726                  slicelength == PyTuple_GET_SIZE(self) &&
    727                  PyTuple_CheckExact(self)) {
    728             Py_INCREF(self);
    729             return (PyObject *)self;
    730         }
    731         else {
    732             result = PyTuple_New(slicelength);
    733             if (!result) return NULL;
    734 
    735             src = self->ob_item;
    736             dest = ((PyTupleObject *)result)->ob_item;
    737             for (cur = start, i = 0; i < slicelength;
    738                  cur += step, i++) {
    739                 it = src[cur];
    740                 Py_INCREF(it);
    741                 dest[i] = it;
    742             }
    743 
    744             return result;
    745         }
    746     }
    747     else {
    748         PyErr_Format(PyExc_TypeError,
    749                      "tuple indices must be integers, not %.200s",
    750                      Py_TYPE(item)->tp_name);
    751         return NULL;
    752     }
    753 }
    754 
    755 static PyObject *
    756 tuple_getnewargs(PyTupleObject *v)
    757 {
    758     return Py_BuildValue("(N)", tupleslice(v, 0, Py_SIZE(v)));
    759 
    760 }
    761 
    762 static PyObject *
    763 tuple_sizeof(PyTupleObject *self)
    764 {
    765     Py_ssize_t res;
    766 
    767     res = PyTuple_Type.tp_basicsize + Py_SIZE(self) * sizeof(PyObject *);
    768     return PyInt_FromSsize_t(res);
    769 }
    770 
    771 PyDoc_STRVAR(index_doc,
    772 "T.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
    773 "Raises ValueError if the value is not present."
    774 );
    775 PyDoc_STRVAR(count_doc,
    776 "T.count(value) -> integer -- return number of occurrences of value");
    777 PyDoc_STRVAR(sizeof_doc,
    778 "T.__sizeof__() -- size of T in memory, in bytes");
    779 
    780 static PyMethodDef tuple_methods[] = {
    781     {"__getnewargs__",          (PyCFunction)tuple_getnewargs,  METH_NOARGS},
    782     {"__sizeof__",      (PyCFunction)tuple_sizeof, METH_NOARGS, sizeof_doc},
    783     {"index",           (PyCFunction)tupleindex,  METH_VARARGS, index_doc},
    784     {"count",           (PyCFunction)tuplecount,  METH_O, count_doc},
    785     {NULL,              NULL}           /* sentinel */
    786 };
    787 
    788 static PyMappingMethods tuple_as_mapping = {
    789     (lenfunc)tuplelength,
    790     (binaryfunc)tuplesubscript,
    791     0
    792 };
    793 
    794 static PyObject *tuple_iter(PyObject *seq);
    795 
    796 PyTypeObject PyTuple_Type = {
    797     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    798     "tuple",
    799     sizeof(PyTupleObject) - sizeof(PyObject *),
    800     sizeof(PyObject *),
    801     (destructor)tupledealloc,                   /* tp_dealloc */
    802     (printfunc)tupleprint,                      /* tp_print */
    803     0,                                          /* tp_getattr */
    804     0,                                          /* tp_setattr */
    805     0,                                          /* tp_compare */
    806     (reprfunc)tuplerepr,                        /* tp_repr */
    807     0,                                          /* tp_as_number */
    808     &tuple_as_sequence,                         /* tp_as_sequence */
    809     &tuple_as_mapping,                          /* tp_as_mapping */
    810     (hashfunc)tuplehash,                        /* tp_hash */
    811     0,                                          /* tp_call */
    812     0,                                          /* tp_str */
    813     PyObject_GenericGetAttr,                    /* tp_getattro */
    814     0,                                          /* tp_setattro */
    815     0,                                          /* tp_as_buffer */
    816     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
    817         Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TUPLE_SUBCLASS, /* tp_flags */
    818     tuple_doc,                                  /* tp_doc */
    819     (traverseproc)tupletraverse,                /* tp_traverse */
    820     0,                                          /* tp_clear */
    821     tuplerichcompare,                           /* tp_richcompare */
    822     0,                                          /* tp_weaklistoffset */
    823     tuple_iter,                                 /* tp_iter */
    824     0,                                          /* tp_iternext */
    825     tuple_methods,                              /* tp_methods */
    826     0,                                          /* tp_members */
    827     0,                                          /* tp_getset */
    828     0,                                          /* tp_base */
    829     0,                                          /* tp_dict */
    830     0,                                          /* tp_descr_get */
    831     0,                                          /* tp_descr_set */
    832     0,                                          /* tp_dictoffset */
    833     0,                                          /* tp_init */
    834     0,                                          /* tp_alloc */
    835     tuple_new,                                  /* tp_new */
    836     PyObject_GC_Del,                            /* tp_free */
    837 };
    838 
    839 /* The following function breaks the notion that tuples are immutable:
    840    it changes the size of a tuple.  We get away with this only if there
    841    is only one module referencing the object.  You can also think of it
    842    as creating a new tuple object and destroying the old one, only more
    843    efficiently.  In any case, don't use this if the tuple may already be
    844    known to some other part of the code. */
    845 
    846 int
    847 _PyTuple_Resize(PyObject **pv, Py_ssize_t newsize)
    848 {
    849     register PyTupleObject *v;
    850     register PyTupleObject *sv;
    851     Py_ssize_t i;
    852     Py_ssize_t oldsize;
    853 
    854     v = (PyTupleObject *) *pv;
    855     if (v == NULL || Py_TYPE(v) != &PyTuple_Type ||
    856         (Py_SIZE(v) != 0 && Py_REFCNT(v) != 1)) {
    857         *pv = 0;
    858         Py_XDECREF(v);
    859         PyErr_BadInternalCall();
    860         return -1;
    861     }
    862     oldsize = Py_SIZE(v);
    863     if (oldsize == newsize)
    864         return 0;
    865 
    866     if (oldsize == 0) {
    867         /* Empty tuples are often shared, so we should never
    868            resize them in-place even if we do own the only
    869            (current) reference */
    870         Py_DECREF(v);
    871         *pv = PyTuple_New(newsize);
    872         return *pv == NULL ? -1 : 0;
    873     }
    874 
    875     /* XXX UNREF/NEWREF interface should be more symmetrical */
    876     _Py_DEC_REFTOTAL;
    877     if (_PyObject_GC_IS_TRACKED(v))
    878         _PyObject_GC_UNTRACK(v);
    879     _Py_ForgetReference((PyObject *) v);
    880     /* DECREF items deleted by shrinkage */
    881     for (i = newsize; i < oldsize; i++) {
    882         Py_XDECREF(v->ob_item[i]);
    883         v->ob_item[i] = NULL;
    884     }
    885     sv = PyObject_GC_Resize(PyTupleObject, v, newsize);
    886     if (sv == NULL) {
    887         *pv = NULL;
    888         PyObject_GC_Del(v);
    889         return -1;
    890     }
    891     _Py_NewReference((PyObject *) sv);
    892     /* Zero out items added by growing */
    893     if (newsize > oldsize)
    894         memset(&sv->ob_item[oldsize], 0,
    895                sizeof(*sv->ob_item) * (newsize - oldsize));
    896     *pv = (PyObject *) sv;
    897     _PyObject_GC_TRACK(sv);
    898     return 0;
    899 }
    900 
    901 int
    902 PyTuple_ClearFreeList(void)
    903 {
    904     int freelist_size = 0;
    905 #if PyTuple_MAXSAVESIZE > 0
    906     int i;
    907     for (i = 1; i < PyTuple_MAXSAVESIZE; i++) {
    908         PyTupleObject *p, *q;
    909         p = free_list[i];
    910         freelist_size += numfree[i];
    911         free_list[i] = NULL;
    912         numfree[i] = 0;
    913         while (p) {
    914             q = p;
    915             p = (PyTupleObject *)(p->ob_item[0]);
    916             PyObject_GC_Del(q);
    917         }
    918     }
    919 #endif
    920     return freelist_size;
    921 }
    922 
    923 void
    924 PyTuple_Fini(void)
    925 {
    926 #if PyTuple_MAXSAVESIZE > 0
    927     /* empty tuples are used all over the place and applications may
    928      * rely on the fact that an empty tuple is a singleton. */
    929     Py_XDECREF(free_list[0]);
    930     free_list[0] = NULL;
    931 
    932     (void)PyTuple_ClearFreeList();
    933 #endif
    934 #ifdef SHOW_TRACK_COUNT
    935     show_track();
    936 #endif
    937 }
    938 
    939 /*********************** Tuple Iterator **************************/
    940 
    941 typedef struct {
    942     PyObject_HEAD
    943     long it_index;
    944     PyTupleObject *it_seq; /* Set to NULL when iterator is exhausted */
    945 } tupleiterobject;
    946 
    947 static void
    948 tupleiter_dealloc(tupleiterobject *it)
    949 {
    950     _PyObject_GC_UNTRACK(it);
    951     Py_XDECREF(it->it_seq);
    952     PyObject_GC_Del(it);
    953 }
    954 
    955 static int
    956 tupleiter_traverse(tupleiterobject *it, visitproc visit, void *arg)
    957 {
    958     Py_VISIT(it->it_seq);
    959     return 0;
    960 }
    961 
    962 static PyObject *
    963 tupleiter_next(tupleiterobject *it)
    964 {
    965     PyTupleObject *seq;
    966     PyObject *item;
    967 
    968     assert(it != NULL);
    969     seq = it->it_seq;
    970     if (seq == NULL)
    971         return NULL;
    972     assert(PyTuple_Check(seq));
    973 
    974     if (it->it_index < PyTuple_GET_SIZE(seq)) {
    975         item = PyTuple_GET_ITEM(seq, it->it_index);
    976         ++it->it_index;
    977         Py_INCREF(item);
    978         return item;
    979     }
    980 
    981     Py_DECREF(seq);
    982     it->it_seq = NULL;
    983     return NULL;
    984 }
    985 
    986 static PyObject *
    987 tupleiter_len(tupleiterobject *it)
    988 {
    989     Py_ssize_t len = 0;
    990     if (it->it_seq)
    991         len = PyTuple_GET_SIZE(it->it_seq) - it->it_index;
    992     return PyInt_FromSsize_t(len);
    993 }
    994 
    995 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
    996 
    997 static PyMethodDef tupleiter_methods[] = {
    998     {"__length_hint__", (PyCFunction)tupleiter_len, METH_NOARGS, length_hint_doc},
    999     {NULL,              NULL}           /* sentinel */
   1000 };
   1001 
   1002 PyTypeObject PyTupleIter_Type = {
   1003     PyVarObject_HEAD_INIT(&PyType_Type, 0)
   1004     "tupleiterator",                            /* tp_name */
   1005     sizeof(tupleiterobject),                    /* tp_basicsize */
   1006     0,                                          /* tp_itemsize */
   1007     /* methods */
   1008     (destructor)tupleiter_dealloc,              /* tp_dealloc */
   1009     0,                                          /* tp_print */
   1010     0,                                          /* tp_getattr */
   1011     0,                                          /* tp_setattr */
   1012     0,                                          /* tp_compare */
   1013     0,                                          /* tp_repr */
   1014     0,                                          /* tp_as_number */
   1015     0,                                          /* tp_as_sequence */
   1016     0,                                          /* tp_as_mapping */
   1017     0,                                          /* tp_hash */
   1018     0,                                          /* tp_call */
   1019     0,                                          /* tp_str */
   1020     PyObject_GenericGetAttr,                    /* tp_getattro */
   1021     0,                                          /* tp_setattro */
   1022     0,                                          /* tp_as_buffer */
   1023     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
   1024     0,                                          /* tp_doc */
   1025     (traverseproc)tupleiter_traverse,           /* tp_traverse */
   1026     0,                                          /* tp_clear */
   1027     0,                                          /* tp_richcompare */
   1028     0,                                          /* tp_weaklistoffset */
   1029     PyObject_SelfIter,                          /* tp_iter */
   1030     (iternextfunc)tupleiter_next,               /* tp_iternext */
   1031     tupleiter_methods,                          /* tp_methods */
   1032     0,
   1033 };
   1034 
   1035 static PyObject *
   1036 tuple_iter(PyObject *seq)
   1037 {
   1038     tupleiterobject *it;
   1039 
   1040     if (!PyTuple_Check(seq)) {
   1041         PyErr_BadInternalCall();
   1042         return NULL;
   1043     }
   1044     it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
   1045     if (it == NULL)
   1046         return NULL;
   1047     it->it_index = 0;
   1048     Py_INCREF(seq);
   1049     it->it_seq = (PyTupleObject *)seq;
   1050     _PyObject_GC_TRACK(it);
   1051     return (PyObject *)it;
   1052 }
   1053