153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* List object implementation */
253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#include "Python.h"
453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifdef STDC_HEADERS
653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#include <stddef.h>
753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#else
853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#include <sys/types.h>          /* For size_t */
953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
1053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
1153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Ensure ob_item has room for at least newsize elements, and set
1253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * ob_size to newsize.  If newsize > ob_size on entry, the content
1353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * of the new slots at exit is undefined heap trash; it's the caller's
1453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * responsibility to overwrite them with sane values.
1553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * The number of allocated elements may grow, shrink, or stay the same.
1653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Failure is impossible if newsize <= self.allocated on entry, although
1753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * that partly relies on an assumption that the system realloc() never
1853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * fails when passed a number of bytes <= the number of bytes last
1953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * allocated (the C standard doesn't guarantee this, but it's hard to
2053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * imagine a realloc implementation where it wouldn't be true).
2153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Note that self->ob_item may change, and even if newsize is less
2253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * than ob_size on entry.
2353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
2453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
2553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_resize(PyListObject *self, Py_ssize_t newsize)
2653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
2753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **items;
2853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size_t new_allocated;
2953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t allocated = self->allocated;
3053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
3153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Bypass realloc() when a previous overallocation is large enough
3253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       to accommodate the newsize.  If the newsize falls lower than half
3353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       the allocated size, then proceed with the realloc() to shrink the list.
3453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    */
3553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (allocated >= newsize && newsize >= (allocated >> 1)) {
3653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(self->ob_item != NULL || newsize == 0);
3753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_SIZE(self) = newsize;
3853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 0;
3953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
4053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
4153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* This over-allocates proportional to the list size, making room
4253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * for additional growth.  The over-allocation is mild, but is
4353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * enough to give linear-time amortized behavior over a long
4453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * sequence of appends() in the presence of a poorly-performing
4553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * system realloc().
4653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
4753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
4853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
4953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
5053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* check for integer overflow */
5153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (new_allocated > PY_SIZE_MAX - newsize) {
5253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_NoMemory();
5353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
5453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    } else {
5553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        new_allocated += newsize;
5653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
5753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
5853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (newsize == 0)
5953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        new_allocated = 0;
6053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items = self->ob_item;
6153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
6253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_RESIZE(items, PyObject *, new_allocated);
6353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else
6453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        items = NULL;
6553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (items == NULL) {
6653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_NoMemory();
6753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
6853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
6953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->ob_item = items;
7053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_SIZE(self) = newsize;
7153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->allocated = new_allocated;
7253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
7353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
7453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
7553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Debug statistic to compare allocations with reuse through the free list */
7653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#undef SHOW_ALLOC_COUNT
7753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifdef SHOW_ALLOC_COUNT
7853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic size_t count_alloc = 0;
7953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic size_t count_reuse = 0;
8053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
8153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
8253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielshow_alloc(void)
8353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
8453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
8553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        count_alloc);
8653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
8753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        "d\n", count_reuse);
8853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    fprintf(stderr, "%.2f%% reuse rate\n\n",
8953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        (100.0*count_reuse/(count_alloc+count_reuse)));
9053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
9153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
9253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
9353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Empty list reuse scheme to save calls to malloc and free */
9453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifndef PyList_MAXFREELIST
9553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define PyList_MAXFREELIST 80
9653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
9753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyListObject *free_list[PyList_MAXFREELIST];
9853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int numfree = 0;
9953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
10053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielvoid
10153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Fini(void)
10253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
10353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *op;
10453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
10553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (numfree) {
10653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        op = free_list[--numfree];
10753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(PyList_CheckExact(op));
10853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject_GC_Del(op);
10953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
11053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
11153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
11253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyObject *
11353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_New(Py_ssize_t size)
11453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
11553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *op;
11653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size_t nbytes;
11753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifdef SHOW_ALLOC_COUNT
11853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    static int initialized = 0;
11953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!initialized) {
12053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_AtExit(show_alloc);
12153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        initialized = 1;
12253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
12353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
12453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
12553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size < 0) {
12653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
12753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
12853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
12953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Check for overflow without an actual overflow,
13053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     *  which can cause compiler to optimise out */
13153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *))
13253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return PyErr_NoMemory();
13353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    nbytes = size * sizeof(PyObject *);
13453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (numfree) {
13553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        numfree--;
13653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        op = free_list[numfree];
13753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        _Py_NewReference((PyObject *)op);
13853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifdef SHOW_ALLOC_COUNT
13953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        count_reuse++;
14053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
14153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    } else {
14253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        op = PyObject_GC_New(PyListObject, &PyList_Type);
14353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (op == NULL)
14453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
14553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#ifdef SHOW_ALLOC_COUNT
14653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        count_alloc++;
14753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#endif
14853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
14953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size <= 0)
15053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        op->ob_item = NULL;
15153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
15253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
15353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (op->ob_item == NULL) {
15453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(op);
15553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return PyErr_NoMemory();
15653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
15753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        memset(op->ob_item, 0, nbytes);
15853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
15953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_SIZE(op) = size;
16053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    op->allocated = size;
16153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    _PyObject_GC_TRACK(op);
16253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *) op;
16353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
16453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
16553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPy_ssize_t
16653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Size(PyObject *op)
16753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
16853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(op)) {
16953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
17053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
17153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
17253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else
17353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return Py_SIZE(op);
17453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
17553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
17653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *indexerr = NULL;
17753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
17853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyObject *
17953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_GetItem(PyObject *op, Py_ssize_t i)
18053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
18153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(op)) {
18253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
18353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
18453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
18553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0 || i >= Py_SIZE(op)) {
18653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (indexerr == NULL) {
18753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            indexerr = PyString_FromString(
18853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                "list index out of range");
18953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (indexerr == NULL)
19053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return NULL;
19153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
19253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetObject(PyExc_IndexError, indexerr);
19353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
19453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
19553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return ((PyListObject *)op) -> ob_item[i];
19653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
19753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
19853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
19953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_SetItem(register PyObject *op, register Py_ssize_t i,
20053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               register PyObject *newitem)
20153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
20253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    register PyObject *olditem;
20353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    register PyObject **p;
20453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(op)) {
20553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XDECREF(newitem);
20653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
20753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
20853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
20953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0 || i >= Py_SIZE(op)) {
21053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XDECREF(newitem);
21153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_IndexError,
21253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                        "list assignment index out of range");
21353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
21453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
21553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    p = ((PyListObject *)op) -> ob_item + i;
21653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    olditem = *p;
21753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    *p = newitem;
21853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(olditem);
21953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
22053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
22153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
22253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
22353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielins1(PyListObject *self, Py_ssize_t where, PyObject *v)
22453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
22553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i, n = Py_SIZE(self);
22653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **items;
22753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL) {
22853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
22953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
23053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
23153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n == PY_SSIZE_T_MAX) {
23253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_OverflowError,
23353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            "cannot add more objects to list");
23453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
23553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
23653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
23753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (list_resize(self, n+1) == -1)
23853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
23953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
24053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (where < 0) {
24153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        where += n;
24253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (where < 0)
24353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            where = 0;
24453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
24553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (where > n)
24653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        where = n;
24753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items = self->ob_item;
24853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = n; --i >= where; )
24953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        items[i+1] = items[i];
25053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(v);
25153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items[where] = v;
25253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
25353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
25453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
25553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
25653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
25753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
25853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(op)) {
25953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
26053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
26153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
26253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return ins1((PyListObject *)op, where, newitem);
26353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
26453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
26553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
26653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielapp1(PyListObject *self, PyObject *v)
26753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
26853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t n = PyList_GET_SIZE(self);
26953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
27053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert (v != NULL);
27153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n == PY_SSIZE_T_MAX) {
27253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_OverflowError,
27353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            "cannot add more objects to list");
27453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
27553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
27653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
27753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (list_resize(self, n+1) == -1)
27853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
27953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
28053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(v);
28153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyList_SET_ITEM(self, n, v);
28253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
28353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
28453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
28553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
28653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Append(PyObject *op, PyObject *newitem)
28753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
28853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (PyList_Check(op) && (newitem != NULL))
28953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return app1((PyListObject *)op, newitem);
29053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyErr_BadInternalCall();
29153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
29253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
29353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
29453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Methods */
29553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
29653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
29753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_dealloc(PyListObject *op)
29853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
29953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
30053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_UnTrack(op);
30153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TRASHCAN_SAFE_BEGIN(op)
30253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (op->ob_item != NULL) {
30353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Do it backwards, for Christian Tismer.
30453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           There's a simple test case where somehow this reduces
30553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           thrashing when a *very* large list is created and
30653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           immediately deleted. */
30753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        i = Py_SIZE(op);
30853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (--i >= 0) {
30953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_XDECREF(op->ob_item[i]);
31053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
31153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_FREE(op->ob_item);
31253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
31353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
31453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        free_list[numfree++] = op;
31553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else
31653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_TYPE(op)->tp_free((PyObject *)op);
31753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TRASHCAN_SAFE_END(op)
31853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
31953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
32053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
32153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_print(PyListObject *op, FILE *fp, int flags)
32253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
32353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int rc;
32453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
32553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *item;
32653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
32753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    rc = Py_ReprEnter((PyObject*)op);
32853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (rc != 0) {
32953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (rc < 0)
33053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return rc;
33153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_BEGIN_ALLOW_THREADS
33253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        fprintf(fp, "[...]");
33353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_END_ALLOW_THREADS
33453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 0;
33553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
33653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_BEGIN_ALLOW_THREADS
33753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    fprintf(fp, "[");
33853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_END_ALLOW_THREADS
33953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(op); i++) {
34053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item = op->ob_item[i];
34153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(item);
34253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (i > 0) {
34353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_BEGIN_ALLOW_THREADS
34453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            fprintf(fp, ", ");
34553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_END_ALLOW_THREADS
34653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
34753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (PyObject_Print(item, fp, 0) != 0) {
34853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(item);
34953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_ReprLeave((PyObject *)op);
35053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return -1;
35153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
35253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(item);
35353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
35453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_BEGIN_ALLOW_THREADS
35553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    fprintf(fp, "]");
35653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_END_ALLOW_THREADS
35753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ReprLeave((PyObject *)op);
35853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
35953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
36053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
36153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
36253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_repr(PyListObject *v)
36353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
36453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
36553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *s, *temp;
36653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *pieces = NULL, *result = NULL;
36753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
36853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    i = Py_ReprEnter((PyObject*)v);
36953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i != 0) {
37053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return i > 0 ? PyString_FromString("[...]") : NULL;
37153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
37253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
37353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(v) == 0) {
37453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        result = PyString_FromString("[]");
37553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
37653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
37753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
37853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pieces = PyList_New(0);
37953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (pieces == NULL)
38053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
38153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
38253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Do repr() on each element.  Note that this may mutate the list,
38353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       so must refetch the list size on each iteration. */
38453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(v); ++i) {
38553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int status;
38653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (Py_EnterRecursiveCall(" while getting the repr of a list"))
38753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Done;
38853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        s = PyObject_Repr(v->ob_item[i]);
38953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_LeaveRecursiveCall();
39053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (s == NULL)
39153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Done;
39253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        status = PyList_Append(pieces, s);
39353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(s);  /* append created a new ref */
39453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (status < 0)
39553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Done;
39653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
39753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
39853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Add "[]" decorations to the first and last items. */
39953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(PyList_GET_SIZE(pieces) > 0);
40053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    s = PyString_FromString("[");
40153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (s == NULL)
40253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
40353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    temp = PyList_GET_ITEM(pieces, 0);
40453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyString_ConcatAndDel(&s, temp);
40553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyList_SET_ITEM(pieces, 0, s);
40653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (s == NULL)
40753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
40853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
40953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    s = PyString_FromString("]");
41053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (s == NULL)
41153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
41253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1);
41353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyString_ConcatAndDel(&temp, s);
41453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp);
41553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (temp == NULL)
41653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
41753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
41853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Paste them all together with ", " between. */
41953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    s = PyString_FromString(", ");
42053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (s == NULL)
42153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Done;
42253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = _PyString_Join(s, pieces);
42353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(s);
42453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
42553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielDone:
42653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(pieces);
42753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ReprLeave((PyObject *)v);
42853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return result;
42953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
43053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
43153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
43253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_length(PyListObject *a)
43353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
43453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return Py_SIZE(a);
43553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
43653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
43753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
43853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_contains(PyListObject *a, PyObject *el)
43953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
44053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
44153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int cmp;
44253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
44353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
44453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
44553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                           Py_EQ);
44653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return cmp;
44753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
44853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
44953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
45053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_item(PyListObject *a, Py_ssize_t i)
45153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
45253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0 || i >= Py_SIZE(a)) {
45353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (indexerr == NULL) {
45453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            indexerr = PyString_FromString(
45553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                "list index out of range");
45653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (indexerr == NULL)
45753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return NULL;
45853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
45953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetObject(PyExc_IndexError, indexerr);
46053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
46153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
46253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(a->ob_item[i]);
46353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return a->ob_item[i];
46453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
46553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
46653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
46753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
46853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
46953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *np;
47053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **src, **dest;
47153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i, len;
47253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ilow < 0)
47353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ilow = 0;
47453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (ilow > Py_SIZE(a))
47553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ilow = Py_SIZE(a);
47653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ihigh < ilow)
47753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ihigh = ilow;
47853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (ihigh > Py_SIZE(a))
47953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ihigh = Py_SIZE(a);
48053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    len = ihigh - ilow;
48153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    np = (PyListObject *) PyList_New(len);
48253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (np == NULL)
48353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
48453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
48553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    src = a->ob_item + ilow;
48653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest = np->ob_item;
48753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < len; i++) {
48853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *v = src[i];
48953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(v);
49053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        dest[i] = v;
49153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
49253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)np;
49353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
49453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
49553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyObject *
49653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
49753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
49853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(a)) {
49953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
50053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
50153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
50253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return list_slice((PyListObject *)a, ilow, ihigh);
50353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
50453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
50553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
50653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_concat(PyListObject *a, PyObject *bb)
50753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
50853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t size;
50953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
51053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **src, **dest;
51153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *np;
51253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(bb)) {
51353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_Format(PyExc_TypeError,
51453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                  "can only concatenate list (not \"%.200s\") to list",
51553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                  bb->ob_type->tp_name);
51653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
51753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
51853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define b ((PyListObject *)bb)
51953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size = Py_SIZE(a) + Py_SIZE(b);
52053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size < 0)
52153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return PyErr_NoMemory();
52253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    np = (PyListObject *) PyList_New(size);
52353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (np == NULL) {
52453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
52553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
52653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    src = a->ob_item;
52753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest = np->ob_item;
52853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(a); i++) {
52953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *v = src[i];
53053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(v);
53153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        dest[i] = v;
53253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
53353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    src = b->ob_item;
53453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest = np->ob_item + Py_SIZE(a);
53553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(b); i++) {
53653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *v = src[i];
53753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(v);
53853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        dest[i] = v;
53953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
54053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)np;
54153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#undef b
54253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
54353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
54453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
54553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_repeat(PyListObject *a, Py_ssize_t n)
54653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
54753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i, j;
54853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t size;
54953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *np;
55053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **p, **items;
55153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *elem;
55253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n < 0)
55353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n = 0;
55453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
55553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return PyErr_NoMemory();
55653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size = Py_SIZE(a) * n;
55753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size == 0)
55853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return PyList_New(0);
55953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    np = (PyListObject *) PyList_New(size);
56053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (np == NULL)
56153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
56253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
56353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items = np->ob_item;
56453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(a) == 1) {
56553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        elem = a->ob_item[0];
56653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (i = 0; i < n; i++) {
56753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            items[i] = elem;
56853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_INCREF(elem);
56953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
57053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return (PyObject *) np;
57153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
57253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    p = np->ob_item;
57353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items = a->ob_item;
57453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < n; i++) {
57553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (j = 0; j < Py_SIZE(a); j++) {
57653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *p = items[j];
57753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_INCREF(*p);
57853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            p++;
57953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
58053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
58153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *) np;
58253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
58353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
58453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
58553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_clear(PyListObject *a)
58653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
58753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
58853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **item = a->ob_item;
58953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (item != NULL) {
59053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Because XDECREF can recursively invoke operations on
59153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           this list, we make it empty first. */
59253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        i = Py_SIZE(a);
59353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_SIZE(a) = 0;
59453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        a->ob_item = NULL;
59553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        a->allocated = 0;
59653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (--i >= 0) {
59753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_XDECREF(item[i]);
59853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
59953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_FREE(item);
60053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
60153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Never fails; the return value can be ignored.
60253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       Note that there is no guarantee that the list is actually empty
60353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       at this point, because XDECREF may have populated it again! */
60453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
60553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
60653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
60753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* a[ilow:ihigh] = v if v != NULL.
60853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * del a[ilow:ihigh] if v == NULL.
60953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
61053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Special speed gimmick:  when v is NULL and ihigh - ilow <= 8, it's
61153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * guaranteed the call cannot fail.
61253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
61353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
61453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
61553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
61653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Because [X]DECREF can recursively invoke list operations on
61753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       this list, we must postpone all [X]DECREF activity until
61853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       after the list is back in its canonical shape.  Therefore
61953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       we must allocate an additional array, 'recycle', into which
62053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       we temporarily copy the items that are deleted from the
62153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       list. :-( */
62253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *recycle_on_stack[8];
62353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
62453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **item;
62553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **vitem = NULL;
62653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
62753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t n; /* # of elements in replacement list */
62853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t norig; /* # of elements in list getting replaced */
62953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t d; /* Change in size */
63053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
63153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size_t s;
63253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int result = -1;            /* guilty until proved innocent */
63353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define b ((PyListObject *)v)
63453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL)
63553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n = 0;
63653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
63753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (a == b) {
63853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* Special case "a[i:j] = a" -- copy b first */
63953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            v = list_slice(b, 0, Py_SIZE(b));
64053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (v == NULL)
64153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return result;
64253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            result = list_ass_slice(a, ilow, ihigh, v);
64353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(v);
64453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return result;
64553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
64653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        v_as_SF = PySequence_Fast(v, "can only assign an iterable");
64753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if(v_as_SF == NULL)
64853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Error;
64953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n = PySequence_Fast_GET_SIZE(v_as_SF);
65053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        vitem = PySequence_Fast_ITEMS(v_as_SF);
65153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
65253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ilow < 0)
65353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ilow = 0;
65453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (ilow > Py_SIZE(a))
65553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ilow = Py_SIZE(a);
65653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
65753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ihigh < ilow)
65853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ihigh = ilow;
65953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (ihigh > Py_SIZE(a))
66053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ihigh = Py_SIZE(a);
66153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
66253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    norig = ihigh - ilow;
66353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(norig >= 0);
66453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    d = n - norig;
66553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(a) + d == 0) {
66653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XDECREF(v_as_SF);
66753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return list_clear(a);
66853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
66953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    item = a->ob_item;
67053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* recycle the items that we are about to remove */
67153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    s = norig * sizeof(PyObject *);
67253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (s > sizeof(recycle_on_stack)) {
67353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        recycle = (PyObject **)PyMem_MALLOC(s);
67453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (recycle == NULL) {
67553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyErr_NoMemory();
67653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Error;
67753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
67853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
67953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    memcpy(recycle, &item[ilow], s);
68053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
68153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (d < 0) { /* Delete -d items */
68253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        memmove(&item[ihigh+d], &item[ihigh],
68353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
68453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        list_resize(a, Py_SIZE(a) + d);
68553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item = a->ob_item;
68653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
68753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (d > 0) { /* Insert d items */
68853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        k = Py_SIZE(a);
68953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (list_resize(a, k+d) < 0)
69053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto Error;
69153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item = a->ob_item;
69253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        memmove(&item[ihigh+d], &item[ihigh],
69353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            (k - ihigh)*sizeof(PyObject *));
69453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
69553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (k = 0; k < n; k++, ilow++) {
69653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *w = vitem[k];
69753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XINCREF(w);
69853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item[ilow] = w;
69953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
70053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (k = norig - 1; k >= 0; --k)
70153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XDECREF(recycle[k]);
70253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = 0;
70353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel Error:
70453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (recycle != recycle_on_stack)
70553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_FREE(recycle);
70653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(v_as_SF);
70753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return result;
70853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#undef b
70953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
71053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
71153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
71253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
71353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
71453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(a)) {
71553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
71653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
71753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
71853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
71953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
72053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
72153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
72253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_inplace_repeat(PyListObject *self, Py_ssize_t n)
72353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
72453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **items;
72553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t size, i, j, p;
72653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
72753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
72853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    size = PyList_GET_SIZE(self);
72953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size == 0 || n == 1) {
73053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(self);
73153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return (PyObject *)self;
73253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
73353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
73453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n < 1) {
73553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        (void)list_clear(self);
73653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(self);
73753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return (PyObject *)self;
73853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
73953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
74053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (size > PY_SSIZE_T_MAX / n) {
74153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return PyErr_NoMemory();
74253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
74353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
74453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (list_resize(self, size*n) == -1)
74553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
74653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
74753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    p = size;
74853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    items = self->ob_item;
74953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
75053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (j = 0; j < size; j++) {
75153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyObject *o = items[j];
75253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_INCREF(o);
75353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            items[p++] = o;
75453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
75553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
75653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(self);
75753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)self;
75853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
75953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
76053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
76153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
76253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
76353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *old_value;
76453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0 || i >= Py_SIZE(a)) {
76553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_IndexError,
76653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                        "list assignment index out of range");
76753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
76853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
76953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL)
77053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return list_ass_slice(a, i, i+1, v);
77153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(v);
77253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    old_value = a->ob_item[i];
77353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a->ob_item[i] = v;
77453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(old_value);
77553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
77653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
77753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
77853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
77953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistinsert(PyListObject *self, PyObject *args)
78053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
78153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
78253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *v;
78353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
78453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
78553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ins1(self, i, v) == 0)
78653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_RETURN_NONE;
78753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
78853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
78953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
79053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
79153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistappend(PyListObject *self, PyObject *v)
79253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
79353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (app1(self, v) == 0)
79453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_RETURN_NONE;
79553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
79653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
79753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
79853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
79953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistextend(PyListObject *self, PyObject *b)
80053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
80153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *it;      /* iter(v) */
80253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t m;                  /* size of self */
80353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t n;                  /* guess for size of b */
80453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t mn;                 /* m + n */
80553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
80653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *(*iternext)(PyObject *);
80753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
80853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Special cases:
80953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       1) lists and tuples which can use PySequence_Fast ops
81053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel       2) extending self to self requires making a copy first
81153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    */
81253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
81353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject **src, **dest;
81453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        b = PySequence_Fast(b, "argument must be iterable");
81553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (!b)
81653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
81753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n = PySequence_Fast_GET_SIZE(b);
81853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (n == 0) {
81953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* short circuit when b is empty */
82053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(b);
82153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_RETURN_NONE;
82253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
82353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        m = Py_SIZE(self);
82453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (list_resize(self, m + n) == -1) {
82553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(b);
82653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
82753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
82853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* note that we may still have self == b here for the
82953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * situation a.extend(a), but the following code works
83053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * in that case too.  Just make sure to resize self
83153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * before calling PySequence_Fast_ITEMS.
83253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
83353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* populate the end of self with b's items */
83453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        src = PySequence_Fast_ITEMS(b);
83553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        dest = self->ob_item + m;
83653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (i = 0; i < n; i++) {
83753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyObject *o = src[i];
83853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_INCREF(o);
83953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            dest[i] = o;
84053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
84153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(b);
84253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_RETURN_NONE;
84353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
84453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
84553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it = PyObject_GetIter(b);
84653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it == NULL)
84753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
84853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    iternext = *it->ob_type->tp_iternext;
84953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
85053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Guess a result list size. */
85153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    n = _PyObject_LengthHint(b, 8);
85253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (n == -1) {
85353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(it);
85453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
85553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
85653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    m = Py_SIZE(self);
85753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    mn = m + n;
85853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (mn >= m) {
85953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Make room. */
86053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (list_resize(self, mn) == -1)
86153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto error;
86253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Make the list sane again. */
86353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_SIZE(self) = m;
86453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
86553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Else m + n overflowed; on the chance that n lied, and there really
86653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * is enough room, ignore it.  If n was telling the truth, we'll
86753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * eventually run out of memory during the loop.
86853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
86953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
87053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Run iterator to exhaustion. */
87153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (;;) {
87253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *item = iternext(it);
87353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (item == NULL) {
87453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (PyErr_Occurred()) {
87553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (PyErr_ExceptionMatches(PyExc_StopIteration))
87653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    PyErr_Clear();
87753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                else
87853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto error;
87953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
88053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            break;
88153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
88253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (Py_SIZE(self) < self->allocated) {
88353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* steals ref */
88453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyList_SET_ITEM(self, Py_SIZE(self), item);
88553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ++Py_SIZE(self);
88653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
88753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else {
88853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            int status = app1(self, item);
88953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(item);  /* append creates a new ref */
89053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (status < 0)
89153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto error;
89253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
89353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
89453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
89553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Cut back result list if initial guess was too large. */
89653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(self) < self->allocated)
89753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        list_resize(self, Py_SIZE(self));  /* shrinking can't fail */
89853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
89953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(it);
90053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_RETURN_NONE;
90153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
90253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel  error:
90353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(it);
90453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
90553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
90653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
90753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyObject *
90853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel_PyList_Extend(PyListObject *self, PyObject *b)
90953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
91053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return listextend(self, b);
91153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
91253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
91353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
91453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_inplace_concat(PyListObject *self, PyObject *other)
91553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
91653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *result;
91753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
91853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = listextend(self, other);
91953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (result == NULL)
92053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return result;
92153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(result);
92253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(self);
92353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)self;
92453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
92553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
92653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
92753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistpop(PyListObject *self, PyObject *args)
92853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
92953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i = -1;
93053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *v;
93153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int status;
93253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
93353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyArg_ParseTuple(args, "|n:pop", &i))
93453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
93553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
93653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(self) == 0) {
93753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Special-case most common failure cause */
93853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_IndexError, "pop from empty list");
93953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
94053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
94153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0)
94253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        i += Py_SIZE(self);
94353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i < 0 || i >= Py_SIZE(self)) {
94453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_IndexError, "pop index out of range");
94553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
94653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
94753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    v = self->ob_item[i];
94853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i == Py_SIZE(self) - 1) {
94953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        status = list_resize(self, Py_SIZE(self) - 1);
95053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(status >= 0);
95153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return v; /* and v now owns the reference the list had */
95253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
95353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(v);
95453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
95553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(status >= 0);
95653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Use status, so that in a release build compilers don't
95753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * complain about the unused name.
95853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
95953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (void) status;
96053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
96153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return v;
96253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
96353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
96453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
96553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
96653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielreverse_slice(PyObject **lo, PyObject **hi)
96753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
96853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lo && hi);
96953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
97053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    --hi;
97153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (lo < hi) {
97253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *t = *lo;
97353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        *lo = *hi;
97453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        *hi = t;
97553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++lo;
97653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        --hi;
97753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
97853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
97953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
98053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Lots of code for an adaptive, stable, natural mergesort.  There are many
98153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * pieces to this algorithm; read listsort.txt for overviews and details.
98253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
98353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
98453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Comparison function.  Takes care of calling a user-supplied
98553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * comparison function (any callable Python object), which must not be
98653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
98753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * with Py_LT if you know it's NULL).
98853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns -1 on error, 1 if x < y, 0 if x >= y.
98953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
99053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
99153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielislt(PyObject *x, PyObject *y, PyObject *compare)
99253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
99353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *res;
99453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *args;
99553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
99653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
99753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(compare != NULL);
99853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Call the user's comparison function and translate the 3-way
99953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * result into true or false (or error).
100053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
100153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    args = PyTuple_New(2);
100253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (args == NULL)
100353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
100453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(x);
100553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(y);
100653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyTuple_SET_ITEM(args, 0, x);
100753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyTuple_SET_ITEM(args, 1, y);
100853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    res = PyObject_Call(compare, args, NULL);
100953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(args);
101053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (res == NULL)
101153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
101253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyInt_Check(res)) {
101353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_Format(PyExc_TypeError,
101453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     "comparison function must return int, not %.200s",
101553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     res->ob_type->tp_name);
101653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(res);
101753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
101853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
101953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    i = PyInt_AsLong(res);
102053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(res);
102153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return i < 0;
102253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
102353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
102453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
102553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * islt.  This avoids a layer of function call in the usual case, and
102653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * sorting does many comparisons.
102753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns -1 on error, 1 if x < y, 0 if x >= y.
102853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
102953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ?                        \
103053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 PyObject_RichCompareBool(X, Y, Py_LT) :                \
103153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 islt(X, Y, COMPARE))
103253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
103353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Compare X to Y via "<".  Goto "fail" if the comparison raises an
103453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   error.  Else "k" is set to true iff X<Y, and an "if (k)" block is
103553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   started.  It makes more sense in context <wink>.  X and Y are PyObject*s.
103653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel*/
103753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail;  \
103853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           if (k)
103953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
104053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* binarysort is the best method for sorting small arrays: it does
104153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   few compares, but can do data movement quadratic in the number of
104253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   elements.
104353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   [lo, hi) is a contiguous slice of a list, and is sorted via
104453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   binary insertion.  This sort is stable.
104553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   On entry, must have lo <= start <= hi, and that [lo, start) is already
104653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   sorted (pass start == lo if you don't know!).
104753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   If islt() complains return -1, else 0.
104853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   Even in case of error, the output slice will be some permutation of
104953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   the input (nothing is lost or duplicated).
105053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel*/
105153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
105253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielbinarysort(PyObject **lo, PyObject **hi, PyObject **start, PyObject *compare)
105353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     /* compare -- comparison function object, or NULL for default */
105453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
105553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    register Py_ssize_t k;
105653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    register PyObject **l, **p, **r;
105753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    register PyObject *pivot;
105853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
105953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lo <= start && start <= hi);
106053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* assert [lo, start) is sorted */
106153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (lo == start)
106253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++start;
106353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (; start < hi; ++start) {
106453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* set l to where *start belongs */
106553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        l = lo;
106653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        r = start;
106753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        pivot = *r;
106853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Invariants:
106953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * pivot >= all in [lo, l).
107053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * pivot  < all in [r, start).
107153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * The second is vacuously true at the start.
107253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
107353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(l < r);
107453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        do {
107553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            p = l + ((r - l) >> 1);
107653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(pivot, *p)
107753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                r = p;
107853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else
107953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                l = p+1;
108053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        } while (l < r);
108153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(l == r);
108253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* The invariants still hold, so pivot >= all in [lo, l) and
108353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           pivot < all in [l, start), so pivot belongs at l.  Note
108453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           that if there are elements equal to pivot, l points to the
108553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           first slot after them -- that's why this sort is stable.
108653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           Slide over to make room.
108753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           Caution: using memmove is much slower under MSVC 5;
108853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           we're not usually moving many slots. */
108953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (p = start; p > l; --p)
109053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *p = *(p-1);
109153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        *l = pivot;
109253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
109353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
109453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
109553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel fail:
109653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
109753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
109853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
109953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/*
110053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielReturn the length of the run beginning at lo, in the slice [lo, hi).  lo < hi
110153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielis required on entry.  "A run" is the longest ascending sequence, with
110253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
110353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    lo[0] <= lo[1] <= lo[2] <= ...
110453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
110553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielor the longest descending sequence, with
110653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
110753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    lo[0] > lo[1] > lo[2] > ...
110853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
110953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielBoolean *descending is set to 0 in the former case, or to 1 in the latter.
111053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielFor its intended use in a stable mergesort, the strictness of the defn of
111153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"descending" is needed so that the caller can safely reverse a descending
111253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsequence without violating stability (strict > ensures there are no equal
111353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielelements to get out of order).
111453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
111553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielReturns -1 in case of error.
111653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel*/
111753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
111853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielcount_run(PyObject **lo, PyObject **hi, PyObject *compare, int *descending)
111953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
112053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
112153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t n;
112253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
112353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lo < hi);
112453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    *descending = 0;
112553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ++lo;
112653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (lo == hi)
112753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 1;
112853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
112953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    n = 2;
113053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    IFLT(*lo, *(lo-1)) {
113153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        *descending = 1;
113253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (lo = lo+1; lo < hi; ++lo, ++n) {
113353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(*lo, *(lo-1))
113453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ;
113553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else
113653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
113753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
113853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
113953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
114053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (lo = lo+1; lo < hi; ++lo, ++n) {
114153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(*lo, *(lo-1))
114253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
114353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
114453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
114553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
114653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return n;
114753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielfail:
114853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
114953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
115053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
115153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/*
115253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielLocate the proper position of key in a sorted vector; if the vector contains
115353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielan element equal to key, return the position immediately to the left of
115453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielthe leftmost equal element.  [gallop_right() does the same except returns
115553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielthe position to the right of the rightmost equal element (if any).]
115653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
115753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"a" is a sorted vector with n elements, starting at a[0].  n must be > 0.
115853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
115953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"hint" is an index at which to begin the search, 0 <= hint < n.  The closer
116053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielhint is to the final result, the faster this runs.
116153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
116253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielThe return value is the int k in 0..n such that
116353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
116453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a[k-1] < key <= a[k]
116553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
116653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielpretending that *(a-1) is minus infinity and a[n] is plus infinity.  IOW,
116753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielkey belongs at index k; or, IOW, the first k elements of a should precede
116853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielkey, and the last n-k should follow key.
116953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
117053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielReturns -1 on error.  See listsort.txt for info on the method.
117153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel*/
117253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
117353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielgallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
117453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
117553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t ofs;
117653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t lastofs;
117753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
117853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
117953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(key && a && n > 0 && hint >= 0 && hint < n);
118053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
118153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a += hint;
118253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    lastofs = 0;
118353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ofs = 1;
118453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    IFLT(*a, key) {
118553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* a[hint] < key -- gallop right, until
118653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * a[hint + lastofs] < key <= a[hint + ofs]
118753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
118853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
118953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (ofs < maxofs) {
119053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(a[ofs], key) {
119153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                lastofs = ofs;
119253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ofs = (ofs << 1) + 1;
119353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (ofs <= 0)                   /* int overflow */
119453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    ofs = maxofs;
119553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
119653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else                /* key <= a[hint + ofs] */
119753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
119853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
119953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (ofs > maxofs)
120053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = maxofs;
120153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Translate back to offsets relative to &a[0]. */
120253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        lastofs += hint;
120353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ofs += hint;
120453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
120553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
120653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* key <= a[hint] -- gallop left, until
120753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * a[hint - ofs] < key <= a[hint - lastofs]
120853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
120953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
121053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (ofs < maxofs) {
121153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(*(a-ofs), key)
121253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
121353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* key <= a[hint - ofs] */
121453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            lastofs = ofs;
121553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = (ofs << 1) + 1;
121653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (ofs <= 0)               /* int overflow */
121753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ofs = maxofs;
121853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
121953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (ofs > maxofs)
122053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = maxofs;
122153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Translate back to positive offsets relative to &a[0]. */
122253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        k = lastofs;
122353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        lastofs = hint - ofs;
122453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ofs = hint - k;
122553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
122653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a -= hint;
122753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
122853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
122953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
123053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * right of lastofs but no farther right than ofs.  Do a binary
123153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * search, with invariant a[lastofs-1] < key <= a[ofs].
123253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
123353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ++lastofs;
123453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (lastofs < ofs) {
123553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
123653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
123753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        IFLT(a[m], key)
123853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            lastofs = m+1;              /* a[m] < key */
123953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else
124053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = m;                    /* key <= a[m] */
124153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
124253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lastofs == ofs);             /* so a[ofs-1] < key <= a[ofs] */
124353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return ofs;
124453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
124553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielfail:
124653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
124753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
124853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
124953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/*
125053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielExactly like gallop_left(), except that if key already exists in a[0:n],
125153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielfinds the position immediately to the right of the rightmost equal value.
125253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
125353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielThe return value is the int k in 0..n such that
125453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
125553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a[k-1] <= key < a[k]
125653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
125753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielor -1 if error.
125853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
125953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielThe code duplication is massive, but this is enough different given that
126053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielwe're sticking to "<" comparisons that it's much harder to follow if
126153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielwritten as one routine with yet another "left or right?" flag.
126253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel*/
126353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
126453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielgallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint, PyObject *compare)
126553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
126653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t ofs;
126753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t lastofs;
126853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
126953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
127053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(key && a && n > 0 && hint >= 0 && hint < n);
127153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
127253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a += hint;
127353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    lastofs = 0;
127453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ofs = 1;
127553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    IFLT(key, *a) {
127653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* key < a[hint] -- gallop left, until
127753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * a[hint - ofs] <= key < a[hint - lastofs]
127853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
127953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        const Py_ssize_t maxofs = hint + 1;             /* &a[0] is lowest */
128053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (ofs < maxofs) {
128153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(key, *(a-ofs)) {
128253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                lastofs = ofs;
128353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ofs = (ofs << 1) + 1;
128453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (ofs <= 0)                   /* int overflow */
128553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    ofs = maxofs;
128653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
128753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else                /* a[hint - ofs] <= key */
128853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
128953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
129053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (ofs > maxofs)
129153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = maxofs;
129253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Translate back to positive offsets relative to &a[0]. */
129353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        k = lastofs;
129453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        lastofs = hint - ofs;
129553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ofs = hint - k;
129653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
129753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
129853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* a[hint] <= key -- gallop right, until
129953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * a[hint + lastofs] <= key < a[hint + ofs]
130053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        */
130153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        const Py_ssize_t maxofs = n - hint;             /* &a[n-1] is highest */
130253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (ofs < maxofs) {
130353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            IFLT(key, a[ofs])
130453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                break;
130553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* a[hint + ofs] <= key */
130653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            lastofs = ofs;
130753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = (ofs << 1) + 1;
130853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (ofs <= 0)               /* int overflow */
130953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ofs = maxofs;
131053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
131153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (ofs > maxofs)
131253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = maxofs;
131353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Translate back to offsets relative to &a[0]. */
131453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        lastofs += hint;
131553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ofs += hint;
131653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
131753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    a -= hint;
131853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
131953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
132053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
132153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * right of lastofs but no farther right than ofs.  Do a binary
132253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * search, with invariant a[lastofs-1] <= key < a[ofs].
132353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
132453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ++lastofs;
132553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (lastofs < ofs) {
132653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
132753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
132853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        IFLT(key, a[m])
132953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ofs = m;                    /* key < a[m] */
133053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else
133153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            lastofs = m+1;              /* a[m] <= key */
133253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
133353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lastofs == ofs);             /* so a[ofs-1] <= key < a[ofs] */
133453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return ofs;
133553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
133653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielfail:
133753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
133853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
133953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
134053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* The maximum number of entries in a MergeState's pending-runs stack.
134153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * This is enough to sort arrays of size up to about
134253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *     32 * phi ** MAX_MERGE_PENDING
134353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * where phi ~= 1.618.  85 is ridiculouslylarge enough, good for an array
134453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * with 2**64 elements.
134553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
134653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define MAX_MERGE_PENDING 85
134753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
134853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* When we get into galloping mode, we stay there until both runs win less
134953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * often than MIN_GALLOP consecutive times.  See listsort.txt for more info.
135053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
135153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define MIN_GALLOP 7
135253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
135353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Avoid malloc for small temp arrays. */
135453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define MERGESTATE_TEMP_SIZE 256
135553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
135653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* One MergeState exists on the stack per invocation of mergesort.  It's just
135753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * a convenient way to pass state around among the helper functions.
135853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
135953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstruct s_slice {
136053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **base;
136153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t len;
136253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
136353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
136453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieltypedef struct s_MergeState {
136553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* The user-supplied comparison function. or NULL if none given. */
136653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *compare;
136753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
136853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* This controls when we get *into* galloping mode.  It's initialized
136953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * to MIN_GALLOP.  merge_lo and merge_hi tend to nudge it higher for
137053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * random data, and lower for highly structured data.
137153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
137253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t min_gallop;
137353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
137453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* 'a' is temp storage to help with merges.  It contains room for
137553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * alloced entries.
137653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
137753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **a;       /* may point to temparray below */
137853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t alloced;
137953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
138053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* A stack of n pending runs yet to be merged.  Run #i starts at
138153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * address base[i] and extends for len[i] elements.  It's always
138253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * true (so long as the indices are in bounds) that
138353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     *
138453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     *     pending[i].base + pending[i].len == pending[i+1].base
138553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     *
138653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * so we could cut the storage for this, but it's a minor amount,
138753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * and keeping all the info explicit simplifies the code.
138853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
138953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int n;
139053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    struct s_slice pending[MAX_MERGE_PENDING];
139153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
139253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* 'a' points to this when possible, rather than muck with malloc. */
139353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *temparray[MERGESTATE_TEMP_SIZE];
139453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel} MergeState;
139553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
139653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Conceptually a MergeState's constructor. */
139753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
139853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_init(MergeState *ms, PyObject *compare)
139953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
140053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms != NULL);
140153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->compare = compare;
140253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->a = ms->temparray;
140353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->alloced = MERGESTATE_TEMP_SIZE;
140453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->n = 0;
140553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->min_gallop = MIN_GALLOP;
140653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
140753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
140853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Free all the temp memory owned by the MergeState.  This must be called
140953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * when you're done with a MergeState, and may be called before then if
141053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * you want to free the temp memory early.
141153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
141253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
141353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_freemem(MergeState *ms)
141453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
141553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms != NULL);
141653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ms->a != ms->temparray)
141753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_Free(ms->a);
141853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->a = ms->temparray;
141953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->alloced = MERGESTATE_TEMP_SIZE;
142053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
142153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
142253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Ensure enough temp memory for 'need' array slots is available.
142353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns 0 on success and -1 if the memory can't be gotten.
142453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
142553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
142653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_getmem(MergeState *ms, Py_ssize_t need)
142753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
142853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms != NULL);
142953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (need <= ms->alloced)
143053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 0;
143153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Don't realloc!  That can cost cycles to copy the old data, but
143253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * we don't care what's in the block.
143353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
143453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    merge_freemem(ms);
143553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*)) {
143653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_NoMemory();
143753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
143853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
143953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->a = (PyObject **)PyMem_Malloc(need * sizeof(PyObject*));
144053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (ms->a) {
144153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms->alloced = need;
144253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 0;
144353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
144453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyErr_NoMemory();
144553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    merge_freemem(ms);          /* reset to sane state */
144653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return -1;
144753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
144853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 :   \
144953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                merge_getmem(MS, NEED))
145053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
145153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Merge the na elements starting at pa with the nb elements starting at pb
145253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * in a stable way, in-place.  na and nb must be > 0, and pa + na == pb.
145353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
145453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * merge, and should have na <= nb.  See listsort.txt for more info.
145553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Return 0 if successful, -1 if error.
145653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
145753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
145853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_lo(MergeState *ms, PyObject **pa, Py_ssize_t na,
145953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                         PyObject **pb, Py_ssize_t nb)
146053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
146153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
146253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *compare;
146353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **dest;
146453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int result = -1;            /* guilty until proved innocent */
146553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t min_gallop;
146653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
146753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
146853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (MERGE_GETMEM(ms, na) < 0)
146953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
147053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    memcpy(ms->a, pa, na * sizeof(PyObject*));
147153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest = pa;
147253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pa = ms->a;
147353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
147453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    *dest++ = *pb++;
147553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    --nb;
147653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (nb == 0)
147753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Succeed;
147853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (na == 1)
147953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto CopyB;
148053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
148153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    min_gallop = ms->min_gallop;
148253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    compare = ms->compare;
148353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (;;) {
148453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t acount = 0;          /* # of times A won in a row */
148553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t bcount = 0;          /* # of times B won in a row */
148653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
148753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Do the straightforward thing until (if ever) one run
148853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * appears to win consistently.
148953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
149053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (;;) {
149153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            assert(na > 1 && nb > 0);
149253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = ISLT(*pb, *pa, compare);
149353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
149453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (k < 0)
149553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Fail;
149653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                *dest++ = *pb++;
149753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ++bcount;
149853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                acount = 0;
149953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                --nb;
150053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (nb == 0)
150153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
150253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (bcount >= min_gallop)
150353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    break;
150453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
150553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else {
150653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                *dest++ = *pa++;
150753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ++acount;
150853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                bcount = 0;
150953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                --na;
151053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (na == 1)
151153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto CopyB;
151253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (acount >= min_gallop)
151353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    break;
151453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
151553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
151653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
151753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* One run is winning so consistently that galloping may
151853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * be a huge win.  So try that, and continue galloping until
151953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * (if ever) neither run appears to be winning consistently
152053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * anymore.
152153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
152253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++min_gallop;
152353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        do {
152453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            assert(na > 1 && nb > 0);
152553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            min_gallop -= min_gallop > 1;
152653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ms->min_gallop = min_gallop;
152753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = gallop_right(*pb, pa, na, 0, compare);
152853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            acount = k;
152953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
153053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (k < 0)
153153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Fail;
153253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memcpy(dest, pa, k * sizeof(PyObject *));
153353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                dest += k;
153453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                pa += k;
153553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                na -= k;
153653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (na == 1)
153753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto CopyB;
153853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                /* na==0 is impossible now if the comparison
153953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 * function is consistent, but we can't assume
154053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 * that it is.
154153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 */
154253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (na == 0)
154353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
154453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
154553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *dest++ = *pb++;
154653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            --nb;
154753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (nb == 0)
154853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto Succeed;
154953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
155053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = gallop_left(*pa, pb, nb, 0, compare);
155153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            bcount = k;
155253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
155353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (k < 0)
155453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Fail;
155553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memmove(dest, pb, k * sizeof(PyObject *));
155653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                dest += k;
155753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                pb += k;
155853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                nb -= k;
155953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (nb == 0)
156053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
156153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
156253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *dest++ = *pa++;
156353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            --na;
156453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (na == 1)
156553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto CopyB;
156653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
156753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++min_gallop;           /* penalize it for leaving galloping mode */
156853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms->min_gallop = min_gallop;
156953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
157053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielSucceed:
157153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = 0;
157253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielFail:
157353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (na)
157453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        memcpy(dest, pa, na * sizeof(PyObject*));
157553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return result;
157653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielCopyB:
157753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(na == 1 && nb > 0);
157853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* The last element of pa belongs at the end of the merge. */
157953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    memmove(dest, pb, nb * sizeof(PyObject *));
158053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest[nb] = *pa;
158153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
158253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
158353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
158453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Merge the na elements starting at pa with the nb elements starting at pb
158553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * in a stable way, in-place.  na and nb must be > 0, and pa + na == pb.
158653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
158753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * merge, and should have na >= nb.  See listsort.txt for more info.
158853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Return 0 if successful, -1 if error.
158953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
159053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
159153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_hi(MergeState *ms, PyObject **pa, Py_ssize_t na, PyObject **pb, Py_ssize_t nb)
159253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
159353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
159453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *compare;
159553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **dest;
159653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int result = -1;            /* guilty until proved innocent */
159753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **basea;
159853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **baseb;
159953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t min_gallop;
160053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
160153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms && pa && pb && na > 0 && nb > 0 && pa + na == pb);
160253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (MERGE_GETMEM(ms, nb) < 0)
160353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
160453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest = pb + nb - 1;
160553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    memcpy(ms->a, pb, nb * sizeof(PyObject*));
160653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    basea = pa;
160753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    baseb = ms->a;
160853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pb = ms->a + nb - 1;
160953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pa += na - 1;
161053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
161153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    *dest-- = *pa--;
161253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    --na;
161353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (na == 0)
161453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto Succeed;
161553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (nb == 1)
161653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto CopyA;
161753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
161853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    min_gallop = ms->min_gallop;
161953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    compare = ms->compare;
162053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (;;) {
162153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t acount = 0;          /* # of times A won in a row */
162253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t bcount = 0;          /* # of times B won in a row */
162353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
162453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Do the straightforward thing until (if ever) one run
162553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * appears to win consistently.
162653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
162753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (;;) {
162853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            assert(na > 0 && nb > 1);
162953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = ISLT(*pb, *pa, compare);
163053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
163153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (k < 0)
163253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Fail;
163353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                *dest-- = *pa--;
163453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ++acount;
163553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                bcount = 0;
163653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                --na;
163753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (na == 0)
163853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
163953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (acount >= min_gallop)
164053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    break;
164153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
164253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else {
164353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                *dest-- = *pb--;
164453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ++bcount;
164553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                acount = 0;
164653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                --nb;
164753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (nb == 1)
164853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto CopyA;
164953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (bcount >= min_gallop)
165053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    break;
165153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
165253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
165353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
165453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* One run is winning so consistently that galloping may
165553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * be a huge win.  So try that, and continue galloping until
165653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * (if ever) neither run appears to be winning consistently
165753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * anymore.
165853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
165953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++min_gallop;
166053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        do {
166153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            assert(na > 0 && nb > 1);
166253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            min_gallop -= min_gallop > 1;
166353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            ms->min_gallop = min_gallop;
166453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = gallop_right(*pb, basea, na, na-1, compare);
166553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k < 0)
166653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto Fail;
166753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = na - k;
166853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            acount = k;
166953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
167053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                dest -= k;
167153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                pa -= k;
167253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memmove(dest+1, pa+1, k * sizeof(PyObject *));
167353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                na -= k;
167453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (na == 0)
167553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
167653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
167753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *dest-- = *pb--;
167853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            --nb;
167953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (nb == 1)
168053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto CopyA;
168153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
168253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = gallop_left(*pa, baseb, nb, nb-1, compare);
168353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k < 0)
168453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto Fail;
168553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            k = nb - k;
168653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            bcount = k;
168753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (k) {
168853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                dest -= k;
168953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                pb -= k;
169053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memcpy(dest+1, pb+1, k * sizeof(PyObject *));
169153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                nb -= k;
169253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (nb == 1)
169353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto CopyA;
169453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                /* nb==0 is impossible now if the comparison
169553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 * function is consistent, but we can't assume
169653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 * that it is.
169753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 */
169853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (nb == 0)
169953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    goto Succeed;
170053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
170153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            *dest-- = *pa--;
170253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            --na;
170353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (na == 0)
170453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto Succeed;
170553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
170653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++min_gallop;           /* penalize it for leaving galloping mode */
170753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms->min_gallop = min_gallop;
170853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
170953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielSucceed:
171053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = 0;
171153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielFail:
171253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (nb)
171353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        memcpy(dest-(nb-1), baseb, nb * sizeof(PyObject*));
171453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return result;
171553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielCopyA:
171653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(nb == 1 && na > 0);
171753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* The first element of pb belongs at the front of the merge. */
171853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    dest -= na;
171953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pa -= na;
172053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    memmove(dest+1, pa+1, na * sizeof(PyObject *));
172153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    *dest = *pb;
172253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
172353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
172453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
172553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Merge the two runs at stack indices i and i+1.
172653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns 0 on success, -1 on error.
172753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
172853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
172953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_at(MergeState *ms, Py_ssize_t i)
173053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
173153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **pa, **pb;
173253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t na, nb;
173353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t k;
173453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *compare;
173553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
173653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms != NULL);
173753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms->n >= 2);
173853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(i >= 0);
173953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(i == ms->n - 2 || i == ms->n - 3);
174053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
174153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pa = ms->pending[i].base;
174253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    na = ms->pending[i].len;
174353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pb = ms->pending[i+1].base;
174453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    nb = ms->pending[i+1].len;
174553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(na > 0 && nb > 0);
174653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(pa + na == pb);
174753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
174853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Record the length of the combined runs; if i is the 3rd-last
174953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * run now, also slide over the last run (which isn't involved
175053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * in this merge).  The current run i+1 goes away in any case.
175153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
175253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    ms->pending[i].len = na + nb;
175353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i == ms->n - 3)
175453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms->pending[i+1] = ms->pending[i+2];
175553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    --ms->n;
175653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
175753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Where does b start in a?  Elements in a before that can be
175853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * ignored (already in place).
175953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
176053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    compare = ms->compare;
176153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    k = gallop_right(*pb, pa, na, 0, compare);
176253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (k < 0)
176353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
176453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    pa += k;
176553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    na -= k;
176653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (na == 0)
176753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return 0;
176853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
176953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Where does a end in b?  Elements in b after that can be
177053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * ignored (already in place).
177153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
177253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    nb = gallop_left(pa[na-1], pb, nb, nb-1, compare);
177353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (nb <= 0)
177453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return nb;
177553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
177653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Merge what remains of the runs, using a temp array with
177753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * min(na, nb) elements.
177853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
177953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (na <= nb)
178053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return merge_lo(ms, pa, na, pb, nb);
178153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else
178253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return merge_hi(ms, pa, na, pb, nb);
178353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
178453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
178553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Examine the stack of runs waiting to be merged, merging adjacent runs
178653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * until the stack invariants are re-established:
178753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
178853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * 1. len[-3] > len[-2] + len[-1]
178953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * 2. len[-2] > len[-1]
179053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
179153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * See listsort.txt for more info.
179253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
179353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns 0 on success, -1 on error.
179453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
179553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
179653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_collapse(MergeState *ms)
179753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
179853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    struct s_slice *p = ms->pending;
179953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
180053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms);
180153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (ms->n > 1) {
180253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t n = ms->n - 2;
180353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if ((n > 0 && p[n-1].len <= p[n].len + p[n+1].len) ||
180453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            (n > 1 && p[n-2].len <= p[n-1].len + p[n].len)) {
180553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (p[n-1].len < p[n+1].len)
180653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                --n;
180753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (merge_at(ms, n) < 0)
180853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return -1;
180953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
181053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else if (p[n].len <= p[n+1].len) {
181153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 if (merge_at(ms, n) < 0)
181253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                        return -1;
181353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
181453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else
181553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            break;
181653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
181753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
181853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
181953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
182053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Regardless of invariants, merge all runs on the stack until only one
182153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * remains.  This is used at the end of the mergesort.
182253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
182353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns 0 on success, -1 on error.
182453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
182553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
182653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_force_collapse(MergeState *ms)
182753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
182853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    struct s_slice *p = ms->pending;
182953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
183053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms);
183153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (ms->n > 1) {
183253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t n = ms->n - 2;
183353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (n > 0 && p[n-1].len < p[n+1].len)
183453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            --n;
183553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (merge_at(ms, n) < 0)
183653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return -1;
183753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
183853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
183953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
184053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
184153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Compute a good value for the minimum run length; natural runs shorter
184253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * than this are boosted artificially via binary insertion.
184353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
184453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * If n < 64, return n (it's too small to bother with fancy stuff).
184553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Else if n is an exact power of 2, return 32.
184653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
184753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * strictly less than, an exact power of 2.
184853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel *
184953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * See listsort.txt for more info.
185053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
185153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic Py_ssize_t
185253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielmerge_compute_minrun(Py_ssize_t n)
185353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
185453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t r = 0;           /* becomes 1 if any 1 bits are shifted off */
185553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
185653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(n >= 0);
185753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (n >= 64) {
185853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        r |= n & 1;
185953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n >>= 1;
186053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
186153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return n + r;
186253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
186353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
186453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Special wrapper to support stable sorting using the decorate-sort-undecorate
186553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   pattern.  Holds a key which is used for comparisons and the original record
186653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   which is returned during the undecorate phase.  By exposing only the key
186753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   during comparisons, the underlying sort stability characteristics are left
186853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   unchanged.  Also, if a custom comparison function is used, it will only see
186953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   the key instead of a full record. */
187053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
187153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieltypedef struct {
187253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_HEAD
187353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *key;
187453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *value;
187553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel} sortwrapperobject;
187653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
187753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(sortwrapper_doc, "Object wrapper with a custom sort key.");
187853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
187953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsortwrapper_richcompare(sortwrapperobject *, sortwrapperobject *, int);
188053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
188153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsortwrapper_dealloc(sortwrapperobject *);
188253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
188353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyTypeObject sortwrapper_type = {
188453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyVarObject_HEAD_INIT(&PyType_Type, 0)
188553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    "sortwrapper",                              /* tp_name */
188653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sizeof(sortwrapperobject),                  /* tp_basicsize */
188753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_itemsize */
188853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* methods */
188953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (destructor)sortwrapper_dealloc,            /* tp_dealloc */
189053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_print */
189153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getattr */
189253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattr */
189353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_compare */
189453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_repr */
189553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_number */
189653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_sequence */
189753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_mapping */
189853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_hash */
189953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_call */
190053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_str */
190153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GenericGetAttr,                    /* tp_getattro */
190253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattro */
190353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_buffer */
190453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_DEFAULT |
190553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_HAVE_RICHCOMPARE,                /* tp_flags */
190653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sortwrapper_doc,                            /* tp_doc */
190753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_traverse */
190853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_clear */
190953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (richcmpfunc)sortwrapper_richcompare,       /* tp_richcompare */
191053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
191153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
191253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
191353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
191453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsortwrapper_richcompare(sortwrapperobject *a, sortwrapperobject *b, int op)
191553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
191653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyObject_TypeCheck(b, &sortwrapper_type)) {
191753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_TypeError,
191853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            "expected a sortwrapperobject");
191953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
192053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
192153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyObject_RichCompare(a->key, b->key, op);
192253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
192353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
192453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
192553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsortwrapper_dealloc(sortwrapperobject *so)
192653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
192753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(so->key);
192853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(so->value);
192953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_Del(so);
193053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
193153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
193253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Returns a new reference to a sortwrapper.
193353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   Consumes the references to the two underlying objects. */
193453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
193553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
193653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielbuild_sortwrapper(PyObject *key, PyObject *value)
193753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
193853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sortwrapperobject *so;
193953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
194053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    so = PyObject_New(sortwrapperobject, &sortwrapper_type);
194153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (so == NULL)
194253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
194353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    so->key = key;
194453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    so->value = value;
194553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)so;
194653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
194753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
194853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Returns a new reference to the value underlying the wrapper. */
194953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
195053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsortwrapper_getvalue(PyObject *so)
195153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
195253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *value;
195353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
195453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyObject_TypeCheck(so, &sortwrapper_type)) {
195553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_TypeError,
195653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            "expected a sortwrapperobject");
195753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
195853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
195953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    value = ((sortwrapperobject *)so)->value;
196053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(value);
196153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return value;
196253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
196353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
196453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* Wrapper for user specified cmp functions in combination with a
196553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   specified key function.  Makes sure the cmp function is presented
196653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel   with the actual key instead of the sortwrapper */
196753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
196853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieltypedef struct {
196953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_HEAD
197053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *func;
197153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel} cmpwrapperobject;
197253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
197353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
197453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielcmpwrapper_dealloc(cmpwrapperobject *co)
197553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
197653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(co->func);
197753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_Del(co);
197853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
197953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
198053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
198153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielcmpwrapper_call(cmpwrapperobject *co, PyObject *args, PyObject *kwds)
198253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
198353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *x, *y, *xx, *yy;
198453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
198553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyArg_UnpackTuple(args, "", 2, 2, &x, &y))
198653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
198753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyObject_TypeCheck(x, &sortwrapper_type) ||
198853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        !PyObject_TypeCheck(y, &sortwrapper_type)) {
198953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_TypeError,
199053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            "expected a sortwrapperobject");
199153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
199253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
199353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    xx = ((sortwrapperobject *)x)->key;
199453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    yy = ((sortwrapperobject *)y)->key;
199553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyObject_CallFunctionObjArgs(co->func, xx, yy, NULL);
199653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
199753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
199853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(cmpwrapper_doc, "cmp() wrapper for sort with custom keys.");
199953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
200053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyTypeObject cmpwrapper_type = {
200153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyVarObject_HEAD_INIT(&PyType_Type, 0)
200253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    "cmpwrapper",                               /* tp_name */
200353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sizeof(cmpwrapperobject),                   /* tp_basicsize */
200453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_itemsize */
200553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* methods */
200653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (destructor)cmpwrapper_dealloc,             /* tp_dealloc */
200753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_print */
200853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getattr */
200953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattr */
201053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_compare */
201153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_repr */
201253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_number */
201353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_sequence */
201453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_mapping */
201553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_hash */
201653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ternaryfunc)cmpwrapper_call,               /* tp_call */
201753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_str */
201853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GenericGetAttr,                    /* tp_getattro */
201953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattro */
202053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_buffer */
202153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_DEFAULT,                         /* tp_flags */
202253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    cmpwrapper_doc,                             /* tp_doc */
202353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
202453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
202553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
202653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielbuild_cmpwrapper(PyObject *cmpfunc)
202753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
202853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    cmpwrapperobject *co;
202953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
203053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    co = PyObject_New(cmpwrapperobject, &cmpwrapper_type);
203153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (co == NULL)
203253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
203353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(cmpfunc);
203453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    co->func = cmpfunc;
203553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)co;
203653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
203753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
203853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/* An adaptive, stable, natural mergesort.  See listsort.txt.
203953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * Returns Py_None on success, NULL on error.  Even in case of error, the
204053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * list will be some permutation of its input state (nothing is lost or
204153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel * duplicated).
204253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel */
204353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
204453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistsort(PyListObject *self, PyObject *args, PyObject *kwds)
204553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
204653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    MergeState ms;
204753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **lo, **hi;
204853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t nremaining;
204953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t minrun;
205053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t saved_ob_size, saved_allocated;
205153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **saved_ob_item;
205253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **final_ob_item;
205353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *compare = NULL;
205453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *result = NULL;            /* guilty until proved innocent */
205553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    int reverse = 0;
205653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *keyfunc = NULL;
205753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
205853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *key, *value, *kvpair;
205953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    static char *kwlist[] = {"cmp", "key", "reverse", 0};
206053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
206153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(self != NULL);
206253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert (PyList_Check(self));
206353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (args != NULL) {
206453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
206553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            kwlist, &compare, &keyfunc, &reverse))
206653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
206753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
206853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (compare == Py_None)
206953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        compare = NULL;
207053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (compare != NULL &&
207153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0)
207253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
207353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (keyfunc == Py_None)
207453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        keyfunc = NULL;
207553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (compare != NULL && keyfunc != NULL) {
207653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        compare = build_cmpwrapper(compare);
207753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (compare == NULL)
207853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
207953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    } else
208053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_XINCREF(compare);
208153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
208253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* The list is temporarily made empty, so that mutations performed
208353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * by comparison functions can't affect the slice of memory we're
208453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * sorting (allowing mutations during sorting is a core-dump
208553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * factory, since ob_item may change).
208653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
208753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    saved_ob_size = Py_SIZE(self);
208853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    saved_ob_item = self->ob_item;
208953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    saved_allocated = self->allocated;
209053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_SIZE(self) = 0;
209153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->ob_item = NULL;
209253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->allocated = -1; /* any operation will reset it to >= 0 */
209353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
209453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (keyfunc != NULL) {
209553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (i=0 ; i < saved_ob_size ; i++) {
209653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            value = saved_ob_item[i];
209753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            key = PyObject_CallFunctionObjArgs(keyfunc, value,
209853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                               NULL);
209953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (key == NULL) {
210053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                for (i=i-1 ; i>=0 ; i--) {
210153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    kvpair = saved_ob_item[i];
210253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    value = sortwrapper_getvalue(kvpair);
210353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    saved_ob_item[i] = value;
210453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    Py_DECREF(kvpair);
210553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                }
210653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto dsu_fail;
210753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
210853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            kvpair = build_sortwrapper(key, value);
210953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (kvpair == NULL)
211053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto dsu_fail;
211153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            saved_ob_item[i] = kvpair;
211253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
211353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
211453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
211553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Reverse sort stability achieved by initially reversing the list,
211653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    applying a stable forward sort, then reversing the final result. */
211753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (reverse && saved_ob_size > 1)
211853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
211953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
212053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    merge_init(&ms, compare);
212153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
212253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    nremaining = saved_ob_size;
212353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (nremaining < 2)
212453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto succeed;
212553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
212653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* March over the array once, left to right, finding natural runs,
212753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     * and extending short natural runs to minrun elements.
212853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel     */
212953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    lo = saved_ob_item;
213053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    hi = lo + nremaining;
213153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    minrun = merge_compute_minrun(nremaining);
213253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    do {
213353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int descending;
213453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t n;
213553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
213653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Identify next run. */
213753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        n = count_run(lo, hi, compare, &descending);
213853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (n < 0)
213953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto fail;
214053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (descending)
214153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            reverse_slice(lo, lo + n);
214253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* If short, extend to min(minrun, nremaining). */
214353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (n < minrun) {
214453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            const Py_ssize_t force = nremaining <= minrun ?
214553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                              nremaining : minrun;
214653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (binarysort(lo, lo + force, lo + n, compare) < 0)
214753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                goto fail;
214853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            n = force;
214953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
215053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Push run onto pending-runs stack, and maybe merge. */
215153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        assert(ms.n < MAX_MERGE_PENDING);
215253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms.pending[ms.n].base = lo;
215353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ms.pending[ms.n].len = n;
215453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++ms.n;
215553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (merge_collapse(&ms) < 0)
215653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            goto fail;
215753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Advance to find next run. */
215853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        lo += n;
215953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        nremaining -= n;
216053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    } while (nremaining);
216153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(lo == hi);
216253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
216353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (merge_force_collapse(&ms) < 0)
216453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        goto fail;
216553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms.n == 1);
216653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms.pending[0].base == saved_ob_item);
216753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(ms.pending[0].len == saved_ob_size);
216853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
216953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielsucceed:
217053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    result = Py_None;
217153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielfail:
217253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (keyfunc != NULL) {
217353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        for (i=0 ; i < saved_ob_size ; i++) {
217453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            kvpair = saved_ob_item[i];
217553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            value = sortwrapper_getvalue(kvpair);
217653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            saved_ob_item[i] = value;
217753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(kvpair);
217853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
217953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
218053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
218153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (self->allocated != -1 && result != NULL) {
218253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* The user mucked with the list during the sort,
218353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         * and we don't already have another error to report.
218453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel         */
218553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_SetString(PyExc_ValueError, "list modified during sort");
218653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        result = NULL;
218753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
218853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
218953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (reverse && saved_ob_size > 1)
219053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
219153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
219253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    merge_freemem(&ms);
219353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
219453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieldsu_fail:
219553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    final_ob_item = self->ob_item;
219653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    i = Py_SIZE(self);
219753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_SIZE(self) = saved_ob_size;
219853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->ob_item = saved_ob_item;
219953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    self->allocated = saved_allocated;
220053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (final_ob_item != NULL) {
220153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* we cannot use list_clear() for this because it does not
220253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           guarantee that the list is really empty when it returns */
220353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        while (--i >= 0) {
220453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_XDECREF(final_ob_item[i]);
220553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
220653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyMem_FREE(final_ob_item);
220753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
220853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(compare);
220953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XINCREF(result);
221053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return result;
221153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
221253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#undef IFLT
221353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel#undef ISLT
221453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
221553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
221653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Sort(PyObject *v)
221753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
221853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL || !PyList_Check(v)) {
221953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
222053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
222153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
222253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
222353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL)
222453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
222553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(v);
222653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
222753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
222853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
222953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
223053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistreverse(PyListObject *self)
223153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
223253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(self) > 1)
223353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
223453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_RETURN_NONE;
223553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
223653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
223753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielint
223853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_Reverse(PyObject *v)
223953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
224053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *self = (PyListObject *)v;
224153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
224253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL || !PyList_Check(v)) {
224353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
224453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
224553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
224653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(self) > 1)
224753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
224853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
224953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
225053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
225153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyObject *
225253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyList_AsTuple(PyObject *v)
225353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
225453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *w;
225553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject **p, **q;
225653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t n;
225753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (v == NULL || !PyList_Check(v)) {
225853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
225953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
226053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
226153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    n = Py_SIZE(v);
226253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    w = PyTuple_New(n);
226353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (w == NULL)
226453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
226553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    p = ((PyTupleObject *)w)->ob_item;
226653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    q = ((PyListObject *)v)->ob_item;
226753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    while (--n >= 0) {
226853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(*q);
226953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        *p = *q;
227053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        p++;
227153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        q++;
227253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
227353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return w;
227453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
227553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
227653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
227753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistindex(PyListObject *self, PyObject *args)
227853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
227953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i, start=0, stop=Py_SIZE(self);
228053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *v, *format_tuple, *err_string;
228153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    static PyObject *err_format = NULL;
228253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
228353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
228453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                _PyEval_SliceIndex, &start,
228553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                _PyEval_SliceIndex, &stop))
228653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
228753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (start < 0) {
228853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        start += Py_SIZE(self);
228953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (start < 0)
229053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            start = 0;
229153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
229253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (stop < 0) {
229353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        stop += Py_SIZE(self);
229453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (stop < 0)
229553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            stop = 0;
229653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
229753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = start; i < stop && i < Py_SIZE(self); i++) {
229853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
229953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (cmp > 0)
230053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return PyInt_FromSsize_t(i);
230153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else if (cmp < 0)
230253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
230353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
230453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (err_format == NULL) {
230553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        err_format = PyString_FromString("%r is not in list");
230653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (err_format == NULL)
230753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
230853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
230953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    format_tuple = PyTuple_Pack(1, v);
231053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (format_tuple == NULL)
231153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
231253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    err_string = PyString_Format(err_format, format_tuple);
231353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(format_tuple);
231453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (err_string == NULL)
231553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
231653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyErr_SetObject(PyExc_ValueError, err_string);
231753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(err_string);
231853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
231953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
232053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
232153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
232253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistcount(PyListObject *self, PyObject *v)
232353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
232453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t count = 0;
232553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
232653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
232753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(self); i++) {
232853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
232953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (cmp > 0)
233053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            count++;
233153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else if (cmp < 0)
233253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
233353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
233453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyInt_FromSsize_t(count);
233553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
233653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
233753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
233853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistremove(PyListObject *self, PyObject *v)
233953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
234053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
234153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
234253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(self); i++) {
234353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
234453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (cmp > 0) {
234553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (list_ass_slice(self, i, i+1,
234653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                               (PyObject *)NULL) == 0)
234753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_RETURN_NONE;
234853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
234953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
235053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else if (cmp < 0)
235153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
235253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
235353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
235453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
235553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
235653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
235753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
235853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_traverse(PyListObject *o, visitproc visit, void *arg)
235953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
236053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
236153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
236253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = Py_SIZE(o); --i >= 0; )
236353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_VISIT(o->ob_item[i]);
236453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
236553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
236653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
236753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
236853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_richcompare(PyObject *v, PyObject *w, int op)
236953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
237053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *vl, *wl;
237153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t i;
237253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
237353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(v) || !PyList_Check(w)) {
237453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(Py_NotImplemented);
237553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return Py_NotImplemented;
237653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
237753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
237853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    vl = (PyListObject *)v;
237953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    wl = (PyListObject *)w;
238053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
238153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
238253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Shortcut: if the lengths differ, the lists differ */
238353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *res;
238453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (op == Py_EQ)
238553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            res = Py_False;
238653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else
238753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            res = Py_True;
238853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(res);
238953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return res;
239053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
239153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
239253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Search for the first index where items are different */
239353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
239453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int k = PyObject_RichCompareBool(vl->ob_item[i],
239553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                         wl->ob_item[i], Py_EQ);
239653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (k < 0)
239753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
239853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (!k)
239953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            break;
240053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
240153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
240253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
240353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* No more items to compare -- compare sizes */
240453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t vs = Py_SIZE(vl);
240553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t ws = Py_SIZE(wl);
240653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        int cmp;
240753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *res;
240853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        switch (op) {
240953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_LT: cmp = vs <  ws; break;
241053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_LE: cmp = vs <= ws; break;
241153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_EQ: cmp = vs == ws; break;
241253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_NE: cmp = vs != ws; break;
241353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_GT: cmp = vs >  ws; break;
241453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        case Py_GE: cmp = vs >= ws; break;
241553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        default: return NULL; /* cannot happen */
241653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
241753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (cmp)
241853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            res = Py_True;
241953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else
242053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            res = Py_False;
242153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(res);
242253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return res;
242353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
242453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
242553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* We have an item that differs -- shortcuts for EQ/NE */
242653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (op == Py_EQ) {
242753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(Py_False);
242853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return Py_False;
242953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
243053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (op == Py_NE) {
243153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(Py_True);
243253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return Py_True;
243353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
243453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
243553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Compare the final item again using the proper operator */
243653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
243753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
243853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
243953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
244053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_init(PyListObject *self, PyObject *args, PyObject *kw)
244153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
244253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *arg = NULL;
244353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    static char *kwlist[] = {"sequence", 0};
244453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
244553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
244653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
244753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
244853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Verify list invariants established by PyType_GenericAlloc() */
244953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(0 <= Py_SIZE(self));
245053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
245153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(self->ob_item != NULL ||
245253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           self->allocated == 0 || self->allocated == -1);
245353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
245453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* Empty previous contents */
245553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (self->ob_item != NULL) {
245653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        (void)list_clear(self);
245753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
245853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (arg != NULL) {
245953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject *rv = listextend(self, arg);
246053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (rv == NULL)
246153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return -1;
246253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(rv);
246353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
246453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
246553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
246653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
246753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
246853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_sizeof(PyListObject *self)
246953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
247053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t res;
247153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
247253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    res = sizeof(PyListObject) + self->allocated * sizeof(void*);
247353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyInt_FromSsize_t(res);
247453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
247553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
247653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *list_iter(PyObject *seq);
247753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *list_reversed(PyListObject* seq, PyObject* unused);
247853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
247953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(getitem_doc,
248053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"x.__getitem__(y) <==> x[y]");
248153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(reversed_doc,
248253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.__reversed__() -- return a reverse iterator over the list");
248353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(sizeof_doc,
248453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.__sizeof__() -- size of L in memory, in bytes");
248553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(append_doc,
248653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.append(object) -- append object to end");
248753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(extend_doc,
248853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.extend(iterable) -- extend list by appending elements from the iterable");
248953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(insert_doc,
249053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.insert(index, object) -- insert object before index");
249153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(pop_doc,
249253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.pop([index]) -> item -- remove and return item at index (default last).\n"
249353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"Raises IndexError if list is empty or index is out of range.");
249453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(remove_doc,
249553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.remove(value) -- remove first occurrence of value.\n"
249653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"Raises ValueError if the value is not present.");
249753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(index_doc,
249853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
249953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"Raises ValueError if the value is not present.");
250053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(count_doc,
250153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.count(value) -> integer -- return number of occurrences of value");
250253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(reverse_doc,
250353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.reverse() -- reverse *IN PLACE*");
250453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(sort_doc,
250553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
250653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielcmp(x, y) -> -1, 0, 1");
250753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
250853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *list_subscript(PyListObject*, PyObject*);
250953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
251053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyMethodDef list_methods[] = {
251153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
251253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
251353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"__sizeof__",  (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
251453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"append",          (PyCFunction)listappend,  METH_O, append_doc},
251553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"insert",          (PyCFunction)listinsert,  METH_VARARGS, insert_doc},
251653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"extend",      (PyCFunction)listextend,  METH_O, extend_doc},
251753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"pop",             (PyCFunction)listpop,     METH_VARARGS, pop_doc},
251853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"remove",          (PyCFunction)listremove,  METH_O, remove_doc},
251953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"index",           (PyCFunction)listindex,   METH_VARARGS, index_doc},
252053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"count",           (PyCFunction)listcount,   METH_O, count_doc},
252153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"reverse",         (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
252253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"sort",            (PyCFunction)listsort,    METH_VARARGS | METH_KEYWORDS, sort_doc},
252353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {NULL,              NULL}           /* sentinel */
252453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
252553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
252653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PySequenceMethods list_as_sequence = {
252753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (lenfunc)list_length,                       /* sq_length */
252853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (binaryfunc)list_concat,                    /* sq_concat */
252953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizeargfunc)list_repeat,                  /* sq_repeat */
253053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizeargfunc)list_item,                    /* sq_item */
253153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizessizeargfunc)list_slice,              /* sq_slice */
253253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizeobjargproc)list_ass_item,             /* sq_ass_item */
253353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizessizeobjargproc)list_ass_slice,       /* sq_ass_slice */
253453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (objobjproc)list_contains,                  /* sq_contains */
253553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (binaryfunc)list_inplace_concat,            /* sq_inplace_concat */
253653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (ssizeargfunc)list_inplace_repeat,          /* sq_inplace_repeat */
253753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
253853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
253953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(list_doc,
254053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"list() -> new empty list\n"
254153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel"list(iterable) -> new list initialized from iterable's items");
254253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
254353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
254453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
254553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_subscript(PyListObject* self, PyObject* item)
254653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
254753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (PyIndex_Check(item)) {
254853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t i;
254953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
255053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (i == -1 && PyErr_Occurred())
255153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
255253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (i < 0)
255353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            i += PyList_GET_SIZE(self);
255453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return list_item(self, i);
255553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
255653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (PySlice_Check(item)) {
255753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t start, stop, step, slicelength, cur, i;
255853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject* result;
255953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject* it;
256053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyObject **src, **dest;
256153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
256253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
256353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                         &start, &stop, &step, &slicelength) < 0) {
256453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return NULL;
256553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
256653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
256753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (slicelength <= 0) {
256853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return PyList_New(0);
256953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
257053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else if (step == 1) {
257153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return list_slice(self, start, stop);
257253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
257353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else {
257453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            result = PyList_New(slicelength);
257553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (!result) return NULL;
257653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
257753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            src = self->ob_item;
257853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            dest = ((PyListObject *)result)->ob_item;
257953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            for (cur = start, i = 0; i < slicelength;
258053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 cur += step, i++) {
258153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                it = src[cur];
258253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_INCREF(it);
258353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                dest[i] = it;
258453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
258553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
258653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return result;
258753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
258853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
258953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
259053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_Format(PyExc_TypeError,
259153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     "list indices must be integers, not %.200s",
259253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     item->ob_type->tp_name);
259353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
259453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
259553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
259653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
259753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
259853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
259953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
260053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (PyIndex_Check(item)) {
260153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
260253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (i == -1 && PyErr_Occurred())
260353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return -1;
260453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (i < 0)
260553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            i += PyList_GET_SIZE(self);
260653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return list_ass_item(self, i, value);
260753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
260853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else if (PySlice_Check(item)) {
260953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_ssize_t start, stop, step, slicelength;
261053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
261153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
261253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                         &start, &stop, &step, &slicelength) < 0) {
261353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return -1;
261453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
261553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
261653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (step == 1)
261753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return list_ass_slice(self, start, stop, value);
261853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
261953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        /* Make sure s[5:2] = [..] inserts at the right place:
262053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel           before 5, not before 2. */
262153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if ((step < 0 && start < stop) ||
262253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            (step > 0 && start > stop))
262353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            stop = start;
262453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
262553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (value == NULL) {
262653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* delete slice */
262753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyObject **garbage;
262853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            size_t cur;
262953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_ssize_t i;
263053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
263153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (slicelength <= 0)
263253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return 0;
263353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
263453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (step < 0) {
263553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                stop = start + 1;
263653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                start = stop + step*(slicelength - 1) - 1;
263753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                step = -step;
263853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
263953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
264053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            assert((size_t)slicelength <=
264153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                   PY_SIZE_MAX / sizeof(PyObject*));
264253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
264353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            garbage = (PyObject**)
264453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                PyMem_MALLOC(slicelength*sizeof(PyObject*));
264553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (!garbage) {
264653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                PyErr_NoMemory();
264753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return -1;
264853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
264953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
265053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* drawing pictures might help understand these for
265153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               loops. Basically, we memmove the parts of the
265253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               list that are *not* part of the slice: step-1
265353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               items for each item that is part of the slice,
265453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               and then tail end of the list that was not
265553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel               covered by the slice */
265653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            for (cur = start, i = 0;
265753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 cur < (size_t)stop;
265853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 cur += step, i++) {
265953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_ssize_t lim = step - 1;
266053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
266153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                garbage[i] = PyList_GET_ITEM(self, cur);
266253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
266353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                if (cur + step >= (size_t)Py_SIZE(self)) {
266453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    lim = Py_SIZE(self) - cur - 1;
266553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                }
266653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
266753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memmove(self->ob_item + cur - i,
266853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    self->ob_item + cur + 1,
266953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    lim * sizeof(PyObject *));
267053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
267153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            cur = start + slicelength*step;
267253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (cur < (size_t)Py_SIZE(self)) {
267353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                memmove(self->ob_item + cur - slicelength,
267453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    self->ob_item + cur,
267553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    (Py_SIZE(self) - cur) *
267653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     sizeof(PyObject *));
267753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
267853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
267953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_SIZE(self) -= slicelength;
268053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            list_resize(self, Py_SIZE(self));
268153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
268253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            for (i = 0; i < slicelength; i++) {
268353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_DECREF(garbage[i]);
268453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
268553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyMem_FREE(garbage);
268653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
268753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return 0;
268853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
268953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        else {
269053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* assign slice */
269153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyObject *ins, *seq;
269253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyObject **garbage, **seqitems, **selfitems;
269353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_ssize_t cur, i;
269453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
269553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            /* protect against a[::-1] = a */
269653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (self == (PyListObject*)value) {
269753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                seq = list_slice((PyListObject*)value, 0,
269853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                   PyList_GET_SIZE(value));
269953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
270053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            else {
270153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                seq = PySequence_Fast(value,
270253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                      "must assign iterable "
270353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                                      "to extended slice");
270453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
270553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (!seq)
270653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return -1;
270753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
270853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
270953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                PyErr_Format(PyExc_ValueError,
271053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    "attempt to assign sequence of "
271153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    "size %zd to extended slice of "
271253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                    "size %zd",
271353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                         PySequence_Fast_GET_SIZE(seq),
271453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                         slicelength);
271553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_DECREF(seq);
271653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return -1;
271753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
271853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
271953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (!slicelength) {
272053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_DECREF(seq);
272153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return 0;
272253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
272353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
272453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            garbage = (PyObject**)
272553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                PyMem_MALLOC(slicelength*sizeof(PyObject*));
272653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            if (!garbage) {
272753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_DECREF(seq);
272853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                PyErr_NoMemory();
272953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                return -1;
273053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
273153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
273253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            selfitems = self->ob_item;
273353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            seqitems = PySequence_Fast_ITEMS(seq);
273453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            for (cur = start, i = 0; i < slicelength;
273553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                 cur += step, i++) {
273653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                garbage[i] = selfitems[cur];
273753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                ins = seqitems[i];
273853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_INCREF(ins);
273953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                selfitems[cur] = ins;
274053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
274153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
274253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            for (i = 0; i < slicelength; i++) {
274353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                Py_DECREF(garbage[i]);
274453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            }
274553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
274653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            PyMem_FREE(garbage);
274753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            Py_DECREF(seq);
274853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
274953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return 0;
275053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        }
275153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
275253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    else {
275353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_Format(PyExc_TypeError,
275453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     "list indices must be integers, not %.200s",
275553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel                     item->ob_type->tp_name);
275653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return -1;
275753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
275853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
275953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
276053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyMappingMethods list_as_mapping = {
276153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (lenfunc)list_length,
276253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (binaryfunc)list_subscript,
276353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (objobjargproc)list_ass_subscript
276453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
276553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
276653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyTypeObject PyList_Type = {
276753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyVarObject_HEAD_INIT(&PyType_Type, 0)
276853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    "list",
276953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sizeof(PyListObject),
277053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,
277153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (destructor)list_dealloc,                   /* tp_dealloc */
277253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (printfunc)list_print,                      /* tp_print */
277353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getattr */
277453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattr */
277553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_compare */
277653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (reprfunc)list_repr,                        /* tp_repr */
277753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_number */
277853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    &list_as_sequence,                          /* tp_as_sequence */
277953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    &list_as_mapping,                           /* tp_as_mapping */
278053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */
278153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_call */
278253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_str */
278353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GenericGetAttr,                    /* tp_getattro */
278453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattro */
278553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_buffer */
278653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
278753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS,         /* tp_flags */
278853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    list_doc,                                   /* tp_doc */
278953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (traverseproc)list_traverse,                /* tp_traverse */
279053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (inquiry)list_clear,                        /* tp_clear */
279153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    list_richcompare,                           /* tp_richcompare */
279253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_weaklistoffset */
279353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    list_iter,                                  /* tp_iter */
279453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_iternext */
279553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    list_methods,                               /* tp_methods */
279653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_members */
279753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getset */
279853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_base */
279953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_dict */
280053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_descr_get */
280153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_descr_set */
280253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_dictoffset */
280353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (initproc)list_init,                        /* tp_init */
280453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyType_GenericAlloc,                        /* tp_alloc */
280553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyType_GenericNew,                          /* tp_new */
280653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_Del,                            /* tp_free */
280753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
280853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
280953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
281053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/*********************** List Iterator **************************/
281153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
281253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieltypedef struct {
281353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_HEAD
281453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    long it_index;
281553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
281653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel} listiterobject;
281753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
281853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *list_iter(PyObject *);
281953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void listiter_dealloc(listiterobject *);
282053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int listiter_traverse(listiterobject *, visitproc, void *);
282153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *listiter_next(listiterobject *);
282253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *listiter_len(listiterobject *);
282353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
282453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
282553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
282653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyMethodDef listiter_methods[] = {
282753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
282853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {NULL,              NULL}           /* sentinel */
282953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
283053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
283153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyTypeObject PyListIter_Type = {
283253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyVarObject_HEAD_INIT(&PyType_Type, 0)
283353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    "listiterator",                             /* tp_name */
283453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sizeof(listiterobject),                     /* tp_basicsize */
283553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_itemsize */
283653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* methods */
283753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (destructor)listiter_dealloc,               /* tp_dealloc */
283853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_print */
283953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getattr */
284053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattr */
284153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_compare */
284253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_repr */
284353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_number */
284453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_sequence */
284553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_mapping */
284653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_hash */
284753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_call */
284853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_str */
284953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GenericGetAttr,                    /* tp_getattro */
285053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattro */
285153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_buffer */
285253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
285353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_doc */
285453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (traverseproc)listiter_traverse,            /* tp_traverse */
285553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_clear */
285653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_richcompare */
285753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_weaklistoffset */
285853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_SelfIter,                          /* tp_iter */
285953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (iternextfunc)listiter_next,                /* tp_iternext */
286053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    listiter_methods,                           /* tp_methods */
286153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_members */
286253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
286353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
286453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
286553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
286653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_iter(PyObject *seq)
286753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
286853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    listiterobject *it;
286953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
287053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (!PyList_Check(seq)) {
287153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        PyErr_BadInternalCall();
287253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
287353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
287453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it = PyObject_GC_New(listiterobject, &PyListIter_Type);
287553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it == NULL)
287653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
287753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_index = 0;
287853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(seq);
287953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_seq = (PyListObject *)seq;
288053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    _PyObject_GC_TRACK(it);
288153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)it;
288253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
288353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
288453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
288553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistiter_dealloc(listiterobject *it)
288653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
288753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    _PyObject_GC_UNTRACK(it);
288853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(it->it_seq);
288953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_Del(it);
289053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
289153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
289253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
289353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistiter_traverse(listiterobject *it, visitproc visit, void *arg)
289453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
289553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_VISIT(it->it_seq);
289653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
289753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
289853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
289953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
290053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistiter_next(listiterobject *it)
290153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
290253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *seq;
290353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *item;
290453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
290553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(it != NULL);
290653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    seq = it->it_seq;
290753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (seq == NULL)
290853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
290953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(PyList_Check(seq));
291053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
291153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it->it_index < PyList_GET_SIZE(seq)) {
291253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item = PyList_GET_ITEM(seq, it->it_index);
291353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        ++it->it_index;
291453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(item);
291553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return item;
291653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
291753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
291853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_DECREF(seq);
291953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_seq = NULL;
292053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
292153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
292253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
292353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
292453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistiter_len(listiterobject *it)
292553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
292653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t len;
292753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it->it_seq) {
292853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        len = PyList_GET_SIZE(it->it_seq) - it->it_index;
292953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        if (len >= 0)
293053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel            return PyInt_FromSsize_t(len);
293153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
293253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyInt_FromLong(0);
293353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
293453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel/*********************** List Reverse Iterator **************************/
293553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
293653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanieltypedef struct {
293753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_HEAD
293853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t it_index;
293953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
294053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel} listreviterobject;
294153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
294253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *list_reversed(PyListObject *, PyObject *);
294353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void listreviter_dealloc(listreviterobject *);
294453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int listreviter_traverse(listreviterobject *, visitproc, void *);
294553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *listreviter_next(listreviterobject *);
294653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *listreviter_len(listreviterobject *);
294753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
294853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyMethodDef listreviter_methods[] = {
294953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
295053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    {NULL,              NULL}           /* sentinel */
295153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
295253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
295353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielPyTypeObject PyListRevIter_Type = {
295453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyVarObject_HEAD_INIT(&PyType_Type, 0)
295553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    "listreverseiterator",                      /* tp_name */
295653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    sizeof(listreviterobject),                  /* tp_basicsize */
295753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_itemsize */
295853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    /* methods */
295953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (destructor)listreviter_dealloc,            /* tp_dealloc */
296053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_print */
296153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_getattr */
296253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattr */
296353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_compare */
296453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_repr */
296553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_number */
296653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_sequence */
296753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_mapping */
296853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_hash */
296953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_call */
297053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_str */
297153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GenericGetAttr,                    /* tp_getattro */
297253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_setattro */
297353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_as_buffer */
297453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
297553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_doc */
297653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (traverseproc)listreviter_traverse,         /* tp_traverse */
297753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_clear */
297853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_richcompare */
297953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,                                          /* tp_weaklistoffset */
298053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_SelfIter,                          /* tp_iter */
298153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    (iternextfunc)listreviter_next,             /* tp_iternext */
298253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    listreviter_methods,                /* tp_methods */
298353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    0,
298453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel};
298553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
298653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
298753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellist_reversed(PyListObject *seq, PyObject *unused)
298853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
298953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    listreviterobject *it;
299053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
299153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
299253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it == NULL)
299353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return NULL;
299453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    assert(PyList_Check(seq));
299553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_index = PyList_GET_SIZE(seq) - 1;
299653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_INCREF(seq);
299753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_seq = seq;
299853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_Track(it);
299953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return (PyObject *)it;
300053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
300153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
300253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic void
300353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistreviter_dealloc(listreviterobject *it)
300453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
300553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_UnTrack(it);
300653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_XDECREF(it->it_seq);
300753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject_GC_Del(it);
300853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
300953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
301053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic int
301153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
301253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
301353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_VISIT(it->it_seq);
301453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return 0;
301553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
301653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
301753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
301853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistreviter_next(listreviterobject *it)
301953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
302053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyObject *item;
302153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t index = it->it_index;
302253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    PyListObject *seq = it->it_seq;
302353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
302453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (index>=0 && index < PyList_GET_SIZE(seq)) {
302553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        item = PyList_GET_ITEM(seq, index);
302653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        it->it_index--;
302753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_INCREF(item);
302853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        return item;
302953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
303053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    it->it_index = -1;
303153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (seq != NULL) {
303253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        it->it_seq = NULL;
303353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        Py_DECREF(seq);
303453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    }
303553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return NULL;
303653b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
303753b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel
303853b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDanielstatic PyObject *
303953b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniellistreviter_len(listreviterobject *it)
304053b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel{
304153b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    Py_ssize_t len = it->it_index + 1;
304253b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
304353b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel        len = 0;
304453b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel    return PyLong_FromSsize_t(len);
304553b2ba5790b57b3dcdfbb9fa5835a979d94908faDaryl McDaniel}
3046