1 /* List object implementation */
8 #include <sys/types.h> /* For size_t */
11 /* Ensure ob_item has room for at least newsize elements, and set
12 * ob_size to newsize. If newsize > ob_size on entry, the content
13 * of the new slots at exit is undefined heap trash; it's the caller's
14 * responsiblity to overwrite them with sane values.
15 * The number of allocated elements may grow, shrink, or stay the same.
16 * Failure is impossible if newsize <= self.allocated on entry, although
17 * that partly relies on an assumption that the system realloc() never
18 * fails when passed a number of bytes <= the number of bytes last
19 * allocated (the C standard doesn't guarantee this, but it's hard to
20 * imagine a realloc implementation where it wouldn't be true).
21 * Note that self->ob_item may change, and even if newsize is less
22 * than ob_size on entry.
25 list_resize(PyListObject
*self
, Py_ssize_t newsize
)
29 Py_ssize_t allocated
= self
->allocated
;
31 /* Bypass realloc() when a previous overallocation is large enough
32 to accommodate the newsize. If the newsize falls lower than half
33 the allocated size, then proceed with the realloc() to shrink the list.
35 if (allocated
>= newsize
&& newsize
>= (allocated
>> 1)) {
36 assert(self
->ob_item
!= NULL
|| newsize
== 0);
37 Py_SIZE(self
) = newsize
;
41 /* This over-allocates proportional to the list size, making room
42 * for additional growth. The over-allocation is mild, but is
43 * enough to give linear-time amortized behavior over a long
44 * sequence of appends() in the presence of a poorly-performing
46 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
48 new_allocated
= (newsize
>> 3) + (newsize
< 9 ? 3 : 6);
50 /* check for integer overflow */
51 if (new_allocated
> PY_SIZE_MAX
- newsize
) {
55 new_allocated
+= newsize
;
60 items
= self
->ob_item
;
61 if (new_allocated
<= ((~(size_t)0) / sizeof(PyObject
*)))
62 PyMem_RESIZE(items
, PyObject
*, new_allocated
);
69 self
->ob_item
= items
;
70 Py_SIZE(self
) = newsize
;
71 self
->allocated
= new_allocated
;
75 /* Debug statistic to compare allocations with reuse through the free list */
76 #undef SHOW_ALLOC_COUNT
77 #ifdef SHOW_ALLOC_COUNT
78 static size_t count_alloc
= 0;
79 static size_t count_reuse
= 0;
84 fprintf(stderr
, "List allocations: %" PY_FORMAT_SIZE_T
"d\n",
86 fprintf(stderr
, "List reuse through freelist: %" PY_FORMAT_SIZE_T
88 fprintf(stderr
, "%.2f%% reuse rate\n\n",
89 (100.0*count_reuse
/(count_alloc
+count_reuse
)));
93 /* Empty list reuse scheme to save calls to malloc and free */
94 #ifndef PyList_MAXFREELIST
95 #define PyList_MAXFREELIST 80
97 static PyListObject
*free_list
[PyList_MAXFREELIST
];
98 static int numfree
= 0;
106 op
= free_list
[--numfree
];
107 assert(PyList_CheckExact(op
));
113 PyList_New(Py_ssize_t size
)
117 #ifdef SHOW_ALLOC_COUNT
118 static int initialized
= 0;
120 Py_AtExit(show_alloc
);
126 PyErr_BadInternalCall();
129 nbytes
= size
* sizeof(PyObject
*);
130 /* Check for overflow without an actual overflow,
131 * which can cause compiler to optimise out */
132 if (size
> PY_SIZE_MAX
/ sizeof(PyObject
*))
133 return PyErr_NoMemory();
136 op
= free_list
[numfree
];
137 _Py_NewReference((PyObject
*)op
);
138 #ifdef SHOW_ALLOC_COUNT
142 op
= PyObject_GC_New(PyListObject
, &PyList_Type
);
145 #ifdef SHOW_ALLOC_COUNT
152 op
->ob_item
= (PyObject
**) PyMem_MALLOC(nbytes
);
153 if (op
->ob_item
== NULL
) {
155 return PyErr_NoMemory();
157 memset(op
->ob_item
, 0, nbytes
);
160 op
->allocated
= size
;
161 _PyObject_GC_TRACK(op
);
162 return (PyObject
*) op
;
166 PyList_Size(PyObject
*op
)
168 if (!PyList_Check(op
)) {
169 PyErr_BadInternalCall();
176 static PyObject
*indexerr
= NULL
;
179 PyList_GetItem(PyObject
*op
, Py_ssize_t i
)
181 if (!PyList_Check(op
)) {
182 PyErr_BadInternalCall();
185 if (i
< 0 || i
>= Py_SIZE(op
)) {
186 if (indexerr
== NULL
)
187 indexerr
= PyString_FromString(
188 "list index out of range");
189 PyErr_SetObject(PyExc_IndexError
, indexerr
);
192 return ((PyListObject
*)op
) -> ob_item
[i
];
196 PyList_SetItem(register PyObject
*op
, register Py_ssize_t i
,
197 register PyObject
*newitem
)
199 register PyObject
*olditem
;
200 register PyObject
**p
;
201 if (!PyList_Check(op
)) {
203 PyErr_BadInternalCall();
206 if (i
< 0 || i
>= Py_SIZE(op
)) {
208 PyErr_SetString(PyExc_IndexError
,
209 "list assignment index out of range");
212 p
= ((PyListObject
*)op
) -> ob_item
+ i
;
220 ins1(PyListObject
*self
, Py_ssize_t where
, PyObject
*v
)
222 Py_ssize_t i
, n
= Py_SIZE(self
);
225 PyErr_BadInternalCall();
228 if (n
== PY_SSIZE_T_MAX
) {
229 PyErr_SetString(PyExc_OverflowError
,
230 "cannot add more objects to list");
234 if (list_resize(self
, n
+1) == -1)
244 items
= self
->ob_item
;
245 for (i
= n
; --i
>= where
; )
246 items
[i
+1] = items
[i
];
253 PyList_Insert(PyObject
*op
, Py_ssize_t where
, PyObject
*newitem
)
255 if (!PyList_Check(op
)) {
256 PyErr_BadInternalCall();
259 return ins1((PyListObject
*)op
, where
, newitem
);
263 app1(PyListObject
*self
, PyObject
*v
)
265 Py_ssize_t n
= PyList_GET_SIZE(self
);
268 if (n
== PY_SSIZE_T_MAX
) {
269 PyErr_SetString(PyExc_OverflowError
,
270 "cannot add more objects to list");
274 if (list_resize(self
, n
+1) == -1)
278 PyList_SET_ITEM(self
, n
, v
);
283 PyList_Append(PyObject
*op
, PyObject
*newitem
)
285 if (PyList_Check(op
) && (newitem
!= NULL
))
286 return app1((PyListObject
*)op
, newitem
);
287 PyErr_BadInternalCall();
294 list_dealloc(PyListObject
*op
)
297 PyObject_GC_UnTrack(op
);
298 Py_TRASHCAN_SAFE_BEGIN(op
)
299 if (op
->ob_item
!= NULL
) {
300 /* Do it backwards, for Christian Tismer.
301 There's a simple test case where somehow this reduces
302 thrashing when a *very* large list is created and
303 immediately deleted. */
306 Py_XDECREF(op
->ob_item
[i
]);
308 PyMem_FREE(op
->ob_item
);
310 if (numfree
< PyList_MAXFREELIST
&& PyList_CheckExact(op
))
311 free_list
[numfree
++] = op
;
313 Py_TYPE(op
)->tp_free((PyObject
*)op
);
314 Py_TRASHCAN_SAFE_END(op
)
318 list_print(PyListObject
*op
, FILE *fp
, int flags
)
323 rc
= Py_ReprEnter((PyObject
*)op
);
327 Py_BEGIN_ALLOW_THREADS
328 fprintf(fp
, "[...]");
332 Py_BEGIN_ALLOW_THREADS
335 for (i
= 0; i
< Py_SIZE(op
); i
++) {
337 Py_BEGIN_ALLOW_THREADS
341 if (PyObject_Print(op
->ob_item
[i
], fp
, 0) != 0) {
342 Py_ReprLeave((PyObject
*)op
);
346 Py_BEGIN_ALLOW_THREADS
349 Py_ReprLeave((PyObject
*)op
);
354 list_repr(PyListObject
*v
)
358 PyObject
*pieces
= NULL
, *result
= NULL
;
360 i
= Py_ReprEnter((PyObject
*)v
);
362 return i
> 0 ? PyString_FromString("[...]") : NULL
;
365 if (Py_SIZE(v
) == 0) {
366 result
= PyString_FromString("[]");
370 pieces
= PyList_New(0);
374 /* Do repr() on each element. Note that this may mutate the list,
375 so must refetch the list size on each iteration. */
376 for (i
= 0; i
< Py_SIZE(v
); ++i
) {
378 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
380 s
= PyObject_Repr(v
->ob_item
[i
]);
381 Py_LeaveRecursiveCall();
384 status
= PyList_Append(pieces
, s
);
385 Py_DECREF(s
); /* append created a new ref */
390 /* Add "[]" decorations to the first and last items. */
391 assert(PyList_GET_SIZE(pieces
) > 0);
392 s
= PyString_FromString("[");
395 temp
= PyList_GET_ITEM(pieces
, 0);
396 PyString_ConcatAndDel(&s
, temp
);
397 PyList_SET_ITEM(pieces
, 0, s
);
401 s
= PyString_FromString("]");
404 temp
= PyList_GET_ITEM(pieces
, PyList_GET_SIZE(pieces
) - 1);
405 PyString_ConcatAndDel(&temp
, s
);
406 PyList_SET_ITEM(pieces
, PyList_GET_SIZE(pieces
) - 1, temp
);
410 /* Paste them all together with ", " between. */
411 s
= PyString_FromString(", ");
414 result
= _PyString_Join(s
, pieces
);
419 Py_ReprLeave((PyObject
*)v
);
424 list_length(PyListObject
*a
)
430 list_contains(PyListObject
*a
, PyObject
*el
)
435 for (i
= 0, cmp
= 0 ; cmp
== 0 && i
< Py_SIZE(a
); ++i
)
436 cmp
= PyObject_RichCompareBool(el
, PyList_GET_ITEM(a
, i
),
442 list_item(PyListObject
*a
, Py_ssize_t i
)
444 if (i
< 0 || i
>= Py_SIZE(a
)) {
445 if (indexerr
== NULL
)
446 indexerr
= PyString_FromString(
447 "list index out of range");
448 PyErr_SetObject(PyExc_IndexError
, indexerr
);
451 Py_INCREF(a
->ob_item
[i
]);
452 return a
->ob_item
[i
];
456 list_slice(PyListObject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
)
459 PyObject
**src
, **dest
;
463 else if (ilow
> Py_SIZE(a
))
467 else if (ihigh
> Py_SIZE(a
))
470 np
= (PyListObject
*) PyList_New(len
);
474 src
= a
->ob_item
+ ilow
;
476 for (i
= 0; i
< len
; i
++) {
477 PyObject
*v
= src
[i
];
481 return (PyObject
*)np
;
485 PyList_GetSlice(PyObject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
)
487 if (!PyList_Check(a
)) {
488 PyErr_BadInternalCall();
491 return list_slice((PyListObject
*)a
, ilow
, ihigh
);
495 list_concat(PyListObject
*a
, PyObject
*bb
)
499 PyObject
**src
, **dest
;
501 if (!PyList_Check(bb
)) {
502 PyErr_Format(PyExc_TypeError
,
503 "can only concatenate list (not \"%.200s\") to list",
504 bb
->ob_type
->tp_name
);
507 #define b ((PyListObject *)bb)
508 size
= Py_SIZE(a
) + Py_SIZE(b
);
510 return PyErr_NoMemory();
511 np
= (PyListObject
*) PyList_New(size
);
517 for (i
= 0; i
< Py_SIZE(a
); i
++) {
518 PyObject
*v
= src
[i
];
523 dest
= np
->ob_item
+ Py_SIZE(a
);
524 for (i
= 0; i
< Py_SIZE(b
); i
++) {
525 PyObject
*v
= src
[i
];
529 return (PyObject
*)np
;
534 list_repeat(PyListObject
*a
, Py_ssize_t n
)
539 PyObject
**p
, **items
;
543 size
= Py_SIZE(a
) * n
;
544 if (n
&& size
/n
!= Py_SIZE(a
))
545 return PyErr_NoMemory();
547 return PyList_New(0);
548 np
= (PyListObject
*) PyList_New(size
);
553 if (Py_SIZE(a
) == 1) {
554 elem
= a
->ob_item
[0];
555 for (i
= 0; i
< n
; i
++) {
559 return (PyObject
*) np
;
563 for (i
= 0; i
< n
; i
++) {
564 for (j
= 0; j
< Py_SIZE(a
); j
++) {
570 return (PyObject
*) np
;
574 list_clear(PyListObject
*a
)
577 PyObject
**item
= a
->ob_item
;
579 /* Because XDECREF can recursively invoke operations on
580 this list, we make it empty first. */
590 /* Never fails; the return value can be ignored.
591 Note that there is no guarantee that the list is actually empty
592 at this point, because XDECREF may have populated it again! */
596 /* a[ilow:ihigh] = v if v != NULL.
597 * del a[ilow:ihigh] if v == NULL.
599 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
600 * guaranteed the call cannot fail.
603 list_ass_slice(PyListObject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
, PyObject
*v
)
605 /* Because [X]DECREF can recursively invoke list operations on
606 this list, we must postpone all [X]DECREF activity until
607 after the list is back in its canonical shape. Therefore
608 we must allocate an additional array, 'recycle', into which
609 we temporarily copy the items that are deleted from the
611 PyObject
*recycle_on_stack
[8];
612 PyObject
**recycle
= recycle_on_stack
; /* will allocate more if needed */
614 PyObject
**vitem
= NULL
;
615 PyObject
*v_as_SF
= NULL
; /* PySequence_Fast(v) */
616 Py_ssize_t n
; /* # of elements in replacement list */
617 Py_ssize_t norig
; /* # of elements in list getting replaced */
618 Py_ssize_t d
; /* Change in size */
621 int result
= -1; /* guilty until proved innocent */
622 #define b ((PyListObject *)v)
627 /* Special case "a[i:j] = a" -- copy b first */
628 v
= list_slice(b
, 0, Py_SIZE(b
));
631 result
= list_ass_slice(a
, ilow
, ihigh
, v
);
635 v_as_SF
= PySequence_Fast(v
, "can only assign an iterable");
638 n
= PySequence_Fast_GET_SIZE(v_as_SF
);
639 vitem
= PySequence_Fast_ITEMS(v_as_SF
);
643 else if (ilow
> Py_SIZE(a
))
648 else if (ihigh
> Py_SIZE(a
))
651 norig
= ihigh
- ilow
;
654 if (Py_SIZE(a
) + d
== 0) {
656 return list_clear(a
);
659 /* recycle the items that we are about to remove */
660 s
= norig
* sizeof(PyObject
*);
661 if (s
> sizeof(recycle_on_stack
)) {
662 recycle
= (PyObject
**)PyMem_MALLOC(s
);
663 if (recycle
== NULL
) {
668 memcpy(recycle
, &item
[ilow
], s
);
670 if (d
< 0) { /* Delete -d items */
671 memmove(&item
[ihigh
+d
], &item
[ihigh
],
672 (Py_SIZE(a
) - ihigh
)*sizeof(PyObject
*));
673 list_resize(a
, Py_SIZE(a
) + d
);
676 else if (d
> 0) { /* Insert d items */
678 if (list_resize(a
, k
+d
) < 0)
681 memmove(&item
[ihigh
+d
], &item
[ihigh
],
682 (k
- ihigh
)*sizeof(PyObject
*));
684 for (k
= 0; k
< n
; k
++, ilow
++) {
685 PyObject
*w
= vitem
[k
];
689 for (k
= norig
- 1; k
>= 0; --k
)
690 Py_XDECREF(recycle
[k
]);
693 if (recycle
!= recycle_on_stack
)
701 PyList_SetSlice(PyObject
*a
, Py_ssize_t ilow
, Py_ssize_t ihigh
, PyObject
*v
)
703 if (!PyList_Check(a
)) {
704 PyErr_BadInternalCall();
707 return list_ass_slice((PyListObject
*)a
, ilow
, ihigh
, v
);
711 list_inplace_repeat(PyListObject
*self
, Py_ssize_t n
)
714 Py_ssize_t size
, i
, j
, p
;
717 size
= PyList_GET_SIZE(self
);
718 if (size
== 0 || n
== 1) {
720 return (PyObject
*)self
;
724 (void)list_clear(self
);
726 return (PyObject
*)self
;
729 if (size
> PY_SSIZE_T_MAX
/ n
) {
730 return PyErr_NoMemory();
733 if (list_resize(self
, size
*n
) == -1)
737 items
= self
->ob_item
;
738 for (i
= 1; i
< n
; i
++) { /* Start counting at 1, not 0 */
739 for (j
= 0; j
< size
; j
++) {
740 PyObject
*o
= items
[j
];
746 return (PyObject
*)self
;
750 list_ass_item(PyListObject
*a
, Py_ssize_t i
, PyObject
*v
)
753 if (i
< 0 || i
>= Py_SIZE(a
)) {
754 PyErr_SetString(PyExc_IndexError
,
755 "list assignment index out of range");
759 return list_ass_slice(a
, i
, i
+1, v
);
761 old_value
= a
->ob_item
[i
];
763 Py_DECREF(old_value
);
768 listinsert(PyListObject
*self
, PyObject
*args
)
772 if (!PyArg_ParseTuple(args
, "nO:insert", &i
, &v
))
774 if (ins1(self
, i
, v
) == 0)
780 listappend(PyListObject
*self
, PyObject
*v
)
782 if (app1(self
, v
) == 0)
788 listextend(PyListObject
*self
, PyObject
*b
)
790 PyObject
*it
; /* iter(v) */
791 Py_ssize_t m
; /* size of self */
792 Py_ssize_t n
; /* guess for size of b */
793 Py_ssize_t mn
; /* m + n */
795 PyObject
*(*iternext
)(PyObject
*);
798 1) lists and tuples which can use PySequence_Fast ops
799 2) extending self to self requires making a copy first
801 if (PyList_CheckExact(b
) || PyTuple_CheckExact(b
) || (PyObject
*)self
== b
) {
802 PyObject
**src
, **dest
;
803 b
= PySequence_Fast(b
, "argument must be iterable");
806 n
= PySequence_Fast_GET_SIZE(b
);
808 /* short circuit when b is empty */
813 if (list_resize(self
, m
+ n
) == -1) {
817 /* note that we may still have self == b here for the
818 * situation a.extend(a), but the following code works
819 * in that case too. Just make sure to resize self
820 * before calling PySequence_Fast_ITEMS.
822 /* populate the end of self with b's items */
823 src
= PySequence_Fast_ITEMS(b
);
824 dest
= self
->ob_item
+ m
;
825 for (i
= 0; i
< n
; i
++) {
826 PyObject
*o
= src
[i
];
834 it
= PyObject_GetIter(b
);
837 iternext
= *it
->ob_type
->tp_iternext
;
839 /* Guess a result list size. */
840 n
= _PyObject_LengthHint(b
, 8);
849 if (list_resize(self
, mn
) == -1)
851 /* Make the list sane again. */
854 /* Else m + n overflowed; on the chance that n lied, and there really
855 * is enough room, ignore it. If n was telling the truth, we'll
856 * eventually run out of memory during the loop.
859 /* Run iterator to exhaustion. */
861 PyObject
*item
= iternext(it
);
863 if (PyErr_Occurred()) {
864 if (PyErr_ExceptionMatches(PyExc_StopIteration
))
871 if (Py_SIZE(self
) < self
->allocated
) {
873 PyList_SET_ITEM(self
, Py_SIZE(self
), item
);
877 int status
= app1(self
, item
);
878 Py_DECREF(item
); /* append creates a new ref */
884 /* Cut back result list if initial guess was too large. */
885 if (Py_SIZE(self
) < self
->allocated
)
886 list_resize(self
, Py_SIZE(self
)); /* shrinking can't fail */
897 _PyList_Extend(PyListObject
*self
, PyObject
*b
)
899 return listextend(self
, b
);
903 list_inplace_concat(PyListObject
*self
, PyObject
*other
)
907 result
= listextend(self
, other
);
912 return (PyObject
*)self
;
916 listpop(PyListObject
*self
, PyObject
*args
)
922 if (!PyArg_ParseTuple(args
, "|n:pop", &i
))
925 if (Py_SIZE(self
) == 0) {
926 /* Special-case most common failure cause */
927 PyErr_SetString(PyExc_IndexError
, "pop from empty list");
932 if (i
< 0 || i
>= Py_SIZE(self
)) {
933 PyErr_SetString(PyExc_IndexError
, "pop index out of range");
936 v
= self
->ob_item
[i
];
937 if (i
== Py_SIZE(self
) - 1) {
938 status
= list_resize(self
, Py_SIZE(self
) - 1);
940 return v
; /* and v now owns the reference the list had */
943 status
= list_ass_slice(self
, i
, i
+1, (PyObject
*)NULL
);
945 /* Use status, so that in a release build compilers don't
946 * complain about the unused name.
953 /* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
955 reverse_slice(PyObject
**lo
, PyObject
**hi
)
969 /* Lots of code for an adaptive, stable, natural mergesort. There are many
970 * pieces to this algorithm; read listsort.txt for overviews and details.
973 /* Comparison function. Takes care of calling a user-supplied
974 * comparison function (any callable Python object), which must not be
975 * NULL (use the ISLT macro if you don't know, or call PyObject_RichCompareBool
976 * with Py_LT if you know it's NULL).
977 * Returns -1 on error, 1 if x < y, 0 if x >= y.
980 islt(PyObject
*x
, PyObject
*y
, PyObject
*compare
)
986 assert(compare
!= NULL
);
987 /* Call the user's comparison function and translate the 3-way
988 * result into true or false (or error).
990 args
= PyTuple_New(2);
995 PyTuple_SET_ITEM(args
, 0, x
);
996 PyTuple_SET_ITEM(args
, 1, y
);
997 res
= PyObject_Call(compare
, args
, NULL
);
1001 if (!PyInt_Check(res
)) {
1002 PyErr_Format(PyExc_TypeError
,
1003 "comparison function must return int, not %.200s",
1004 res
->ob_type
->tp_name
);
1008 i
= PyInt_AsLong(res
);
1013 /* If COMPARE is NULL, calls PyObject_RichCompareBool with Py_LT, else calls
1014 * islt. This avoids a layer of function call in the usual case, and
1015 * sorting does many comparisons.
1016 * Returns -1 on error, 1 if x < y, 0 if x >= y.
1018 #define ISLT(X, Y, COMPARE) ((COMPARE) == NULL ? \
1019 PyObject_RichCompareBool(X, Y, Py_LT) : \
1020 islt(X, Y, COMPARE))
1022 /* Compare X to Y via "<". Goto "fail" if the comparison raises an
1023 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
1024 started. It makes more sense in context <wink>. X and Y are PyObject*s.
1026 #define IFLT(X, Y) if ((k = ISLT(X, Y, compare)) < 0) goto fail; \
1029 /* binarysort is the best method for sorting small arrays: it does
1030 few compares, but can do data movement quadratic in the number of
1032 [lo, hi) is a contiguous slice of a list, and is sorted via
1033 binary insertion. This sort is stable.
1034 On entry, must have lo <= start <= hi, and that [lo, start) is already
1035 sorted (pass start == lo if you don't know!).
1036 If islt() complains return -1, else 0.
1037 Even in case of error, the output slice will be some permutation of
1038 the input (nothing is lost or duplicated).
1041 binarysort(PyObject
**lo
, PyObject
**hi
, PyObject
**start
, PyObject
*compare
)
1042 /* compare -- comparison function object, or NULL for default */
1044 register Py_ssize_t k
;
1045 register PyObject
**l
, **p
, **r
;
1046 register PyObject
*pivot
;
1048 assert(lo
<= start
&& start
<= hi
);
1049 /* assert [lo, start) is sorted */
1052 for (; start
< hi
; ++start
) {
1053 /* set l to where *start belongs */
1058 * pivot >= all in [lo, l).
1059 * pivot < all in [r, start).
1060 * The second is vacuously true at the start.
1064 p
= l
+ ((r
- l
) >> 1);
1071 /* The invariants still hold, so pivot >= all in [lo, l) and
1072 pivot < all in [l, start), so pivot belongs at l. Note
1073 that if there are elements equal to pivot, l points to the
1074 first slot after them -- that's why this sort is stable.
1075 Slide over to make room.
1076 Caution: using memmove is much slower under MSVC 5;
1077 we're not usually moving many slots. */
1078 for (p
= start
; p
> l
; --p
)
1089 Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
1090 is required on entry. "A run" is the longest ascending sequence, with
1092 lo[0] <= lo[1] <= lo[2] <= ...
1094 or the longest descending sequence, with
1096 lo[0] > lo[1] > lo[2] > ...
1098 Boolean *descending is set to 0 in the former case, or to 1 in the latter.
1099 For its intended use in a stable mergesort, the strictness of the defn of
1100 "descending" is needed so that the caller can safely reverse a descending
1101 sequence without violating stability (strict > ensures there are no equal
1102 elements to get out of order).
1104 Returns -1 in case of error.
1107 count_run(PyObject
**lo
, PyObject
**hi
, PyObject
*compare
, int *descending
)
1119 IFLT(*lo
, *(lo
-1)) {
1121 for (lo
= lo
+1; lo
< hi
; ++lo
, ++n
) {
1129 for (lo
= lo
+1; lo
< hi
; ++lo
, ++n
) {
1141 Locate the proper position of key in a sorted vector; if the vector contains
1142 an element equal to key, return the position immediately to the left of
1143 the leftmost equal element. [gallop_right() does the same except returns
1144 the position to the right of the rightmost equal element (if any).]
1146 "a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
1148 "hint" is an index at which to begin the search, 0 <= hint < n. The closer
1149 hint is to the final result, the faster this runs.
1151 The return value is the int k in 0..n such that
1153 a[k-1] < key <= a[k]
1155 pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
1156 key belongs at index k; or, IOW, the first k elements of a should precede
1157 key, and the last n-k should follow key.
1159 Returns -1 on error. See listsort.txt for info on the method.
1162 gallop_left(PyObject
*key
, PyObject
**a
, Py_ssize_t n
, Py_ssize_t hint
, PyObject
*compare
)
1168 assert(key
&& a
&& n
> 0 && hint
>= 0 && hint
< n
);
1174 /* a[hint] < key -- gallop right, until
1175 * a[hint + lastofs] < key <= a[hint + ofs]
1177 const Py_ssize_t maxofs
= n
- hint
; /* &a[n-1] is highest */
1178 while (ofs
< maxofs
) {
1181 ofs
= (ofs
<< 1) + 1;
1182 if (ofs
<= 0) /* int overflow */
1185 else /* key <= a[hint + ofs] */
1190 /* Translate back to offsets relative to &a[0]. */
1195 /* key <= a[hint] -- gallop left, until
1196 * a[hint - ofs] < key <= a[hint - lastofs]
1198 const Py_ssize_t maxofs
= hint
+ 1; /* &a[0] is lowest */
1199 while (ofs
< maxofs
) {
1202 /* key <= a[hint - ofs] */
1204 ofs
= (ofs
<< 1) + 1;
1205 if (ofs
<= 0) /* int overflow */
1210 /* Translate back to positive offsets relative to &a[0]. */
1212 lastofs
= hint
- ofs
;
1217 assert(-1 <= lastofs
&& lastofs
< ofs
&& ofs
<= n
);
1218 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
1219 * right of lastofs but no farther right than ofs. Do a binary
1220 * search, with invariant a[lastofs-1] < key <= a[ofs].
1223 while (lastofs
< ofs
) {
1224 Py_ssize_t m
= lastofs
+ ((ofs
- lastofs
) >> 1);
1227 lastofs
= m
+1; /* a[m] < key */
1229 ofs
= m
; /* key <= a[m] */
1231 assert(lastofs
== ofs
); /* so a[ofs-1] < key <= a[ofs] */
1239 Exactly like gallop_left(), except that if key already exists in a[0:n],
1240 finds the position immediately to the right of the rightmost equal value.
1242 The return value is the int k in 0..n such that
1244 a[k-1] <= key < a[k]
1248 The code duplication is massive, but this is enough different given that
1249 we're sticking to "<" comparisons that it's much harder to follow if
1250 written as one routine with yet another "left or right?" flag.
1253 gallop_right(PyObject
*key
, PyObject
**a
, Py_ssize_t n
, Py_ssize_t hint
, PyObject
*compare
)
1259 assert(key
&& a
&& n
> 0 && hint
>= 0 && hint
< n
);
1265 /* key < a[hint] -- gallop left, until
1266 * a[hint - ofs] <= key < a[hint - lastofs]
1268 const Py_ssize_t maxofs
= hint
+ 1; /* &a[0] is lowest */
1269 while (ofs
< maxofs
) {
1270 IFLT(key
, *(a
-ofs
)) {
1272 ofs
= (ofs
<< 1) + 1;
1273 if (ofs
<= 0) /* int overflow */
1276 else /* a[hint - ofs] <= key */
1281 /* Translate back to positive offsets relative to &a[0]. */
1283 lastofs
= hint
- ofs
;
1287 /* a[hint] <= key -- gallop right, until
1288 * a[hint + lastofs] <= key < a[hint + ofs]
1290 const Py_ssize_t maxofs
= n
- hint
; /* &a[n-1] is highest */
1291 while (ofs
< maxofs
) {
1294 /* a[hint + ofs] <= key */
1296 ofs
= (ofs
<< 1) + 1;
1297 if (ofs
<= 0) /* int overflow */
1302 /* Translate back to offsets relative to &a[0]. */
1308 assert(-1 <= lastofs
&& lastofs
< ofs
&& ofs
<= n
);
1309 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
1310 * right of lastofs but no farther right than ofs. Do a binary
1311 * search, with invariant a[lastofs-1] <= key < a[ofs].
1314 while (lastofs
< ofs
) {
1315 Py_ssize_t m
= lastofs
+ ((ofs
- lastofs
) >> 1);
1318 ofs
= m
; /* key < a[m] */
1320 lastofs
= m
+1; /* a[m] <= key */
1322 assert(lastofs
== ofs
); /* so a[ofs-1] <= key < a[ofs] */
1329 /* The maximum number of entries in a MergeState's pending-runs stack.
1330 * This is enough to sort arrays of size up to about
1331 * 32 * phi ** MAX_MERGE_PENDING
1332 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
1333 * with 2**64 elements.
1335 #define MAX_MERGE_PENDING 85
1337 /* When we get into galloping mode, we stay there until both runs win less
1338 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
1340 #define MIN_GALLOP 7
1342 /* Avoid malloc for small temp arrays. */
1343 #define MERGESTATE_TEMP_SIZE 256
1345 /* One MergeState exists on the stack per invocation of mergesort. It's just
1346 * a convenient way to pass state around among the helper functions.
1353 typedef struct s_MergeState
{
1354 /* The user-supplied comparison function. or NULL if none given. */
1357 /* This controls when we get *into* galloping mode. It's initialized
1358 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
1359 * random data, and lower for highly structured data.
1361 Py_ssize_t min_gallop
;
1363 /* 'a' is temp storage to help with merges. It contains room for
1366 PyObject
**a
; /* may point to temparray below */
1369 /* A stack of n pending runs yet to be merged. Run #i starts at
1370 * address base[i] and extends for len[i] elements. It's always
1371 * true (so long as the indices are in bounds) that
1373 * pending[i].base + pending[i].len == pending[i+1].base
1375 * so we could cut the storage for this, but it's a minor amount,
1376 * and keeping all the info explicit simplifies the code.
1379 struct s_slice pending
[MAX_MERGE_PENDING
];
1381 /* 'a' points to this when possible, rather than muck with malloc. */
1382 PyObject
*temparray
[MERGESTATE_TEMP_SIZE
];
1385 /* Conceptually a MergeState's constructor. */
1387 merge_init(MergeState
*ms
, PyObject
*compare
)
1390 ms
->compare
= compare
;
1391 ms
->a
= ms
->temparray
;
1392 ms
->alloced
= MERGESTATE_TEMP_SIZE
;
1394 ms
->min_gallop
= MIN_GALLOP
;
1397 /* Free all the temp memory owned by the MergeState. This must be called
1398 * when you're done with a MergeState, and may be called before then if
1399 * you want to free the temp memory early.
1402 merge_freemem(MergeState
*ms
)
1405 if (ms
->a
!= ms
->temparray
)
1407 ms
->a
= ms
->temparray
;
1408 ms
->alloced
= MERGESTATE_TEMP_SIZE
;
1411 /* Ensure enough temp memory for 'need' array slots is available.
1412 * Returns 0 on success and -1 if the memory can't be gotten.
1415 merge_getmem(MergeState
*ms
, Py_ssize_t need
)
1418 if (need
<= ms
->alloced
)
1420 /* Don't realloc! That can cost cycles to copy the old data, but
1421 * we don't care what's in the block.
1424 if (need
> PY_SSIZE_T_MAX
/ sizeof(PyObject
*)) {
1428 ms
->a
= (PyObject
**)PyMem_Malloc(need
* sizeof(PyObject
*));
1434 merge_freemem(ms
); /* reset to sane state */
1437 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
1438 merge_getmem(MS, NEED))
1440 /* Merge the na elements starting at pa with the nb elements starting at pb
1441 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1442 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1443 * merge, and should have na <= nb. See listsort.txt for more info.
1444 * Return 0 if successful, -1 if error.
1447 merge_lo(MergeState
*ms
, PyObject
**pa
, Py_ssize_t na
,
1448 PyObject
**pb
, Py_ssize_t nb
)
1453 int result
= -1; /* guilty until proved innocent */
1454 Py_ssize_t min_gallop
;
1456 assert(ms
&& pa
&& pb
&& na
> 0 && nb
> 0 && pa
+ na
== pb
);
1457 if (MERGE_GETMEM(ms
, na
) < 0)
1459 memcpy(ms
->a
, pa
, na
* sizeof(PyObject
*));
1470 min_gallop
= ms
->min_gallop
;
1471 compare
= ms
->compare
;
1473 Py_ssize_t acount
= 0; /* # of times A won in a row */
1474 Py_ssize_t bcount
= 0; /* # of times B won in a row */
1476 /* Do the straightforward thing until (if ever) one run
1477 * appears to win consistently.
1480 assert(na
> 1 && nb
> 0);
1481 k
= ISLT(*pb
, *pa
, compare
);
1491 if (bcount
>= min_gallop
)
1501 if (acount
>= min_gallop
)
1506 /* One run is winning so consistently that galloping may
1507 * be a huge win. So try that, and continue galloping until
1508 * (if ever) neither run appears to be winning consistently
1513 assert(na
> 1 && nb
> 0);
1514 min_gallop
-= min_gallop
> 1;
1515 ms
->min_gallop
= min_gallop
;
1516 k
= gallop_right(*pb
, pa
, na
, 0, compare
);
1521 memcpy(dest
, pa
, k
* sizeof(PyObject
*));
1527 /* na==0 is impossible now if the comparison
1528 * function is consistent, but we can't assume
1539 k
= gallop_left(*pa
, pb
, nb
, 0, compare
);
1544 memmove(dest
, pb
, k
* sizeof(PyObject
*));
1555 } while (acount
>= MIN_GALLOP
|| bcount
>= MIN_GALLOP
);
1556 ++min_gallop
; /* penalize it for leaving galloping mode */
1557 ms
->min_gallop
= min_gallop
;
1563 memcpy(dest
, pa
, na
* sizeof(PyObject
*));
1566 assert(na
== 1 && nb
> 0);
1567 /* The last element of pa belongs at the end of the merge. */
1568 memmove(dest
, pb
, nb
* sizeof(PyObject
*));
1573 /* Merge the na elements starting at pa with the nb elements starting at pb
1574 * in a stable way, in-place. na and nb must be > 0, and pa + na == pb.
1575 * Must also have that *pb < *pa, that pa[na-1] belongs at the end of the
1576 * merge, and should have na >= nb. See listsort.txt for more info.
1577 * Return 0 if successful, -1 if error.
1580 merge_hi(MergeState
*ms
, PyObject
**pa
, Py_ssize_t na
, PyObject
**pb
, Py_ssize_t nb
)
1585 int result
= -1; /* guilty until proved innocent */
1588 Py_ssize_t min_gallop
;
1590 assert(ms
&& pa
&& pb
&& na
> 0 && nb
> 0 && pa
+ na
== pb
);
1591 if (MERGE_GETMEM(ms
, nb
) < 0)
1594 memcpy(ms
->a
, pb
, nb
* sizeof(PyObject
*));
1597 pb
= ms
->a
+ nb
- 1;
1607 min_gallop
= ms
->min_gallop
;
1608 compare
= ms
->compare
;
1610 Py_ssize_t acount
= 0; /* # of times A won in a row */
1611 Py_ssize_t bcount
= 0; /* # of times B won in a row */
1613 /* Do the straightforward thing until (if ever) one run
1614 * appears to win consistently.
1617 assert(na
> 0 && nb
> 1);
1618 k
= ISLT(*pb
, *pa
, compare
);
1628 if (acount
>= min_gallop
)
1638 if (bcount
>= min_gallop
)
1643 /* One run is winning so consistently that galloping may
1644 * be a huge win. So try that, and continue galloping until
1645 * (if ever) neither run appears to be winning consistently
1650 assert(na
> 0 && nb
> 1);
1651 min_gallop
-= min_gallop
> 1;
1652 ms
->min_gallop
= min_gallop
;
1653 k
= gallop_right(*pb
, basea
, na
, na
-1, compare
);
1661 memmove(dest
+1, pa
+1, k
* sizeof(PyObject
*));
1671 k
= gallop_left(*pa
, baseb
, nb
, nb
-1, compare
);
1679 memcpy(dest
+1, pb
+1, k
* sizeof(PyObject
*));
1683 /* nb==0 is impossible now if the comparison
1684 * function is consistent, but we can't assume
1694 } while (acount
>= MIN_GALLOP
|| bcount
>= MIN_GALLOP
);
1695 ++min_gallop
; /* penalize it for leaving galloping mode */
1696 ms
->min_gallop
= min_gallop
;
1702 memcpy(dest
-(nb
-1), baseb
, nb
* sizeof(PyObject
*));
1705 assert(nb
== 1 && na
> 0);
1706 /* The first element of pb belongs at the front of the merge. */
1709 memmove(dest
+1, pa
+1, na
* sizeof(PyObject
*));
1714 /* Merge the two runs at stack indices i and i+1.
1715 * Returns 0 on success, -1 on error.
1718 merge_at(MergeState
*ms
, Py_ssize_t i
)
1720 PyObject
**pa
, **pb
;
1728 assert(i
== ms
->n
- 2 || i
== ms
->n
- 3);
1730 pa
= ms
->pending
[i
].base
;
1731 na
= ms
->pending
[i
].len
;
1732 pb
= ms
->pending
[i
+1].base
;
1733 nb
= ms
->pending
[i
+1].len
;
1734 assert(na
> 0 && nb
> 0);
1735 assert(pa
+ na
== pb
);
1737 /* Record the length of the combined runs; if i is the 3rd-last
1738 * run now, also slide over the last run (which isn't involved
1739 * in this merge). The current run i+1 goes away in any case.
1741 ms
->pending
[i
].len
= na
+ nb
;
1743 ms
->pending
[i
+1] = ms
->pending
[i
+2];
1746 /* Where does b start in a? Elements in a before that can be
1747 * ignored (already in place).
1749 compare
= ms
->compare
;
1750 k
= gallop_right(*pb
, pa
, na
, 0, compare
);
1758 /* Where does a end in b? Elements in b after that can be
1759 * ignored (already in place).
1761 nb
= gallop_left(pa
[na
-1], pb
, nb
, nb
-1, compare
);
1765 /* Merge what remains of the runs, using a temp array with
1766 * min(na, nb) elements.
1769 return merge_lo(ms
, pa
, na
, pb
, nb
);
1771 return merge_hi(ms
, pa
, na
, pb
, nb
);
1774 /* Examine the stack of runs waiting to be merged, merging adjacent runs
1775 * until the stack invariants are re-established:
1777 * 1. len[-3] > len[-2] + len[-1]
1778 * 2. len[-2] > len[-1]
1780 * See listsort.txt for more info.
1782 * Returns 0 on success, -1 on error.
1785 merge_collapse(MergeState
*ms
)
1787 struct s_slice
*p
= ms
->pending
;
1791 Py_ssize_t n
= ms
->n
- 2;
1792 if (n
> 0 && p
[n
-1].len
<= p
[n
].len
+ p
[n
+1].len
) {
1793 if (p
[n
-1].len
< p
[n
+1].len
)
1795 if (merge_at(ms
, n
) < 0)
1798 else if (p
[n
].len
<= p
[n
+1].len
) {
1799 if (merge_at(ms
, n
) < 0)
1808 /* Regardless of invariants, merge all runs on the stack until only one
1809 * remains. This is used at the end of the mergesort.
1811 * Returns 0 on success, -1 on error.
1814 merge_force_collapse(MergeState
*ms
)
1816 struct s_slice
*p
= ms
->pending
;
1820 Py_ssize_t n
= ms
->n
- 2;
1821 if (n
> 0 && p
[n
-1].len
< p
[n
+1].len
)
1823 if (merge_at(ms
, n
) < 0)
1829 /* Compute a good value for the minimum run length; natural runs shorter
1830 * than this are boosted artificially via binary insertion.
1832 * If n < 64, return n (it's too small to bother with fancy stuff).
1833 * Else if n is an exact power of 2, return 32.
1834 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
1835 * strictly less than, an exact power of 2.
1837 * See listsort.txt for more info.
1840 merge_compute_minrun(Py_ssize_t n
)
1842 Py_ssize_t r
= 0; /* becomes 1 if any 1 bits are shifted off */
1852 /* Special wrapper to support stable sorting using the decorate-sort-undecorate
1853 pattern. Holds a key which is used for comparisons and the original record
1854 which is returned during the undecorate phase. By exposing only the key
1855 during comparisons, the underlying sort stability characteristics are left
1856 unchanged. Also, if a custom comparison function is used, it will only see
1857 the key instead of a full record. */
1863 } sortwrapperobject
;
1865 PyDoc_STRVAR(sortwrapper_doc
, "Object wrapper with a custom sort key.");
1867 sortwrapper_richcompare(sortwrapperobject
*, sortwrapperobject
*, int);
1869 sortwrapper_dealloc(sortwrapperobject
*);
1871 static PyTypeObject sortwrapper_type
= {
1872 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
1873 "sortwrapper", /* tp_name */
1874 sizeof(sortwrapperobject
), /* tp_basicsize */
1875 0, /* tp_itemsize */
1877 (destructor
)sortwrapper_dealloc
, /* tp_dealloc */
1883 0, /* tp_as_number */
1884 0, /* tp_as_sequence */
1885 0, /* tp_as_mapping */
1889 PyObject_GenericGetAttr
, /* tp_getattro */
1890 0, /* tp_setattro */
1891 0, /* tp_as_buffer */
1892 Py_TPFLAGS_DEFAULT
|
1893 Py_TPFLAGS_HAVE_RICHCOMPARE
, /* tp_flags */
1894 sortwrapper_doc
, /* tp_doc */
1895 0, /* tp_traverse */
1897 (richcmpfunc
)sortwrapper_richcompare
, /* tp_richcompare */
1902 sortwrapper_richcompare(sortwrapperobject
*a
, sortwrapperobject
*b
, int op
)
1904 if (!PyObject_TypeCheck(b
, &sortwrapper_type
)) {
1905 PyErr_SetString(PyExc_TypeError
,
1906 "expected a sortwrapperobject");
1909 return PyObject_RichCompare(a
->key
, b
->key
, op
);
1913 sortwrapper_dealloc(sortwrapperobject
*so
)
1915 Py_XDECREF(so
->key
);
1916 Py_XDECREF(so
->value
);
1920 /* Returns a new reference to a sortwrapper.
1921 Consumes the references to the two underlying objects. */
1924 build_sortwrapper(PyObject
*key
, PyObject
*value
)
1926 sortwrapperobject
*so
;
1928 so
= PyObject_New(sortwrapperobject
, &sortwrapper_type
);
1933 return (PyObject
*)so
;
1936 /* Returns a new reference to the value underlying the wrapper. */
1938 sortwrapper_getvalue(PyObject
*so
)
1942 if (!PyObject_TypeCheck(so
, &sortwrapper_type
)) {
1943 PyErr_SetString(PyExc_TypeError
,
1944 "expected a sortwrapperobject");
1947 value
= ((sortwrapperobject
*)so
)->value
;
1952 /* Wrapper for user specified cmp functions in combination with a
1953 specified key function. Makes sure the cmp function is presented
1954 with the actual key instead of the sortwrapper */
1962 cmpwrapper_dealloc(cmpwrapperobject
*co
)
1964 Py_XDECREF(co
->func
);
1969 cmpwrapper_call(cmpwrapperobject
*co
, PyObject
*args
, PyObject
*kwds
)
1971 PyObject
*x
, *y
, *xx
, *yy
;
1973 if (!PyArg_UnpackTuple(args
, "", 2, 2, &x
, &y
))
1975 if (!PyObject_TypeCheck(x
, &sortwrapper_type
) ||
1976 !PyObject_TypeCheck(y
, &sortwrapper_type
)) {
1977 PyErr_SetString(PyExc_TypeError
,
1978 "expected a sortwrapperobject");
1981 xx
= ((sortwrapperobject
*)x
)->key
;
1982 yy
= ((sortwrapperobject
*)y
)->key
;
1983 return PyObject_CallFunctionObjArgs(co
->func
, xx
, yy
, NULL
);
1986 PyDoc_STRVAR(cmpwrapper_doc
, "cmp() wrapper for sort with custom keys.");
1988 static PyTypeObject cmpwrapper_type
= {
1989 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
1990 "cmpwrapper", /* tp_name */
1991 sizeof(cmpwrapperobject
), /* tp_basicsize */
1992 0, /* tp_itemsize */
1994 (destructor
)cmpwrapper_dealloc
, /* tp_dealloc */
2000 0, /* tp_as_number */
2001 0, /* tp_as_sequence */
2002 0, /* tp_as_mapping */
2004 (ternaryfunc
)cmpwrapper_call
, /* tp_call */
2006 PyObject_GenericGetAttr
, /* tp_getattro */
2007 0, /* tp_setattro */
2008 0, /* tp_as_buffer */
2009 Py_TPFLAGS_DEFAULT
, /* tp_flags */
2010 cmpwrapper_doc
, /* tp_doc */
2014 build_cmpwrapper(PyObject
*cmpfunc
)
2016 cmpwrapperobject
*co
;
2018 co
= PyObject_New(cmpwrapperobject
, &cmpwrapper_type
);
2023 return (PyObject
*)co
;
2026 /* An adaptive, stable, natural mergesort. See listsort.txt.
2027 * Returns Py_None on success, NULL on error. Even in case of error, the
2028 * list will be some permutation of its input state (nothing is lost or
2032 listsort(PyListObject
*self
, PyObject
*args
, PyObject
*kwds
)
2035 PyObject
**lo
, **hi
;
2036 Py_ssize_t nremaining
;
2038 Py_ssize_t saved_ob_size
, saved_allocated
;
2039 PyObject
**saved_ob_item
;
2040 PyObject
**final_ob_item
;
2041 PyObject
*compare
= NULL
;
2042 PyObject
*result
= NULL
; /* guilty until proved innocent */
2044 PyObject
*keyfunc
= NULL
;
2046 PyObject
*key
, *value
, *kvpair
;
2047 static char *kwlist
[] = {"cmp", "key", "reverse", 0};
2049 assert(self
!= NULL
);
2050 assert (PyList_Check(self
));
2052 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "|OOi:sort",
2053 kwlist
, &compare
, &keyfunc
, &reverse
))
2056 if (compare
== Py_None
)
2058 if (compare
!= NULL
&&
2059 PyErr_WarnPy3k("the cmp argument is not supported in 3.x", 1) < 0)
2061 if (keyfunc
== Py_None
)
2063 if (compare
!= NULL
&& keyfunc
!= NULL
) {
2064 compare
= build_cmpwrapper(compare
);
2065 if (compare
== NULL
)
2068 Py_XINCREF(compare
);
2070 /* The list is temporarily made empty, so that mutations performed
2071 * by comparison functions can't affect the slice of memory we're
2072 * sorting (allowing mutations during sorting is a core-dump
2073 * factory, since ob_item may change).
2075 saved_ob_size
= Py_SIZE(self
);
2076 saved_ob_item
= self
->ob_item
;
2077 saved_allocated
= self
->allocated
;
2079 self
->ob_item
= NULL
;
2080 self
->allocated
= -1; /* any operation will reset it to >= 0 */
2082 if (keyfunc
!= NULL
) {
2083 for (i
=0 ; i
< saved_ob_size
; i
++) {
2084 value
= saved_ob_item
[i
];
2085 key
= PyObject_CallFunctionObjArgs(keyfunc
, value
,
2088 for (i
=i
-1 ; i
>=0 ; i
--) {
2089 kvpair
= saved_ob_item
[i
];
2090 value
= sortwrapper_getvalue(kvpair
);
2091 saved_ob_item
[i
] = value
;
2096 kvpair
= build_sortwrapper(key
, value
);
2099 saved_ob_item
[i
] = kvpair
;
2103 /* Reverse sort stability achieved by initially reversing the list,
2104 applying a stable forward sort, then reversing the final result. */
2105 if (reverse
&& saved_ob_size
> 1)
2106 reverse_slice(saved_ob_item
, saved_ob_item
+ saved_ob_size
);
2108 merge_init(&ms
, compare
);
2110 nremaining
= saved_ob_size
;
2114 /* March over the array once, left to right, finding natural runs,
2115 * and extending short natural runs to minrun elements.
2118 hi
= lo
+ nremaining
;
2119 minrun
= merge_compute_minrun(nremaining
);
2124 /* Identify next run. */
2125 n
= count_run(lo
, hi
, compare
, &descending
);
2129 reverse_slice(lo
, lo
+ n
);
2130 /* If short, extend to min(minrun, nremaining). */
2132 const Py_ssize_t force
= nremaining
<= minrun
?
2133 nremaining
: minrun
;
2134 if (binarysort(lo
, lo
+ force
, lo
+ n
, compare
) < 0)
2138 /* Push run onto pending-runs stack, and maybe merge. */
2139 assert(ms
.n
< MAX_MERGE_PENDING
);
2140 ms
.pending
[ms
.n
].base
= lo
;
2141 ms
.pending
[ms
.n
].len
= n
;
2143 if (merge_collapse(&ms
) < 0)
2145 /* Advance to find next run. */
2148 } while (nremaining
);
2151 if (merge_force_collapse(&ms
) < 0)
2154 assert(ms
.pending
[0].base
== saved_ob_item
);
2155 assert(ms
.pending
[0].len
== saved_ob_size
);
2160 if (keyfunc
!= NULL
) {
2161 for (i
=0 ; i
< saved_ob_size
; i
++) {
2162 kvpair
= saved_ob_item
[i
];
2163 value
= sortwrapper_getvalue(kvpair
);
2164 saved_ob_item
[i
] = value
;
2169 if (self
->allocated
!= -1 && result
!= NULL
) {
2170 /* The user mucked with the list during the sort,
2171 * and we don't already have another error to report.
2173 PyErr_SetString(PyExc_ValueError
, "list modified during sort");
2177 if (reverse
&& saved_ob_size
> 1)
2178 reverse_slice(saved_ob_item
, saved_ob_item
+ saved_ob_size
);
2183 final_ob_item
= self
->ob_item
;
2185 Py_SIZE(self
) = saved_ob_size
;
2186 self
->ob_item
= saved_ob_item
;
2187 self
->allocated
= saved_allocated
;
2188 if (final_ob_item
!= NULL
) {
2189 /* we cannot use list_clear() for this because it does not
2190 guarantee that the list is really empty when it returns */
2192 Py_XDECREF(final_ob_item
[i
]);
2194 PyMem_FREE(final_ob_item
);
2196 Py_XDECREF(compare
);
2204 PyList_Sort(PyObject
*v
)
2206 if (v
== NULL
|| !PyList_Check(v
)) {
2207 PyErr_BadInternalCall();
2210 v
= listsort((PyListObject
*)v
, (PyObject
*)NULL
, (PyObject
*)NULL
);
2218 listreverse(PyListObject
*self
)
2220 if (Py_SIZE(self
) > 1)
2221 reverse_slice(self
->ob_item
, self
->ob_item
+ Py_SIZE(self
));
2226 PyList_Reverse(PyObject
*v
)
2228 PyListObject
*self
= (PyListObject
*)v
;
2230 if (v
== NULL
|| !PyList_Check(v
)) {
2231 PyErr_BadInternalCall();
2234 if (Py_SIZE(self
) > 1)
2235 reverse_slice(self
->ob_item
, self
->ob_item
+ Py_SIZE(self
));
2240 PyList_AsTuple(PyObject
*v
)
2245 if (v
== NULL
|| !PyList_Check(v
)) {
2246 PyErr_BadInternalCall();
2253 p
= ((PyTupleObject
*)w
)->ob_item
;
2254 q
= ((PyListObject
*)v
)->ob_item
;
2265 listindex(PyListObject
*self
, PyObject
*args
)
2267 Py_ssize_t i
, start
=0, stop
=Py_SIZE(self
);
2270 if (!PyArg_ParseTuple(args
, "O|O&O&:index", &v
,
2271 _PyEval_SliceIndex
, &start
,
2272 _PyEval_SliceIndex
, &stop
))
2275 start
+= Py_SIZE(self
);
2280 stop
+= Py_SIZE(self
);
2284 for (i
= start
; i
< stop
&& i
< Py_SIZE(self
); i
++) {
2285 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
2287 return PyInt_FromSsize_t(i
);
2291 PyErr_SetString(PyExc_ValueError
, "list.index(x): x not in list");
2296 listcount(PyListObject
*self
, PyObject
*v
)
2298 Py_ssize_t count
= 0;
2301 for (i
= 0; i
< Py_SIZE(self
); i
++) {
2302 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
2308 return PyInt_FromSsize_t(count
);
2312 listremove(PyListObject
*self
, PyObject
*v
)
2316 for (i
= 0; i
< Py_SIZE(self
); i
++) {
2317 int cmp
= PyObject_RichCompareBool(self
->ob_item
[i
], v
, Py_EQ
);
2319 if (list_ass_slice(self
, i
, i
+1,
2320 (PyObject
*)NULL
) == 0)
2327 PyErr_SetString(PyExc_ValueError
, "list.remove(x): x not in list");
2332 list_traverse(PyListObject
*o
, visitproc visit
, void *arg
)
2336 for (i
= Py_SIZE(o
); --i
>= 0; )
2337 Py_VISIT(o
->ob_item
[i
]);
2342 list_richcompare(PyObject
*v
, PyObject
*w
, int op
)
2344 PyListObject
*vl
, *wl
;
2347 if (!PyList_Check(v
) || !PyList_Check(w
)) {
2348 Py_INCREF(Py_NotImplemented
);
2349 return Py_NotImplemented
;
2352 vl
= (PyListObject
*)v
;
2353 wl
= (PyListObject
*)w
;
2355 if (Py_SIZE(vl
) != Py_SIZE(wl
) && (op
== Py_EQ
|| op
== Py_NE
)) {
2356 /* Shortcut: if the lengths differ, the lists differ */
2366 /* Search for the first index where items are different */
2367 for (i
= 0; i
< Py_SIZE(vl
) && i
< Py_SIZE(wl
); i
++) {
2368 int k
= PyObject_RichCompareBool(vl
->ob_item
[i
],
2369 wl
->ob_item
[i
], Py_EQ
);
2376 if (i
>= Py_SIZE(vl
) || i
>= Py_SIZE(wl
)) {
2377 /* No more items to compare -- compare sizes */
2378 Py_ssize_t vs
= Py_SIZE(vl
);
2379 Py_ssize_t ws
= Py_SIZE(wl
);
2383 case Py_LT
: cmp
= vs
< ws
; break;
2384 case Py_LE
: cmp
= vs
<= ws
; break;
2385 case Py_EQ
: cmp
= vs
== ws
; break;
2386 case Py_NE
: cmp
= vs
!= ws
; break;
2387 case Py_GT
: cmp
= vs
> ws
; break;
2388 case Py_GE
: cmp
= vs
>= ws
; break;
2389 default: return NULL
; /* cannot happen */
2399 /* We have an item that differs -- shortcuts for EQ/NE */
2401 Py_INCREF(Py_False
);
2409 /* Compare the final item again using the proper operator */
2410 return PyObject_RichCompare(vl
->ob_item
[i
], wl
->ob_item
[i
], op
);
2414 list_init(PyListObject
*self
, PyObject
*args
, PyObject
*kw
)
2416 PyObject
*arg
= NULL
;
2417 static char *kwlist
[] = {"sequence", 0};
2419 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "|O:list", kwlist
, &arg
))
2422 /* Verify list invariants established by PyType_GenericAlloc() */
2423 assert(0 <= Py_SIZE(self
));
2424 assert(Py_SIZE(self
) <= self
->allocated
|| self
->allocated
== -1);
2425 assert(self
->ob_item
!= NULL
||
2426 self
->allocated
== 0 || self
->allocated
== -1);
2428 /* Empty previous contents */
2429 if (self
->ob_item
!= NULL
) {
2430 (void)list_clear(self
);
2433 PyObject
*rv
= listextend(self
, arg
);
2442 list_sizeof(PyListObject
*self
)
2446 res
= sizeof(PyListObject
) + self
->allocated
* sizeof(void*);
2447 return PyInt_FromSsize_t(res
);
2450 static PyObject
*list_iter(PyObject
*seq
);
2451 static PyObject
*list_reversed(PyListObject
* seq
, PyObject
* unused
);
2453 PyDoc_STRVAR(getitem_doc
,
2454 "x.__getitem__(y) <==> x[y]");
2455 PyDoc_STRVAR(reversed_doc
,
2456 "L.__reversed__() -- return a reverse iterator over the list");
2457 PyDoc_STRVAR(sizeof_doc
,
2458 "L.__sizeof__() -- size of L in memory, in bytes");
2459 PyDoc_STRVAR(append_doc
,
2460 "L.append(object) -- append object to end");
2461 PyDoc_STRVAR(extend_doc
,
2462 "L.extend(iterable) -- extend list by appending elements from the iterable");
2463 PyDoc_STRVAR(insert_doc
,
2464 "L.insert(index, object) -- insert object before index");
2465 PyDoc_STRVAR(pop_doc
,
2466 "L.pop([index]) -> item -- remove and return item at index (default last).\n"
2467 "Raises IndexError if list is empty or index is out of range.");
2468 PyDoc_STRVAR(remove_doc
,
2469 "L.remove(value) -- remove first occurrence of value.\n"
2470 "Raises ValueError if the value is not present.");
2471 PyDoc_STRVAR(index_doc
,
2472 "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
2473 "Raises ValueError if the value is not present.");
2474 PyDoc_STRVAR(count_doc
,
2475 "L.count(value) -> integer -- return number of occurrences of value");
2476 PyDoc_STRVAR(reverse_doc
,
2477 "L.reverse() -- reverse *IN PLACE*");
2478 PyDoc_STRVAR(sort_doc
,
2479 "L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;\n\
2480 cmp(x, y) -> -1, 0, 1");
2482 static PyObject
*list_subscript(PyListObject
*, PyObject
*);
2484 static PyMethodDef list_methods
[] = {
2485 {"__getitem__", (PyCFunction
)list_subscript
, METH_O
|METH_COEXIST
, getitem_doc
},
2486 {"__reversed__",(PyCFunction
)list_reversed
, METH_NOARGS
, reversed_doc
},
2487 {"__sizeof__", (PyCFunction
)list_sizeof
, METH_NOARGS
, sizeof_doc
},
2488 {"append", (PyCFunction
)listappend
, METH_O
, append_doc
},
2489 {"insert", (PyCFunction
)listinsert
, METH_VARARGS
, insert_doc
},
2490 {"extend", (PyCFunction
)listextend
, METH_O
, extend_doc
},
2491 {"pop", (PyCFunction
)listpop
, METH_VARARGS
, pop_doc
},
2492 {"remove", (PyCFunction
)listremove
, METH_O
, remove_doc
},
2493 {"index", (PyCFunction
)listindex
, METH_VARARGS
, index_doc
},
2494 {"count", (PyCFunction
)listcount
, METH_O
, count_doc
},
2495 {"reverse", (PyCFunction
)listreverse
, METH_NOARGS
, reverse_doc
},
2496 {"sort", (PyCFunction
)listsort
, METH_VARARGS
| METH_KEYWORDS
, sort_doc
},
2497 {NULL
, NULL
} /* sentinel */
2500 static PySequenceMethods list_as_sequence
= {
2501 (lenfunc
)list_length
, /* sq_length */
2502 (binaryfunc
)list_concat
, /* sq_concat */
2503 (ssizeargfunc
)list_repeat
, /* sq_repeat */
2504 (ssizeargfunc
)list_item
, /* sq_item */
2505 (ssizessizeargfunc
)list_slice
, /* sq_slice */
2506 (ssizeobjargproc
)list_ass_item
, /* sq_ass_item */
2507 (ssizessizeobjargproc
)list_ass_slice
, /* sq_ass_slice */
2508 (objobjproc
)list_contains
, /* sq_contains */
2509 (binaryfunc
)list_inplace_concat
, /* sq_inplace_concat */
2510 (ssizeargfunc
)list_inplace_repeat
, /* sq_inplace_repeat */
2513 PyDoc_STRVAR(list_doc
,
2514 "list() -> new list\n"
2515 "list(sequence) -> new list initialized from sequence's items");
2519 list_subscript(PyListObject
* self
, PyObject
* item
)
2521 if (PyIndex_Check(item
)) {
2523 i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
2524 if (i
== -1 && PyErr_Occurred())
2527 i
+= PyList_GET_SIZE(self
);
2528 return list_item(self
, i
);
2530 else if (PySlice_Check(item
)) {
2531 Py_ssize_t start
, stop
, step
, slicelength
, cur
, i
;
2534 PyObject
**src
, **dest
;
2536 if (PySlice_GetIndicesEx((PySliceObject
*)item
, Py_SIZE(self
),
2537 &start
, &stop
, &step
, &slicelength
) < 0) {
2541 if (slicelength
<= 0) {
2542 return PyList_New(0);
2544 else if (step
== 1) {
2545 return list_slice(self
, start
, stop
);
2548 result
= PyList_New(slicelength
);
2549 if (!result
) return NULL
;
2551 src
= self
->ob_item
;
2552 dest
= ((PyListObject
*)result
)->ob_item
;
2553 for (cur
= start
, i
= 0; i
< slicelength
;
2564 PyErr_Format(PyExc_TypeError
,
2565 "list indices must be integers, not %.200s",
2566 item
->ob_type
->tp_name
);
2572 list_ass_subscript(PyListObject
* self
, PyObject
* item
, PyObject
* value
)
2574 if (PyIndex_Check(item
)) {
2575 Py_ssize_t i
= PyNumber_AsSsize_t(item
, PyExc_IndexError
);
2576 if (i
== -1 && PyErr_Occurred())
2579 i
+= PyList_GET_SIZE(self
);
2580 return list_ass_item(self
, i
, value
);
2582 else if (PySlice_Check(item
)) {
2583 Py_ssize_t start
, stop
, step
, slicelength
;
2585 if (PySlice_GetIndicesEx((PySliceObject
*)item
, Py_SIZE(self
),
2586 &start
, &stop
, &step
, &slicelength
) < 0) {
2591 return list_ass_slice(self
, start
, stop
, value
);
2593 /* Make sure s[5:2] = [..] inserts at the right place:
2594 before 5, not before 2. */
2595 if ((step
< 0 && start
< stop
) ||
2596 (step
> 0 && start
> stop
))
2599 if (value
== NULL
) {
2604 if (slicelength
<= 0)
2609 start
= stop
+ step
*(slicelength
- 1) - 1;
2613 assert(slicelength
<= PY_SIZE_MAX
/ sizeof(PyObject
*));
2615 garbage
= (PyObject
**)
2616 PyMem_MALLOC(slicelength
*sizeof(PyObject
*));
2622 /* drawing pictures might help understand these for
2623 loops. Basically, we memmove the parts of the
2624 list that are *not* part of the slice: step-1
2625 items for each item that is part of the slice,
2626 and then tail end of the list that was not
2627 covered by the slice */
2628 for (cur
= start
, i
= 0;
2631 Py_ssize_t lim
= step
- 1;
2633 garbage
[i
] = PyList_GET_ITEM(self
, cur
);
2635 if (cur
+ step
>= Py_SIZE(self
)) {
2636 lim
= Py_SIZE(self
) - cur
- 1;
2639 memmove(self
->ob_item
+ cur
- i
,
2640 self
->ob_item
+ cur
+ 1,
2641 lim
* sizeof(PyObject
*));
2643 cur
= start
+ slicelength
*step
;
2644 if (cur
< Py_SIZE(self
)) {
2645 memmove(self
->ob_item
+ cur
- slicelength
,
2646 self
->ob_item
+ cur
,
2647 (Py_SIZE(self
) - cur
) *
2648 sizeof(PyObject
*));
2651 Py_SIZE(self
) -= slicelength
;
2652 list_resize(self
, Py_SIZE(self
));
2654 for (i
= 0; i
< slicelength
; i
++) {
2655 Py_DECREF(garbage
[i
]);
2657 PyMem_FREE(garbage
);
2663 PyObject
*ins
, *seq
;
2664 PyObject
**garbage
, **seqitems
, **selfitems
;
2667 /* protect against a[::-1] = a */
2668 if (self
== (PyListObject
*)value
) {
2669 seq
= list_slice((PyListObject
*)value
, 0,
2670 PyList_GET_SIZE(value
));
2673 seq
= PySequence_Fast(value
,
2674 "must assign iterable "
2675 "to extended slice");
2680 if (PySequence_Fast_GET_SIZE(seq
) != slicelength
) {
2681 PyErr_Format(PyExc_ValueError
,
2682 "attempt to assign sequence of "
2683 "size %zd to extended slice of "
2685 PySequence_Fast_GET_SIZE(seq
),
2696 garbage
= (PyObject
**)
2697 PyMem_MALLOC(slicelength
*sizeof(PyObject
*));
2704 selfitems
= self
->ob_item
;
2705 seqitems
= PySequence_Fast_ITEMS(seq
);
2706 for (cur
= start
, i
= 0; i
< slicelength
;
2708 garbage
[i
] = selfitems
[cur
];
2711 selfitems
[cur
] = ins
;
2714 for (i
= 0; i
< slicelength
; i
++) {
2715 Py_DECREF(garbage
[i
]);
2718 PyMem_FREE(garbage
);
2725 PyErr_Format(PyExc_TypeError
,
2726 "list indices must be integers, not %.200s",
2727 item
->ob_type
->tp_name
);
2732 static PyMappingMethods list_as_mapping
= {
2733 (lenfunc
)list_length
,
2734 (binaryfunc
)list_subscript
,
2735 (objobjargproc
)list_ass_subscript
2738 PyTypeObject PyList_Type
= {
2739 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
2741 sizeof(PyListObject
),
2743 (destructor
)list_dealloc
, /* tp_dealloc */
2744 (printfunc
)list_print
, /* tp_print */
2748 (reprfunc
)list_repr
, /* tp_repr */
2749 0, /* tp_as_number */
2750 &list_as_sequence
, /* tp_as_sequence */
2751 &list_as_mapping
, /* tp_as_mapping */
2752 (hashfunc
)PyObject_HashNotImplemented
, /* tp_hash */
2755 PyObject_GenericGetAttr
, /* tp_getattro */
2756 0, /* tp_setattro */
2757 0, /* tp_as_buffer */
2758 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
2759 Py_TPFLAGS_BASETYPE
| Py_TPFLAGS_LIST_SUBCLASS
, /* tp_flags */
2760 list_doc
, /* tp_doc */
2761 (traverseproc
)list_traverse
, /* tp_traverse */
2762 (inquiry
)list_clear
, /* tp_clear */
2763 list_richcompare
, /* tp_richcompare */
2764 0, /* tp_weaklistoffset */
2765 list_iter
, /* tp_iter */
2766 0, /* tp_iternext */
2767 list_methods
, /* tp_methods */
2772 0, /* tp_descr_get */
2773 0, /* tp_descr_set */
2774 0, /* tp_dictoffset */
2775 (initproc
)list_init
, /* tp_init */
2776 PyType_GenericAlloc
, /* tp_alloc */
2777 PyType_GenericNew
, /* tp_new */
2778 PyObject_GC_Del
, /* tp_free */
2782 /*********************** List Iterator **************************/
2787 PyListObject
*it_seq
; /* Set to NULL when iterator is exhausted */
2790 static PyObject
*list_iter(PyObject
*);
2791 static void listiter_dealloc(listiterobject
*);
2792 static int listiter_traverse(listiterobject
*, visitproc
, void *);
2793 static PyObject
*listiter_next(listiterobject
*);
2794 static PyObject
*listiter_len(listiterobject
*);
2796 PyDoc_STRVAR(length_hint_doc
, "Private method returning an estimate of len(list(it)).");
2798 static PyMethodDef listiter_methods
[] = {
2799 {"__length_hint__", (PyCFunction
)listiter_len
, METH_NOARGS
, length_hint_doc
},
2800 {NULL
, NULL
} /* sentinel */
2803 PyTypeObject PyListIter_Type
= {
2804 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
2805 "listiterator", /* tp_name */
2806 sizeof(listiterobject
), /* tp_basicsize */
2807 0, /* tp_itemsize */
2809 (destructor
)listiter_dealloc
, /* tp_dealloc */
2815 0, /* tp_as_number */
2816 0, /* tp_as_sequence */
2817 0, /* tp_as_mapping */
2821 PyObject_GenericGetAttr
, /* tp_getattro */
2822 0, /* tp_setattro */
2823 0, /* tp_as_buffer */
2824 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
2826 (traverseproc
)listiter_traverse
, /* tp_traverse */
2828 0, /* tp_richcompare */
2829 0, /* tp_weaklistoffset */
2830 PyObject_SelfIter
, /* tp_iter */
2831 (iternextfunc
)listiter_next
, /* tp_iternext */
2832 listiter_methods
, /* tp_methods */
2838 list_iter(PyObject
*seq
)
2842 if (!PyList_Check(seq
)) {
2843 PyErr_BadInternalCall();
2846 it
= PyObject_GC_New(listiterobject
, &PyListIter_Type
);
2851 it
->it_seq
= (PyListObject
*)seq
;
2852 _PyObject_GC_TRACK(it
);
2853 return (PyObject
*)it
;
2857 listiter_dealloc(listiterobject
*it
)
2859 _PyObject_GC_UNTRACK(it
);
2860 Py_XDECREF(it
->it_seq
);
2861 PyObject_GC_Del(it
);
2865 listiter_traverse(listiterobject
*it
, visitproc visit
, void *arg
)
2867 Py_VISIT(it
->it_seq
);
2872 listiter_next(listiterobject
*it
)
2881 assert(PyList_Check(seq
));
2883 if (it
->it_index
< PyList_GET_SIZE(seq
)) {
2884 item
= PyList_GET_ITEM(seq
, it
->it_index
);
2896 listiter_len(listiterobject
*it
)
2900 len
= PyList_GET_SIZE(it
->it_seq
) - it
->it_index
;
2902 return PyInt_FromSsize_t(len
);
2904 return PyInt_FromLong(0);
2906 /*********************** List Reverse Iterator **************************/
2910 Py_ssize_t it_index
;
2911 PyListObject
*it_seq
; /* Set to NULL when iterator is exhausted */
2912 } listreviterobject
;
2914 static PyObject
*list_reversed(PyListObject
*, PyObject
*);
2915 static void listreviter_dealloc(listreviterobject
*);
2916 static int listreviter_traverse(listreviterobject
*, visitproc
, void *);
2917 static PyObject
*listreviter_next(listreviterobject
*);
2918 static PyObject
*listreviter_len(listreviterobject
*);
2920 static PyMethodDef listreviter_methods
[] = {
2921 {"__length_hint__", (PyCFunction
)listreviter_len
, METH_NOARGS
, length_hint_doc
},
2922 {NULL
, NULL
} /* sentinel */
2925 PyTypeObject PyListRevIter_Type
= {
2926 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
2927 "listreverseiterator", /* tp_name */
2928 sizeof(listreviterobject
), /* tp_basicsize */
2929 0, /* tp_itemsize */
2931 (destructor
)listreviter_dealloc
, /* tp_dealloc */
2937 0, /* tp_as_number */
2938 0, /* tp_as_sequence */
2939 0, /* tp_as_mapping */
2943 PyObject_GenericGetAttr
, /* tp_getattro */
2944 0, /* tp_setattro */
2945 0, /* tp_as_buffer */
2946 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
,/* tp_flags */
2948 (traverseproc
)listreviter_traverse
, /* tp_traverse */
2950 0, /* tp_richcompare */
2951 0, /* tp_weaklistoffset */
2952 PyObject_SelfIter
, /* tp_iter */
2953 (iternextfunc
)listreviter_next
, /* tp_iternext */
2954 listreviter_methods
, /* tp_methods */
2959 list_reversed(PyListObject
*seq
, PyObject
*unused
)
2961 listreviterobject
*it
;
2963 it
= PyObject_GC_New(listreviterobject
, &PyListRevIter_Type
);
2966 assert(PyList_Check(seq
));
2967 it
->it_index
= PyList_GET_SIZE(seq
) - 1;
2970 PyObject_GC_Track(it
);
2971 return (PyObject
*)it
;
2975 listreviter_dealloc(listreviterobject
*it
)
2977 PyObject_GC_UnTrack(it
);
2978 Py_XDECREF(it
->it_seq
);
2979 PyObject_GC_Del(it
);
2983 listreviter_traverse(listreviterobject
*it
, visitproc visit
, void *arg
)
2985 Py_VISIT(it
->it_seq
);
2990 listreviter_next(listreviterobject
*it
)
2993 Py_ssize_t index
= it
->it_index
;
2994 PyListObject
*seq
= it
->it_seq
;
2996 if (index
>=0 && index
< PyList_GET_SIZE(seq
)) {
2997 item
= PyList_GET_ITEM(seq
, index
);
3011 listreviter_len(listreviterobject
*it
)
3013 Py_ssize_t len
= it
->it_index
+ 1;
3014 if (it
->it_seq
== NULL
|| PyList_GET_SIZE(it
->it_seq
) < len
)
3016 return PyLong_FromSsize_t(len
);