annotate Objects/listobject.c @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents d63a80abfbec
children a7ec0a1b0f7c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 /* List object implementation */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
3 #include "Python.h"
75875
f34ac2e9d5cf Issue #14387: Do not include accu.h from Python.h.
Antoine Pitrou <solipsis@pitrou.net>
parents: 73408
diff changeset
4 #include "accu.h"
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
5
1836
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
6 #ifdef STDC_HEADERS
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
7 #include <stddef.h>
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
8 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
9 #include <sys/types.h> /* For size_t */
1836
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
10 #endif
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
32868
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
12 /* Ensure ob_item has room for at least newsize elements, and set
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
13 * ob_size to newsize. If newsize > ob_size on entry, the content
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
14 * of the new slots at exit is undefined heap trash; it's the caller's
68585
bf94b6a73fc8 #11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 61467
diff changeset
15 * responsibility to overwrite them with sane values.
32868
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
16 * The number of allocated elements may grow, shrink, or stay the same.
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
17 * Failure is impossible if newsize <= self.allocated on entry, although
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
18 * that partly relies on an assumption that the system realloc() never
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
19 * fails when passed a number of bytes <= the number of bytes last
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
20 * allocated (the C standard doesn't guarantee this, but it's hard to
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
21 * imagine a realloc implementation where it wouldn't be true).
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
22 * Note that self->ob_item may change, and even if newsize is less
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
23 * than ob_size on entry.
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
24 */
2257
ee4c954cd5df round up list item counts to improve realloc performance
Guido van Rossum <guido@python.org>
parents: 2188
diff changeset
25 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
26 list_resize(PyListObject *self, Py_ssize_t newsize)
2257
ee4c954cd5df round up list item counts to improve realloc performance
Guido van Rossum <guido@python.org>
parents: 2188
diff changeset
27 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
28 PyObject **items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
29 size_t new_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
30 Py_ssize_t allocated = self->allocated;
17969
ed8b79c6cb4b roundupsize() and friends: fiddle over-allocation strategy for list
Tim Peters <tim.peters@gmail.com>
parents: 16581
diff changeset
31
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
32 /* Bypass realloc() when a previous overallocation is large enough
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
33 to accommodate the newsize. If the newsize falls lower than half
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
34 the allocated size, then proceed with the realloc() to shrink the list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
35 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
36 if (allocated >= newsize && newsize >= (allocated >> 1)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
37 assert(self->ob_item != NULL || newsize == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
38 Py_SIZE(self) = newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
39 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
40 }
31519
bd0acc42829e * Optimized list appends and pops by making fewer calls the underlying system
Raymond Hettinger <python@rcn.com>
parents: 31390
diff changeset
41
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
42 /* This over-allocates proportional to the list size, making room
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
43 * for additional growth. The over-allocation is mild, but is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
44 * enough to give linear-time amortized behavior over a long
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
45 * sequence of appends() in the presence of a poorly-performing
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
46 * system realloc().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
47 * The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
48 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
49 new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47466
diff changeset
50
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
51 /* check for integer overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
52 if (new_allocated > PY_SIZE_MAX - newsize) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
53 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
54 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
55 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
56 new_allocated += newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
57 }
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47466
diff changeset
58
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
59 if (newsize == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
60 new_allocated = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
61 items = self->ob_item;
72417
99b808c94834 Issue #12973: Fix undefined-behaviour-inducing overflow check in list_repeat.
Mark Dickinson <mdickinson@enthought.com>
parents: 69836
diff changeset
62 if (new_allocated <= (PY_SIZE_MAX / sizeof(PyObject *)))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
63 PyMem_RESIZE(items, PyObject *, new_allocated);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
64 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
65 items = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
66 if (items == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
67 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
68 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
69 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
70 self->ob_item = items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
71 Py_SIZE(self) = newsize;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
72 self->allocated = new_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
73 return 0;
31519
bd0acc42829e * Optimized list appends and pops by making fewer calls the underlying system
Raymond Hettinger <python@rcn.com>
parents: 31390
diff changeset
74 }
2257
ee4c954cd5df round up list item counts to improve realloc performance
Guido van Rossum <guido@python.org>
parents: 2188
diff changeset
75
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
76 /* Debug statistic to compare allocations with reuse through the free list */
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
77 #undef SHOW_ALLOC_COUNT
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
78 #ifdef SHOW_ALLOC_COUNT
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
79 static size_t count_alloc = 0;
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
80 static size_t count_reuse = 0;
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
81
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
82 static void
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
83 show_alloc(void)
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
84 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
85 fprintf(stderr, "List allocations: %" PY_FORMAT_SIZE_T "d\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
86 count_alloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
87 fprintf(stderr, "List reuse through freelist: %" PY_FORMAT_SIZE_T
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
88 "d\n", count_reuse);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
89 fprintf(stderr, "%.2f%% reuse rate\n\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
90 (100.0*count_reuse/(count_alloc+count_reuse)));
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
91 }
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
92 #endif
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
93
31982
51a5fb60934d SF patch #947476: Apply freelist technique to lists
Raymond Hettinger <python@rcn.com>
parents: 31907
diff changeset
94 /* Empty list reuse scheme to save calls to malloc and free */
45192
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45061
diff changeset
95 #ifndef PyList_MAXFREELIST
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45061
diff changeset
96 #define PyList_MAXFREELIST 80
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45061
diff changeset
97 #endif
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45061
diff changeset
98 static PyListObject *free_list[PyList_MAXFREELIST];
142a11b3057e Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60568-60598,60600-60616 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45061
diff changeset
99 static int numfree = 0;
31982
51a5fb60934d SF patch #947476: Apply freelist technique to lists
Raymond Hettinger <python@rcn.com>
parents: 31907
diff changeset
100
73551
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
101 int
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
102 PyList_ClearFreeList(void)
33679
55fba88930bc Finalize the freelist of list objects.
Raymond Hettinger <python@rcn.com>
parents: 33589
diff changeset
103 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
104 PyListObject *op;
73551
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
105 int ret = numfree;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
106 while (numfree) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
107 op = free_list[--numfree];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
108 assert(PyList_CheckExact(op));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
109 PyObject_GC_Del(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
110 }
73551
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
111 return ret;
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
112 }
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
113
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
114 void
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
115 PyList_Fini(void)
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
116 {
910986542a75 Issue #13389: Full garbage collection passes now clear the freelists for
Antoine Pitrou <solipsis@pitrou.net>
parents: 73409
diff changeset
117 PyList_ClearFreeList();
33679
55fba88930bc Finalize the freelist of list objects.
Raymond Hettinger <python@rcn.com>
parents: 33589
diff changeset
118 }
55fba88930bc Finalize the freelist of list objects.
Raymond Hettinger <python@rcn.com>
parents: 33589
diff changeset
119
77577
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
120 /* Print summary info about the state of the optimized allocator */
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
121 void
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
122 _PyList_DebugMallocStats(FILE *out)
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
123 {
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
124 _PyDebugAllocatorStats(out,
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
125 "free PyListObject",
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
126 numfree, sizeof(PyListObject));
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
127 }
d63a80abfbec Issue #14785: Add sys._debugmallocstats() to help debug low-level memory allocation issues
David Malcolm <dmalcolm@redhat.com>
parents: 76105
diff changeset
128
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
129 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
130 PyList_New(Py_ssize_t size)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
132 PyListObject *op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
133 size_t nbytes;
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
134 #ifdef SHOW_ALLOC_COUNT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
135 static int initialized = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
136 if (!initialized) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
137 Py_AtExit(show_alloc);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
138 initialized = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
139 }
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
140 #endif
32848
e3a35fbce8ec PyList_New(): we went to all the trouble of computing and bounds-checking
Tim Peters <tim.peters@gmail.com>
parents: 32695
diff changeset
141
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
142 if (size < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
143 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
144 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
145 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
146 /* Check for overflow without an actual overflow,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
147 * which can cause compiler to optimise out */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
148 if ((size_t)size > PY_SIZE_MAX / sizeof(PyObject *))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
149 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
150 nbytes = size * sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
151 if (numfree) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
152 numfree--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
153 op = free_list[numfree];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
154 _Py_NewReference((PyObject *)op);
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
155 #ifdef SHOW_ALLOC_COUNT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
156 count_reuse++;
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
157 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
158 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
159 op = PyObject_GC_New(PyListObject, &PyList_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
160 if (op == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
161 return NULL;
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
162 #ifdef SHOW_ALLOC_COUNT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
163 count_alloc++;
45244
2a821e001a2b Merged revisions 60481,60485,60489-60492,60494-60496,60498-60499,60501-60503,60505-60506,60508-60509,60523-60524,60532,60543,60545,60547-60548,60552,60554,60556-60559,60561-60562,60569,60571-60572,60574,60576-60583,60585-60586,60589,60591,60594-60595,60597-60598,60600-60601,60606-60612,60615,60617-60678 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45192
diff changeset
164 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
165 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
166 if (size <= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
167 op->ob_item = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
168 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
169 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
170 if (op->ob_item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
171 Py_DECREF(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
172 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
173 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
174 memset(op->ob_item, 0, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
175 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
176 Py_SIZE(op) = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
177 op->allocated = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
178 _PyObject_GC_TRACK(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
179 return (PyObject *) op;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
182 Py_ssize_t
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
183 PyList_Size(PyObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
185 if (!PyList_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
186 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
187 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
188 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
189 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
190 return Py_SIZE(op);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
31983
Raymond Hettinger <python@rcn.com>
parents: 31982
diff changeset
193 static PyObject *indexerr = NULL;
3985
011cfe7490eb Use pre-created string objects for most common exceptions
Guido van Rossum <guido@python.org>
parents: 2827
diff changeset
194
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
195 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
196 PyList_GetItem(PyObject *op, Py_ssize_t i)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
198 if (!PyList_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
199 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
200 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
201 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
202 if (i < 0 || i >= Py_SIZE(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
203 if (indexerr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
204 indexerr = PyUnicode_FromString(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
205 "list index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
206 if (indexerr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
207 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
208 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
209 PyErr_SetObject(PyExc_IndexError, indexerr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
210 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
211 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
212 return ((PyListObject *)op) -> ob_item[i];
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
216 PyList_SetItem(register PyObject *op, register Py_ssize_t i,
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
217 register PyObject *newitem)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
219 register PyObject *olditem;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
220 register PyObject **p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
221 if (!PyList_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
222 Py_XDECREF(newitem);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
223 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
224 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
225 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
226 if (i < 0 || i >= Py_SIZE(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
227 Py_XDECREF(newitem);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
228 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
229 "list assignment index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
230 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
231 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
232 p = ((PyListObject *)op) -> ob_item + i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
233 olditem = *p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
234 *p = newitem;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
235 Py_XDECREF(olditem);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
236 return 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
240 ins1(PyListObject *self, Py_ssize_t where, PyObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
242 Py_ssize_t i, n = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
243 PyObject **items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
244 if (v == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
245 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
246 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
247 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
248 if (n == PY_SSIZE_T_MAX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
249 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
250 "cannot add more objects to list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
251 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
252 }
32850
09e633c52730 Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 32848
diff changeset
253
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
254 if (list_resize(self, n+1) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
255 return -1;
31519
bd0acc42829e * Optimized list appends and pops by making fewer calls the underlying system
Raymond Hettinger <python@rcn.com>
parents: 31390
diff changeset
256
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
257 if (where < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
258 where += n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
259 if (where < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
260 where = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
261 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
262 if (where > n)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
263 where = n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
264 items = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
265 for (i = n; --i >= where; )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
266 items[i+1] = items[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
267 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
268 items[where] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
269 return 0;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
273 PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
275 if (!PyList_Check(op)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
276 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
277 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
278 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
279 return ins1((PyListObject *)op, where, newitem);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281
31905
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
282 static int
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
283 app1(PyListObject *self, PyObject *v)
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
284 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
285 Py_ssize_t n = PyList_GET_SIZE(self);
31905
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
286
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
287 assert (v != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
288 if (n == PY_SSIZE_T_MAX) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
289 PyErr_SetString(PyExc_OverflowError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
290 "cannot add more objects to list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
291 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
292 }
31905
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
293
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
294 if (list_resize(self, n+1) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
295 return -1;
31905
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
296
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
297 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
298 PyList_SET_ITEM(self, n, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
299 return 0;
31905
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
300 }
e76092d4902c * Specialize ins1() into app1() for appends. Saves several unnecessary
Raymond Hettinger <python@rcn.com>
parents: 31718
diff changeset
301
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
303 PyList_Append(PyObject *op, PyObject *newitem)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
305 if (PyList_Check(op) && (newitem != NULL))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
306 return app1((PyListObject *)op, newitem);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
307 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
308 return -1;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 /* Methods */
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 static void
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
314 list_dealloc(PyListObject *op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
316 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
317 PyObject_GC_UnTrack(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
318 Py_TRASHCAN_SAFE_BEGIN(op)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
319 if (op->ob_item != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
320 /* Do it backwards, for Christian Tismer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
321 There's a simple test case where somehow this reduces
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
322 thrashing when a *very* large list is created and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
323 immediately deleted. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
324 i = Py_SIZE(op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
325 while (--i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
326 Py_XDECREF(op->ob_item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
327 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
328 PyMem_FREE(op->ob_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
329 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
330 if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
331 free_list[numfree++] = op;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
332 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
333 Py_TYPE(op)->tp_free((PyObject *)op);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
334 Py_TRASHCAN_SAFE_END(op)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
337 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
338 list_repr(PyListObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
340 Py_ssize_t i;
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
341 PyObject *s = NULL;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
342 _PyAccu acc;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
343 static PyObject *sep = NULL;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
344
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
345 if (Py_SIZE(v) == 0) {
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
346 return PyUnicode_FromString("[]");
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
347 }
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
348
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
349 if (sep == NULL) {
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
350 sep = PyUnicode_FromString(", ");
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
351 if (sep == NULL)
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
352 return NULL;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
353 }
7986
971b5bbd92ec Use Py_Repr{Enter,Leave} to display recursive lists in finite space.
Guido van Rossum <guido@python.org>
parents: 7482
diff changeset
354
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
355 i = Py_ReprEnter((PyObject*)v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
356 if (i != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
357 return i > 0 ? PyUnicode_FromString("[...]") : NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
358 }
18129
9d533ae574d2 SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents: 17971
diff changeset
359
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
360 if (_PyAccu_Init(&acc))
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
361 goto error;
18129
9d533ae574d2 SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents: 17971
diff changeset
362
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
363 s = PyUnicode_FromString("[");
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
364 if (s == NULL || _PyAccu_Accumulate(&acc, s))
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
365 goto error;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
366 Py_CLEAR(s);
18129
9d533ae574d2 SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents: 17971
diff changeset
367
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
368 /* Do repr() on each element. Note that this may mutate the list,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
369 so must refetch the list size on each iteration. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
370 for (i = 0; i < Py_SIZE(v); ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
371 if (Py_EnterRecursiveCall(" while getting the repr of a list"))
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
372 goto error;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
373 s = PyObject_Repr(v->ob_item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
374 Py_LeaveRecursiveCall();
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
375 if (i > 0 && _PyAccu_Accumulate(&acc, sep))
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
376 goto error;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
377 if (s == NULL || _PyAccu_Accumulate(&acc, s))
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
378 goto error;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
379 Py_CLEAR(s);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
380 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
381 s = PyUnicode_FromString("]");
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
382 if (s == NULL || _PyAccu_Accumulate(&acc, s))
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
383 goto error;
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
384 Py_CLEAR(s);
18129
9d533ae574d2 SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents: 17971
diff changeset
385
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
386 Py_ReprLeave((PyObject *)v);
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
387 return _PyAccu_Finish(&acc);
18129
9d533ae574d2 SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents: 17971
diff changeset
388
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
389 error:
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
390 _PyAccu_Destroy(&acc);
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
391 Py_XDECREF(s);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
392 Py_ReprLeave((PyObject *)v);
72755
f9f782f2369e Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72417
diff changeset
393 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
396 static Py_ssize_t
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
397 list_length(PyListObject *a)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
399 return Py_SIZE(a);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401
12516
e6e914d5b207 add list_contains and tuplecontains: efficient implementations of tp_contains
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11999
diff changeset
402 static int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
403 list_contains(PyListObject *a, PyObject *el)
12516
e6e914d5b207 add list_contains and tuplecontains: efficient implementations of tp_contains
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11999
diff changeset
404 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
405 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
406 int cmp;
12516
e6e914d5b207 add list_contains and tuplecontains: efficient implementations of tp_contains
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11999
diff changeset
407
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
408 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
409 cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
410 Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
411 return cmp;
12516
e6e914d5b207 add list_contains and tuplecontains: efficient implementations of tp_contains
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11999
diff changeset
412 }
e6e914d5b207 add list_contains and tuplecontains: efficient implementations of tp_contains
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 11999
diff changeset
413
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
414 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
415 list_item(PyListObject *a, Py_ssize_t i)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
417 if (i < 0 || i >= Py_SIZE(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
418 if (indexerr == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
419 indexerr = PyUnicode_FromString(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
420 "list index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
421 if (indexerr == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
422 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
423 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
424 PyErr_SetObject(PyExc_IndexError, indexerr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
425 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
426 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
427 Py_INCREF(a->ob_item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
428 return a->ob_item[i];
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
431 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
432 list_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
434 PyListObject *np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
435 PyObject **src, **dest;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
436 Py_ssize_t i, len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
437 if (ilow < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
438 ilow = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
439 else if (ilow > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
440 ilow = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
441 if (ihigh < ilow)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
442 ihigh = ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
443 else if (ihigh > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
444 ihigh = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
445 len = ihigh - ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
446 np = (PyListObject *) PyList_New(len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
447 if (np == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
448 return NULL;
31621
635eebc473b0 Small optimizations for list_slice() and list_extend_internal().
Raymond Hettinger <python@rcn.com>
parents: 31550
diff changeset
449
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
450 src = a->ob_item + ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
451 dest = np->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
452 for (i = 0; i < len; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
453 PyObject *v = src[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
454 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
455 dest[i] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
456 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
457 return (PyObject *)np;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
460 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
461 PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
462 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
463 if (!PyList_Check(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
464 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
465 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
466 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
467 return list_slice((PyListObject *)a, ilow, ihigh);
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
468 }
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
469
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
470 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
471 list_concat(PyListObject *a, PyObject *bb)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
473 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
474 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
475 PyObject **src, **dest;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
476 PyListObject *np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
477 if (!PyList_Check(bb)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
478 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
479 "can only concatenate list (not \"%.200s\") to list",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
480 bb->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
481 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
482 }
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
483 #define b ((PyListObject *)bb)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
484 size = Py_SIZE(a) + Py_SIZE(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
485 if (size < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
486 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
487 np = (PyListObject *) PyList_New(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
488 if (np == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
489 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
490 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
491 src = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
492 dest = np->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
493 for (i = 0; i < Py_SIZE(a); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
494 PyObject *v = src[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
495 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
496 dest[i] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
497 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
498 src = b->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
499 dest = np->ob_item + Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
500 for (i = 0; i < Py_SIZE(b); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
501 PyObject *v = src[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
502 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
503 dest[i] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
504 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
505 return (PyObject *)np;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 #undef b
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
509 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
510 list_repeat(PyListObject *a, Py_ssize_t n)
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
511 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
512 Py_ssize_t i, j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
513 Py_ssize_t size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
514 PyListObject *np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
515 PyObject **p, **items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
516 PyObject *elem;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
517 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
518 n = 0;
72417
99b808c94834 Issue #12973: Fix undefined-behaviour-inducing overflow check in list_repeat.
Mark Dickinson <mdickinson@enthought.com>
parents: 69836
diff changeset
519 if (n > 0 && Py_SIZE(a) > PY_SSIZE_T_MAX / n)
99b808c94834 Issue #12973: Fix undefined-behaviour-inducing overflow check in list_repeat.
Mark Dickinson <mdickinson@enthought.com>
parents: 69836
diff changeset
520 return PyErr_NoMemory();
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
521 size = Py_SIZE(a) * n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
522 if (size == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
523 return PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
524 np = (PyListObject *) PyList_New(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
525 if (np == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
526 return NULL;
29198
b9762f003f30 SF bug #604716: faster [None]*n or []*n
Raymond Hettinger <python@rcn.com>
parents: 29008
diff changeset
527
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
528 items = np->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
529 if (Py_SIZE(a) == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
530 elem = a->ob_item[0];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
531 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
532 items[i] = elem;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
533 Py_INCREF(elem);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
534 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
535 return (PyObject *) np;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
536 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
537 p = np->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
538 items = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
539 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
540 for (j = 0; j < Py_SIZE(a); j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
541 *p = items[j];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
542 Py_INCREF(*p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
543 p++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
544 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
545 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
546 return (PyObject *) np;
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
547 }
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
548
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549 static int
32858
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
550 list_clear(PyListObject *a)
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
551 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
552 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
553 PyObject **item = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
554 if (item != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
555 /* Because XDECREF can recursively invoke operations on
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
556 this list, we make it empty first. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
557 i = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
558 Py_SIZE(a) = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
559 a->ob_item = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
560 a->allocated = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
561 while (--i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
562 Py_XDECREF(item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
563 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
564 PyMem_FREE(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
565 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
566 /* Never fails; the return value can be ignored.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
567 Note that there is no guarantee that the list is actually empty
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
568 at this point, because XDECREF may have populated it again! */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
569 return 0;
32858
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
570 }
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
571
32874
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
572 /* a[ilow:ihigh] = v if v != NULL.
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
573 * del a[ilow:ihigh] if v == NULL.
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
574 *
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
575 * Special speed gimmick: when v is NULL and ihigh - ilow <= 8, it's
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
576 * guaranteed the call cannot fail.
62c53b8e4aeb list_ass_slice(): Document the obscure new intent that deleting a slice
Tim Peters <tim.peters@gmail.com>
parents: 32869
diff changeset
577 */
32858
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
578 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
579 list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
580 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
581 /* Because [X]DECREF can recursively invoke list operations on
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
582 this list, we must postpone all [X]DECREF activity until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
583 after the list is back in its canonical shape. Therefore
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
584 we must allocate an additional array, 'recycle', into which
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
585 we temporarily copy the items that are deleted from the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
586 list. :-( */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
587 PyObject *recycle_on_stack[8];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
588 PyObject **recycle = recycle_on_stack; /* will allocate more if needed */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
589 PyObject **item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
590 PyObject **vitem = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
591 PyObject *v_as_SF = NULL; /* PySequence_Fast(v) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
592 Py_ssize_t n; /* # of elements in replacement list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
593 Py_ssize_t norig; /* # of elements in list getting replaced */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
594 Py_ssize_t d; /* Change in size */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
595 Py_ssize_t k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
596 size_t s;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
597 int result = -1; /* guilty until proved innocent */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
598 #define b ((PyListObject *)v)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
599 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
600 n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
601 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
602 if (a == b) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
603 /* Special case "a[i:j] = a" -- copy b first */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
604 v = list_slice(b, 0, Py_SIZE(b));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
605 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
606 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
607 result = list_ass_slice(a, ilow, ihigh, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
608 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
609 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
610 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
611 v_as_SF = PySequence_Fast(v, "can only assign an iterable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
612 if(v_as_SF == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
613 goto Error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
614 n = PySequence_Fast_GET_SIZE(v_as_SF);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
615 vitem = PySequence_Fast_ITEMS(v_as_SF);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
616 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
617 if (ilow < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
618 ilow = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
619 else if (ilow > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
620 ilow = Py_SIZE(a);
32868
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
621
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
622 if (ihigh < ilow)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
623 ihigh = ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
624 else if (ihigh > Py_SIZE(a))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
625 ihigh = Py_SIZE(a);
32858
fa0526c30da8 * drop the unreasonable list invariant that ob_item should never come back
Armin Rigo <arigo@tunes.org>
parents: 32857
diff changeset
626
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
627 norig = ihigh - ilow;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
628 assert(norig >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
629 d = n - norig;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
630 if (Py_SIZE(a) + d == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
631 Py_XDECREF(v_as_SF);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
632 return list_clear(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
633 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
634 item = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
635 /* recycle the items that we are about to remove */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
636 s = norig * sizeof(PyObject *);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
637 if (s > sizeof(recycle_on_stack)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
638 recycle = (PyObject **)PyMem_MALLOC(s);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
639 if (recycle == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
640 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
641 goto Error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
642 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
643 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
644 memcpy(recycle, &item[ilow], s);
32868
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
645
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
646 if (d < 0) { /* Delete -d items */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
647 memmove(&item[ihigh+d], &item[ihigh],
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
648 (Py_SIZE(a) - ihigh)*sizeof(PyObject *));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
649 list_resize(a, Py_SIZE(a) + d);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
650 item = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
651 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
652 else if (d > 0) { /* Insert d items */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
653 k = Py_SIZE(a);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
654 if (list_resize(a, k+d) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
655 goto Error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
656 item = a->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
657 memmove(&item[ihigh+d], &item[ihigh],
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
658 (k - ihigh)*sizeof(PyObject *));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
659 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
660 for (k = 0; k < n; k++, ilow++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
661 PyObject *w = vitem[k];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
662 Py_XINCREF(w);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
663 item[ilow] = w;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
664 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
665 for (k = norig - 1; k >= 0; --k)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
666 Py_XDECREF(recycle[k]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
667 result = 0;
32868
bd46e6f80623 Armin asked for a list_ass_slice review in his checkin, so here's the
Tim Peters <tim.peters@gmail.com>
parents: 32861
diff changeset
668 Error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
669 if (recycle != recycle_on_stack)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
670 PyMem_FREE(recycle);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
671 Py_XDECREF(v_as_SF);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
672 return result;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
673 #undef b
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
674 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
675
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
676 int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
677 PyList_SetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
678 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
679 if (!PyList_Check(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
680 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
681 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
682 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
683 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
1313
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
684 }
6ee380349c84 * Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents: 1211
diff changeset
685
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
686 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
687 list_inplace_repeat(PyListObject *self, Py_ssize_t n)
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
688 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
689 PyObject **items;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
690 Py_ssize_t size, i, j, p;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
691
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
692
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
693 size = PyList_GET_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
694 if (size == 0 || n == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
695 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
696 return (PyObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
697 }
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
698
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
699 if (n < 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
700 (void)list_clear(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
701 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
702 return (PyObject *)self;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
703 }
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
704
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
705 if (size > PY_SSIZE_T_MAX / n) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
706 return PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
707 }
44999
7c02182e2979 Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 44351
diff changeset
708
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
709 if (list_resize(self, size*n) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
710 return NULL;
31519
bd0acc42829e * Optimized list appends and pops by making fewer calls the underlying system
Raymond Hettinger <python@rcn.com>
parents: 31390
diff changeset
711
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
712 p = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
713 items = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
714 for (i = 1; i < n; i++) { /* Start counting at 1, not 0 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
715 for (j = 0; j < size; j++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
716 PyObject *o = items[j];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
717 Py_INCREF(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
718 items[p++] = o;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
719 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
720 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
721 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
722 return (PyObject *)self;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
723 }
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
724
167
3fa2b14be270 Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents: 155
diff changeset
725 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
726 list_ass_item(PyListObject *a, Py_ssize_t i, PyObject *v)
167
3fa2b14be270 Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents: 155
diff changeset
727 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
728 PyObject *old_value;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
729 if (i < 0 || i >= Py_SIZE(a)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
730 PyErr_SetString(PyExc_IndexError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
731 "list assignment index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
732 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
733 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
734 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
735 return list_ass_slice(a, i, i+1, v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
736 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
737 old_value = a->ob_item[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
738 a->ob_item[i] = v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
739 Py_DECREF(old_value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
740 return 0;
167
3fa2b14be270 Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents: 155
diff changeset
741 }
3fa2b14be270 Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents: 155
diff changeset
742
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
743 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
744 listinsert(PyListObject *self, PyObject *args)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
745 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
746 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
747 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
748 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
749 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
750 if (ins1(self, i, v) == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
751 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
752 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
753 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
755 static PyObject *
68129
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
756 listclear(PyListObject *self)
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
757 {
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
758 list_clear(self);
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
759 Py_RETURN_NONE;
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
760 }
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
761
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
762 static PyObject *
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
763 listcopy(PyListObject *self)
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
764 {
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
765 return list_slice(self, 0, Py_SIZE(self));
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
766 }
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
767
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
768 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
769 listappend(PyListObject *self, PyObject *v)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
770 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
771 if (app1(self, v) == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
772 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
773 return NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
774 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
775
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
776 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
777 listextend(PyListObject *self, PyObject *b)
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
778 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
779 PyObject *it; /* iter(v) */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
780 Py_ssize_t m; /* size of self */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
781 Py_ssize_t n; /* guess for size of b */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
782 Py_ssize_t mn; /* m + n */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
783 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
784 PyObject *(*iternext)(PyObject *);
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
785
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
786 /* Special cases:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
787 1) lists and tuples which can use PySequence_Fast ops
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
788 2) extending self to self requires making a copy first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
789 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
790 if (PyList_CheckExact(b) || PyTuple_CheckExact(b) || (PyObject *)self == b) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
791 PyObject **src, **dest;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
792 b = PySequence_Fast(b, "argument must be iterable");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
793 if (!b)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
794 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
795 n = PySequence_Fast_GET_SIZE(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
796 if (n == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
797 /* short circuit when b is empty */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
798 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
799 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
800 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
801 m = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
802 if (list_resize(self, m + n) == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
803 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
804 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
805 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
806 /* note that we may still have self == b here for the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
807 * situation a.extend(a), but the following code works
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
808 * in that case too. Just make sure to resize self
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
809 * before calling PySequence_Fast_ITEMS.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
810 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
811 /* populate the end of self with b's items */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
812 src = PySequence_Fast_ITEMS(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
813 dest = self->ob_item + m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
814 for (i = 0; i < n; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
815 PyObject *o = src[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
816 Py_INCREF(o);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
817 dest[i] = o;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
818 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
819 Py_DECREF(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
820 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
821 }
31528
1233bd95da1a Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents: 31527
diff changeset
822
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
823 it = PyObject_GetIter(b);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
824 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
825 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
826 iternext = *it->ob_type->tp_iternext;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
827
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
828 /* Guess a result list size. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
829 n = _PyObject_LengthHint(b, 8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
830 if (n == -1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
831 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
832 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
833 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
834 m = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
835 mn = m + n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
836 if (mn >= m) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
837 /* Make room. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
838 if (list_resize(self, mn) == -1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
839 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
840 /* Make the list sane again. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
841 Py_SIZE(self) = m;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
842 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
843 /* Else m + n overflowed; on the chance that n lied, and there really
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
844 * is enough room, ignore it. If n was telling the truth, we'll
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
845 * eventually run out of memory during the loop.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
846 */
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
847
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
848 /* Run iterator to exhaustion. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
849 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
850 PyObject *item = iternext(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
851 if (item == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
852 if (PyErr_Occurred()) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
853 if (PyErr_ExceptionMatches(PyExc_StopIteration))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
854 PyErr_Clear();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
855 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
856 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
857 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
858 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
859 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
860 if (Py_SIZE(self) < self->allocated) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
861 /* steals ref */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
862 PyList_SET_ITEM(self, Py_SIZE(self), item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
863 ++Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
864 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
865 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
866 int status = app1(self, item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
867 Py_DECREF(item); /* append creates a new ref */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
868 if (status < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
869 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
870 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
871 }
31528
1233bd95da1a Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents: 31527
diff changeset
872
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
873 /* Cut back result list if initial guess was too large. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
874 if (Py_SIZE(self) < self->allocated)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
875 list_resize(self, Py_SIZE(self)); /* shrinking can't fail */
33589
23036c7af687 Checkin Tim's fix to an error discussed on python-dev.
Raymond Hettinger <python@rcn.com>
parents: 33464
diff changeset
876
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
877 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
878 Py_RETURN_NONE;
31528
1233bd95da1a Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents: 31527
diff changeset
879
1233bd95da1a Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents: 31527
diff changeset
880 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
881 Py_DECREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
882 return NULL;
14161
52fd496d3532 Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents: 14125
diff changeset
883 }
9317
003b42c9f24d listextend(): New method which implements L.extend(L2).
Barry Warsaw <barry@python.org>
parents: 9275
diff changeset
884
31642
30e305bfdddb Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents: 31641
diff changeset
885 PyObject *
30e305bfdddb Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents: 31641
diff changeset
886 _PyList_Extend(PyListObject *self, PyObject *b)
30e305bfdddb Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents: 31641
diff changeset
887 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
888 return listextend(self, b);
31642
30e305bfdddb Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents: 31641
diff changeset
889 }
30e305bfdddb Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents: 31641
diff changeset
890
9317
003b42c9f24d listextend(): New method which implements L.extend(L2).
Barry Warsaw <barry@python.org>
parents: 9275
diff changeset
891 static PyObject *
31641
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
892 list_inplace_concat(PyListObject *self, PyObject *other)
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
893 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
894 PyObject *result;
31641
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
895
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
896 result = listextend(self, other);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
897 if (result == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
898 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
899 Py_DECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
900 Py_INCREF(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
901 return (PyObject *)self;
31641
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
902 }
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
903
eea674bf7b59 list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents: 31636
diff changeset
904 static PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
905 listpop(PyListObject *self, PyObject *args)
8595
635c3d94a948 Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents: 8515
diff changeset
906 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
907 Py_ssize_t i = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
908 PyObject *v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
909 int status;
31544
72e970c0accc Double the speed of list.pop() which was spending most of its time parsing
Raymond Hettinger <python@rcn.com>
parents: 31528
diff changeset
910
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
911 if (!PyArg_ParseTuple(args, "|n:pop", &i))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
912 return NULL;
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39658
diff changeset
913
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
914 if (Py_SIZE(self) == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
915 /* Special-case most common failure cause */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
916 PyErr_SetString(PyExc_IndexError, "pop from empty list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
917 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
918 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
919 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
920 i += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
921 if (i < 0 || i >= Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
922 PyErr_SetString(PyExc_IndexError, "pop index out of range");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
923 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
924 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
925 v = self->ob_item[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
926 if (i == Py_SIZE(self) - 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
927 status = list_resize(self, Py_SIZE(self) - 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
928 assert(status >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
929 return v; /* and v now owns the reference the list had */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
930 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
931 Py_INCREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
932 status = list_ass_slice(self, i, i+1, (PyObject *)NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
933 assert(status >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
934 /* Use status, so that in a release build compilers don't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
935 * complain about the unused name.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
936 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
937 (void) status;
33053
1af3ad49d06f Previous commit was viewed as "perverse". Changed to just cast the unused
Brett Cannon <bcannon@gmail.com>
parents: 32908
diff changeset
938
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
939 return v;
8595
635c3d94a948 Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents: 8515
diff changeset
940 }
635c3d94a948 Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents: 8515
diff changeset
941
24309
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
942 /* Reverse a slice of a list in place, from lo up to (exclusive) hi. */
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
943 static void
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
944 reverse_slice(PyObject **lo, PyObject **hi)
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
945 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
946 assert(lo && hi);
24309
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
947
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
948 --hi;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
949 while (lo < hi) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
950 PyObject *t = *lo;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
951 *lo = *hi;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
952 *hi = t;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
953 ++lo;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
954 --hi;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
955 }
24309
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
956 }
08d307cbccd9 Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents: 24280
diff changeset
957
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
958 /* Lots of code for an adaptive, stable, natural mergesort. There are many
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
959 * pieces to this algorithm; read listsort.txt for overviews and details.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
960 */
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
961
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
962 /* A sortslice contains a pointer to an array of keys and a pointer to
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
963 * an array of corresponding values. In other words, keys[i]
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
964 * corresponds with values[i]. If values == NULL, then the keys are
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
965 * also the values.
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
966 *
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
967 * Several convenience routines are provided here, so that keys and
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
968 * values are always moved in sync.
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
969 */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
970
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
971 typedef struct {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
972 PyObject **keys;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
973 PyObject **values;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
974 } sortslice;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
975
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
976 Py_LOCAL_INLINE(void)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
977 sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
978 {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
979 s1->keys[i] = s2->keys[j];
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
980 if (s1->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
981 s1->values[i] = s2->values[j];
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
982 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
983
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
984 Py_LOCAL_INLINE(void)
66617
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
985 sortslice_copy_incr(sortslice *dst, sortslice *src)
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
986 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
987 *dst->keys++ = *src->keys++;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
988 if (dst->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
989 *dst->values++ = *src->values++;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
990 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
991
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
992 Py_LOCAL_INLINE(void)
66617
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
993 sortslice_copy_decr(sortslice *dst, sortslice *src)
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
994 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
995 *dst->keys-- = *src->keys--;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
996 if (dst->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
997 *dst->values-- = *src->values--;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
998 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
999
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1000
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1001 Py_LOCAL_INLINE(void)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1002 sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
66617
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1003 Py_ssize_t n)
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1004 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1005 memcpy(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1006 if (s1->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1007 memcpy(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1008 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1009
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1010 Py_LOCAL_INLINE(void)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1011 sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j,
66617
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1012 Py_ssize_t n)
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1013 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1014 memmove(&s1->keys[i], &s2->keys[j], sizeof(PyObject *) * n);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1015 if (s1->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1016 memmove(&s1->values[i], &s2->values[j], sizeof(PyObject *) * n);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1017 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1018
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1019 Py_LOCAL_INLINE(void)
66617
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1020 sortslice_advance(sortslice *slice, Py_ssize_t n)
996f84e505be code style
Benjamin Peterson <benjamin@python.org>
parents: 66608
diff changeset
1021 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1022 slice->keys += n;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1023 if (slice->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1024 slice->values += n;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1025 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1026
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1027 /* Comparison function: PyObject_RichCompareBool with Py_LT.
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1028 * Returns -1 on error, 1 if x < y, 0 if x >= y.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1029 */
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1030
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1031 #define ISLT(X, Y) (PyObject_RichCompareBool(X, Y, Py_LT))
24540
614358e3c4f6 Sped the usual case for sorting by calling PyObject_RichCompareBool
Tim Peters <tim.peters@gmail.com>
parents: 24515
diff changeset
1032
614358e3c4f6 Sped the usual case for sorting by calling PyObject_RichCompareBool
Tim Peters <tim.peters@gmail.com>
parents: 24515
diff changeset
1033 /* Compare X to Y via "<". Goto "fail" if the comparison raises an
24311
a353d6a45276 Cleanup yielding a small speed boost: before rich comparisons were
Tim Peters <tim.peters@gmail.com>
parents: 24310
diff changeset
1034 error. Else "k" is set to true iff X<Y, and an "if (k)" block is
a353d6a45276 Cleanup yielding a small speed boost: before rich comparisons were
Tim Peters <tim.peters@gmail.com>
parents: 24310
diff changeset
1035 started. It makes more sense in context <wink>. X and Y are PyObject*s.
a353d6a45276 Cleanup yielding a small speed boost: before rich comparisons were
Tim Peters <tim.peters@gmail.com>
parents: 24310
diff changeset
1036 */
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1037 #define IFLT(X, Y) if ((k = ISLT(X, Y)) < 0) goto fail; \
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1038 if (k)
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1039
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1040 /* binarysort is the best method for sorting small arrays: it does
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1041 few compares, but can do data movement quadratic in the number of
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1042 elements.
8515
16b3a121ff77 Minor cleanup by Tim after my changes:
Guido van Rossum <guido@python.org>
parents: 8511
diff changeset
1043 [lo, hi) is a contiguous slice of a list, and is sorted via
24311
a353d6a45276 Cleanup yielding a small speed boost: before rich comparisons were
Tim Peters <tim.peters@gmail.com>
parents: 24310
diff changeset
1044 binary insertion. This sort is stable.
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1045 On entry, must have lo <= start <= hi, and that [lo, start) is already
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1046 sorted (pass start == lo if you don't know!).
24311
a353d6a45276 Cleanup yielding a small speed boost: before rich comparisons were
Tim Peters <tim.peters@gmail.com>
parents: 24310
diff changeset
1047 If islt() complains return -1, else 0.
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1048 Even in case of error, the output slice will be some permutation of
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1049 the input (nothing is lost or duplicated).
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1050 */
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1051 static int
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1052 binarysort(sortslice lo, PyObject **hi, PyObject **start)
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1053 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1054 register Py_ssize_t k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1055 register PyObject **l, **p, **r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1056 register PyObject *pivot;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1057
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1058 assert(lo.keys <= start && start <= hi);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1059 /* assert [lo, start) is sorted */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1060 if (lo.keys == start)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1061 ++start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1062 for (; start < hi; ++start) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1063 /* set l to where *start belongs */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1064 l = lo.keys;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1065 r = start;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1066 pivot = *r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1067 /* Invariants:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1068 * pivot >= all in [lo, l).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1069 * pivot < all in [r, start).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1070 * The second is vacuously true at the start.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1071 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1072 assert(l < r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1073 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1074 p = l + ((r - l) >> 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1075 IFLT(pivot, *p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1076 r = p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1077 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1078 l = p+1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1079 } while (l < r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1080 assert(l == r);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1081 /* The invariants still hold, so pivot >= all in [lo, l) and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1082 pivot < all in [l, start), so pivot belongs at l. Note
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1083 that if there are elements equal to pivot, l points to the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1084 first slot after them -- that's why this sort is stable.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1085 Slide over to make room.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1086 Caution: using memmove is much slower under MSVC 5;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1087 we're not usually moving many slots. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1088 for (p = start; p > l; --p)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1089 *p = *(p-1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1090 *l = pivot;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1091 if (lo.values != NULL) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1092 Py_ssize_t offset = lo.values - lo.keys;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1093 p = start + offset;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1094 pivot = *p;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1095 l += offset;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1096 for (p = start + offset; p > l; --p)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1097 *p = *(p-1);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1098 *l = pivot;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1099 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1100 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1101 return 0;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1102
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1103 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1104 return -1;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1105 }
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1106
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1107 /*
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1108 Return the length of the run beginning at lo, in the slice [lo, hi). lo < hi
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1109 is required on entry. "A run" is the longest ascending sequence, with
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1110
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1111 lo[0] <= lo[1] <= lo[2] <= ...
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1112
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1113 or the longest descending sequence, with
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
1114
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1115 lo[0] > lo[1] > lo[2] > ...
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1116
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1117 Boolean *descending is set to 0 in the former case, or to 1 in the latter.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1118 For its intended use in a stable mergesort, the strictness of the defn of
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1119 "descending" is needed so that the caller can safely reverse a descending
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1120 sequence without violating stability (strict > ensures there are no equal
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1121 elements to get out of order).
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1122
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1123 Returns -1 in case of error.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1124 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1125 static Py_ssize_t
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1126 count_run(PyObject **lo, PyObject **hi, int *descending)
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1127 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1128 Py_ssize_t k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1129 Py_ssize_t n;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1130
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1131 assert(lo < hi);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1132 *descending = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1133 ++lo;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1134 if (lo == hi)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1135 return 1;
8457
af48887c9717 Tim's revision of the previous patch. He also added some sparts to
Guido van Rossum <guido@python.org>
parents: 8440
diff changeset
1136
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1137 n = 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1138 IFLT(*lo, *(lo-1)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1139 *descending = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1140 for (lo = lo+1; lo < hi; ++lo, ++n) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1141 IFLT(*lo, *(lo-1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1142 ;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1143 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1144 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1145 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1146 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1147 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1148 for (lo = lo+1; lo < hi; ++lo, ++n) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1149 IFLT(*lo, *(lo-1))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1150 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1151 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1152 }
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1153
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1154 return n;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1155 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1156 return -1;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1157 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1158
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1159 /*
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1160 Locate the proper position of key in a sorted vector; if the vector contains
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1161 an element equal to key, return the position immediately to the left of
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1162 the leftmost equal element. [gallop_right() does the same except returns
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1163 the position to the right of the rightmost equal element (if any).]
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1164
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1165 "a" is a sorted vector with n elements, starting at a[0]. n must be > 0.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1166
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1167 "hint" is an index at which to begin the search, 0 <= hint < n. The closer
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1168 hint is to the final result, the faster this runs.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1169
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1170 The return value is the int k in 0..n such that
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1171
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1172 a[k-1] < key <= a[k]
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1173
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1174 pretending that *(a-1) is minus infinity and a[n] is plus infinity. IOW,
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1175 key belongs at index k; or, IOW, the first k elements of a should precede
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1176 key, and the last n-k should follow key.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1177
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1178 Returns -1 on error. See listsort.txt for info on the method.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1179 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1180 static Py_ssize_t
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1181 gallop_left(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1182 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1183 Py_ssize_t ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1184 Py_ssize_t lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1185 Py_ssize_t k;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1186
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1187 assert(key && a && n > 0 && hint >= 0 && hint < n);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1188
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1189 a += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1190 lastofs = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1191 ofs = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1192 IFLT(*a, key) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1193 /* a[hint] < key -- gallop right, until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1194 * a[hint + lastofs] < key <= a[hint + ofs]
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1195 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1196 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1197 while (ofs < maxofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1198 IFLT(a[ofs], key) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1199 lastofs = ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1200 ofs = (ofs << 1) + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1201 if (ofs <= 0) /* int overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1202 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1203 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1204 else /* key <= a[hint + ofs] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1205 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1206 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1207 if (ofs > maxofs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1208 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1209 /* Translate back to offsets relative to &a[0]. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1210 lastofs += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1211 ofs += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1212 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1213 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1214 /* key <= a[hint] -- gallop left, until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1215 * a[hint - ofs] < key <= a[hint - lastofs]
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1216 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1217 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1218 while (ofs < maxofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1219 IFLT(*(a-ofs), key)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1220 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1221 /* key <= a[hint - ofs] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1222 lastofs = ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1223 ofs = (ofs << 1) + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1224 if (ofs <= 0) /* int overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1225 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1226 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1227 if (ofs > maxofs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1228 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1229 /* Translate back to positive offsets relative to &a[0]. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1230 k = lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1231 lastofs = hint - ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1232 ofs = hint - k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1233 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1234 a -= hint;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1235
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1236 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1237 /* Now a[lastofs] < key <= a[ofs], so key belongs somewhere to the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1238 * right of lastofs but no farther right than ofs. Do a binary
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1239 * search, with invariant a[lastofs-1] < key <= a[ofs].
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1240 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1241 ++lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1242 while (lastofs < ofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1243 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1244
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1245 IFLT(a[m], key)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1246 lastofs = m+1; /* a[m] < key */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1247 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1248 ofs = m; /* key <= a[m] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1249 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1250 assert(lastofs == ofs); /* so a[ofs-1] < key <= a[ofs] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1251 return ofs;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1252
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1253 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1254 return -1;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1255 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1256
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1257 /*
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1258 Exactly like gallop_left(), except that if key already exists in a[0:n],
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1259 finds the position immediately to the right of the rightmost equal value.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1260
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1261 The return value is the int k in 0..n such that
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1262
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1263 a[k-1] <= key < a[k]
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1264
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1265 or -1 if error.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1266
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1267 The code duplication is massive, but this is enough different given that
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1268 we're sticking to "<" comparisons that it's much harder to follow if
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1269 written as one routine with yet another "left or right?" flag.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1270 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1271 static Py_ssize_t
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 44999
diff changeset
1272 gallop_right(PyObject *key, PyObject **a, Py_ssize_t n, Py_ssize_t hint)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1273 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1274 Py_ssize_t ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1275 Py_ssize_t lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1276 Py_ssize_t k;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1277
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1278 assert(key && a && n > 0 && hint >= 0 && hint < n);
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1279
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1280 a += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1281 lastofs = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1282 ofs = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1283 IFLT(key, *a) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1284 /* key < a[hint] -- gallop left, until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1285 * a[hint - ofs] <= key < a[hint - lastofs]
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1286 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1287 const Py_ssize_t maxofs = hint + 1; /* &a[0] is lowest */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1288 while (ofs < maxofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1289 IFLT(key, *(a-ofs)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1290 lastofs = ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1291 ofs = (ofs << 1) + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1292 if (ofs <= 0) /* int overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1293 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1294 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1295 else /* a[hint - ofs] <= key */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1296 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1297 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1298 if (ofs > maxofs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1299 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1300 /* Translate back to positive offsets relative to &a[0]. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1301 k = lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1302 lastofs = hint - ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1303 ofs = hint - k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1304 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1305 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1306 /* a[hint] <= key -- gallop right, until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1307 * a[hint + lastofs] <= key < a[hint + ofs]
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1308 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1309 const Py_ssize_t maxofs = n - hint; /* &a[n-1] is highest */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1310 while (ofs < maxofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1311 IFLT(key, a[ofs])
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1312 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1313 /* a[hint + ofs] <= key */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1314 lastofs = ofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1315 ofs = (ofs << 1) + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1316 if (ofs <= 0) /* int overflow */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1317 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1318 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1319 if (ofs > maxofs)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1320 ofs = maxofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1321 /* Translate back to offsets relative to &a[0]. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1322 lastofs += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1323 ofs += hint;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1324 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1325 a -= hint;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1326
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1327 assert(-1 <= lastofs && lastofs < ofs && ofs <= n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1328 /* Now a[lastofs] <= key < a[ofs], so key belongs somewhere to the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1329 * right of lastofs but no farther right than ofs. Do a binary
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1330 * search, with invariant a[lastofs-1] <= key < a[ofs].
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1331 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1332 ++lastofs;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1333 while (lastofs < ofs) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1334 Py_ssize_t m = lastofs + ((ofs - lastofs) >> 1);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1335
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1336 IFLT(key, a[m])
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1337 ofs = m; /* key < a[m] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1338 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1339 lastofs = m+1; /* a[m] <= key */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1340 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1341 assert(lastofs == ofs); /* so a[ofs-1] <= key < a[ofs] */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1342 return ofs;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1343
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1344 fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1345 return -1;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1346 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1347
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1348 /* The maximum number of entries in a MergeState's pending-runs stack.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1349 * This is enough to sort arrays of size up to about
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1350 * 32 * phi ** MAX_MERGE_PENDING
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1351 * where phi ~= 1.618. 85 is ridiculouslylarge enough, good for an array
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1352 * with 2**64 elements.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1353 */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1354 #define MAX_MERGE_PENDING 85
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1355
24727
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1356 /* When we get into galloping mode, we stay there until both runs win less
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1357 * often than MIN_GALLOP consecutive times. See listsort.txt for more info.
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1358 */
24727
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1359 #define MIN_GALLOP 7
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1360
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1361 /* Avoid malloc for small temp arrays. */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1362 #define MERGESTATE_TEMP_SIZE 256
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1363
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1364 /* One MergeState exists on the stack per invocation of mergesort. It's just
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1365 * a convenient way to pass state around among the helper functions.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1366 */
24727
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1367 struct s_slice {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1368 sortslice base;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1369 Py_ssize_t len;
24727
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1370 };
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1371
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1372 typedef struct s_MergeState {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1373 /* This controls when we get *into* galloping mode. It's initialized
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1374 * to MIN_GALLOP. merge_lo and merge_hi tend to nudge it higher for
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1375 * random data, and lower for highly structured data.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1376 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1377 Py_ssize_t min_gallop;
24727
b5640e74aa5c 1. Combined the base and length arrays into a single array of structs.
Tim Peters <tim.peters@gmail.com>
parents: 24657
diff changeset
1378
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1379 /* 'a' is temp storage to help with merges. It contains room for
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1380 * alloced entries.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1381 */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1382 sortslice a; /* may point to temparray below */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1383 Py_ssize_t alloced;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1384
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1385 /* A stack of n pending runs yet to be merged. Run #i starts at
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1386 * address base[i] and extends for len[i] elements. It's always
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1387 * true (so long as the indices are in bounds) that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1388 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1389 * pending[i].base + pending[i].len == pending[i+1].base
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1390 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1391 * so we could cut the storage for this, but it's a minor amount,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1392 * and keeping all the info explicit simplifies the code.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1393 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1394 int n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1395 struct s_slice pending[MAX_MERGE_PENDING];
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1396
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1397 /* 'a' points to this when possible, rather than muck with malloc. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1398 PyObject *temparray[MERGESTATE_TEMP_SIZE];
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1399 } MergeState;
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1400
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1401 /* Conceptually a MergeState's constructor. */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1402 static void
67347
3bf4d9f1660a Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
1403 merge_init(MergeState *ms, Py_ssize_t list_size, int has_keyfunc)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1404 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1405 assert(ms != NULL);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1406 if (has_keyfunc) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1407 /* The temporary space for merging will need at most half the list
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1408 * size rounded up. Use the minimum possible space so we can use the
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1409 * rest of temparray for other things. In particular, if there is
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1410 * enough extra space, listsort() will use it to store the keys.
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1411 */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1412 ms->alloced = (list_size + 1) / 2;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1413
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1414 /* ms->alloced describes how many keys will be stored at
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1415 ms->temparray, but we also need to store the values. Hence,
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1416 ms->alloced is capped at half of MERGESTATE_TEMP_SIZE. */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1417 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1418 ms->alloced = MERGESTATE_TEMP_SIZE / 2;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1419 ms->a.values = &ms->temparray[ms->alloced];
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1420 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1421 else {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1422 ms->alloced = MERGESTATE_TEMP_SIZE;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1423 ms->a.values = NULL;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1424 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1425 ms->a.keys = ms->temparray;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1426 ms->n = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1427 ms->min_gallop = MIN_GALLOP;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1428 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1429
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1430 /* Free all the temp memory owned by the MergeState. This must be called
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1431 * when you're done with a MergeState, and may be called before then if
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1432 * you want to free the temp memory early.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1433 */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1434 static void
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1435 merge_freemem(MergeState *ms)
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1436 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1437 assert(ms != NULL);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1438 if (ms->a.keys != ms->temparray)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1439 PyMem_Free(ms->a.keys);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1440 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1441
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1442 /* Ensure enough temp memory for 'need' array slots is available.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1443 * Returns 0 on success and -1 if the memory can't be gotten.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1444 */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1445 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1446 merge_getmem(MergeState *ms, Py_ssize_t need)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1447 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1448 int multiplier;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1449
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1450 assert(ms != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1451 if (need <= ms->alloced)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1452 return 0;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1453
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1454 multiplier = ms->a.values != NULL ? 2 : 1;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1455
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1456 /* Don't realloc! That can cost cycles to copy the old data, but
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1457 * we don't care what's in the block.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1458 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1459 merge_freemem(ms);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1460 if ((size_t)need > PY_SSIZE_T_MAX / sizeof(PyObject*) / multiplier) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1461 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1462 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1463 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1464 ms->a.keys = (PyObject**)PyMem_Malloc(multiplier * need
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1465 * sizeof(PyObject *));
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1466 if (ms->a.keys != NULL) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1467 ms->alloced = need;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1468 if (ms->a.values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1469 ms->a.values = &ms->a.keys[need];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1470 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1471 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1472 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1473 return -1;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1474 }
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1475 #define MERGE_GETMEM(MS, NEED) ((NEED) <= (MS)->alloced ? 0 : \
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1476 merge_getmem(MS, NEED))
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1477
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1478 /* Merge the na elements starting at ssa with the nb elements starting at
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1479 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1480 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1481 * should have na <= nb. See listsort.txt for more info. Return 0 if
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1482 * successful, -1 if error.
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1483 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1484 static Py_ssize_t
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1485 merge_lo(MergeState *ms, sortslice ssa, Py_ssize_t na,
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1486 sortslice ssb, Py_ssize_t nb)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1487 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1488 Py_ssize_t k;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1489 sortslice dest;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1490 int result = -1; /* guilty until proved innocent */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1491 Py_ssize_t min_gallop;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1492
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1493 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1494 assert(ssa.keys + na == ssb.keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1495 if (MERGE_GETMEM(ms, na) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1496 return -1;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1497 sortslice_memcpy(&ms->a, 0, &ssa, 0, na);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1498 dest = ssa;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1499 ssa = ms->a;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1500
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1501 sortslice_copy_incr(&dest, &ssb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1502 --nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1503 if (nb == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1504 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1505 if (na == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1506 goto CopyB;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1507
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1508 min_gallop = ms->min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1509 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1510 Py_ssize_t acount = 0; /* # of times A won in a row */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1511 Py_ssize_t bcount = 0; /* # of times B won in a row */
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1512
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1513 /* Do the straightforward thing until (if ever) one run
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1514 * appears to win consistently.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1515 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1516 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1517 assert(na > 1 && nb > 0);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1518 k = ISLT(ssb.keys[0], ssa.keys[0]);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1519 if (k) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1520 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1521 goto Fail;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1522 sortslice_copy_incr(&dest, &ssb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1523 ++bcount;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1524 acount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1525 --nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1526 if (nb == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1527 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1528 if (bcount >= min_gallop)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1529 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1530 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1531 else {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1532 sortslice_copy_incr(&dest, &ssa);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1533 ++acount;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1534 bcount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1535 --na;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1536 if (na == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1537 goto CopyB;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1538 if (acount >= min_gallop)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1539 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1540 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1541 }
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1542
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1543 /* One run is winning so consistently that galloping may
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1544 * be a huge win. So try that, and continue galloping until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1545 * (if ever) neither run appears to be winning consistently
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1546 * anymore.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1547 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1548 ++min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1549 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1550 assert(na > 1 && nb > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1551 min_gallop -= min_gallop > 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1552 ms->min_gallop = min_gallop;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1553 k = gallop_right(ssb.keys[0], ssa.keys, na, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1554 acount = k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1555 if (k) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1556 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1557 goto Fail;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1558 sortslice_memcpy(&dest, 0, &ssa, 0, k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1559 sortslice_advance(&dest, k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1560 sortslice_advance(&ssa, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1561 na -= k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1562 if (na == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1563 goto CopyB;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1564 /* na==0 is impossible now if the comparison
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1565 * function is consistent, but we can't assume
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1566 * that it is.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1567 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1568 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1569 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1570 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1571 sortslice_copy_incr(&dest, &ssb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1572 --nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1573 if (nb == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1574 goto Succeed;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1575
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1576 k = gallop_left(ssa.keys[0], ssb.keys, nb, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1577 bcount = k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1578 if (k) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1579 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1580 goto Fail;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1581 sortslice_memmove(&dest, 0, &ssb, 0, k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1582 sortslice_advance(&dest, k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1583 sortslice_advance(&ssb, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1584 nb -= k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1585 if (nb == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1586 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1587 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1588 sortslice_copy_incr(&dest, &ssa);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1589 --na;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1590 if (na == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1591 goto CopyB;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1592 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1593 ++min_gallop; /* penalize it for leaving galloping mode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1594 ms->min_gallop = min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1595 }
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1596 Succeed:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1597 result = 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1598 Fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1599 if (na)
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1600 sortslice_memcpy(&dest, 0, &ssa, 0, na);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1601 return result;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1602 CopyB:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1603 assert(na == 1 && nb > 0);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1604 /* The last element of ssa belongs at the end of the merge. */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1605 sortslice_memmove(&dest, 0, &ssb, 0, nb);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1606 sortslice_copy(&dest, nb, &ssa, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1607 return 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1608 }
6814
0fe3dc28b92c Modified quicksort by Raymund Galvin, after studying the GNU libg++
Guido van Rossum <guido@python.org>
parents: 6154
diff changeset
1609
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1610 /* Merge the na elements starting at pa with the nb elements starting at
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1611 * ssb.keys = ssa.keys + na in a stable way, in-place. na and nb must be > 0.
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1612 * Must also have that ssa.keys[na-1] belongs at the end of the merge, and
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1613 * should have na >= nb. See listsort.txt for more info. Return 0 if
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1614 * successful, -1 if error.
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1615 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1616 static Py_ssize_t
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1617 merge_hi(MergeState *ms, sortslice ssa, Py_ssize_t na,
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1618 sortslice ssb, Py_ssize_t nb)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1619 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1620 Py_ssize_t k;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1621 sortslice dest, basea, baseb;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1622 int result = -1; /* guilty until proved innocent */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1623 Py_ssize_t min_gallop;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1624
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1625 assert(ms && ssa.keys && ssb.keys && na > 0 && nb > 0);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1626 assert(ssa.keys + na == ssb.keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1627 if (MERGE_GETMEM(ms, nb) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1628 return -1;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1629 dest = ssb;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1630 sortslice_advance(&dest, nb-1);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1631 sortslice_memcpy(&ms->a, 0, &ssb, 0, nb);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1632 basea = ssa;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1633 baseb = ms->a;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1634 ssb.keys = ms->a.keys + nb - 1;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1635 if (ssb.values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1636 ssb.values = ms->a.values + nb - 1;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1637 sortslice_advance(&ssa, na - 1);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1638
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1639 sortslice_copy_decr(&dest, &ssa);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1640 --na;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1641 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1642 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1643 if (nb == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1644 goto CopyA;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1645
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1646 min_gallop = ms->min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1647 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1648 Py_ssize_t acount = 0; /* # of times A won in a row */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1649 Py_ssize_t bcount = 0; /* # of times B won in a row */
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1650
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1651 /* Do the straightforward thing until (if ever) one run
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1652 * appears to win consistently.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1653 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1654 for (;;) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1655 assert(na > 0 && nb > 1);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1656 k = ISLT(ssb.keys[0], ssa.keys[0]);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1657 if (k) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1658 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1659 goto Fail;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1660 sortslice_copy_decr(&dest, &ssa);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1661 ++acount;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1662 bcount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1663 --na;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1664 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1665 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1666 if (acount >= min_gallop)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1667 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1668 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1669 else {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1670 sortslice_copy_decr(&dest, &ssb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1671 ++bcount;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1672 acount = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1673 --nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1674 if (nb == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1675 goto CopyA;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1676 if (bcount >= min_gallop)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1677 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1678 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1679 }
8164
ea59bb921380 Quicksort retuned by Tim Peters.
Guido van Rossum <guido@python.org>
parents: 7986
diff changeset
1680
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1681 /* One run is winning so consistently that galloping may
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1682 * be a huge win. So try that, and continue galloping until
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1683 * (if ever) neither run appears to be winning consistently
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1684 * anymore.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1685 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1686 ++min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1687 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1688 assert(na > 0 && nb > 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1689 min_gallop -= min_gallop > 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1690 ms->min_gallop = min_gallop;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1691 k = gallop_right(ssb.keys[0], basea.keys, na, na-1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1692 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1693 goto Fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1694 k = na - k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1695 acount = k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1696 if (k) {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1697 sortslice_advance(&dest, -k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1698 sortslice_advance(&ssa, -k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1699 sortslice_memmove(&dest, 1, &ssa, 1, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1700 na -= k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1701 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1702 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1703 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1704 sortslice_copy_decr(&dest, &ssb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1705 --nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1706 if (nb == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1707 goto CopyA;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1708
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1709 k = gallop_left(ssa.keys[0], baseb.keys, nb, nb-1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1710 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1711 goto Fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1712 k = nb - k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1713 bcount = k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1714 if (k) {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1715 sortslice_advance(&dest, -k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1716 sortslice_advance(&ssb, -k);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1717 sortslice_memcpy(&dest, 1, &ssb, 1, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1718 nb -= k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1719 if (nb == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1720 goto CopyA;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1721 /* nb==0 is impossible now if the comparison
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1722 * function is consistent, but we can't assume
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1723 * that it is.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1724 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1725 if (nb == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1726 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1727 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1728 sortslice_copy_decr(&dest, &ssa);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1729 --na;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1730 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1731 goto Succeed;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1732 } while (acount >= MIN_GALLOP || bcount >= MIN_GALLOP);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1733 ++min_gallop; /* penalize it for leaving galloping mode */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1734 ms->min_gallop = min_gallop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1735 }
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1736 Succeed:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1737 result = 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1738 Fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1739 if (nb)
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1740 sortslice_memcpy(&dest, -(nb-1), &baseb, 0, nb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1741 return result;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1742 CopyA:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1743 assert(nb == 1 && na > 0);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1744 /* The first element of ssb belongs at the front of the merge. */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1745 sortslice_memmove(&dest, 1-na, &ssa, 1-na, na);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1746 sortslice_advance(&dest, -na);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1747 sortslice_advance(&ssa, -na);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1748 sortslice_copy(&dest, 0, &ssb, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1749 return 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1750 }
6814
0fe3dc28b92c Modified quicksort by Raymund Galvin, after studying the GNU libg++
Guido van Rossum <guido@python.org>
parents: 6154
diff changeset
1751
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1752 /* Merge the two runs at stack indices i and i+1.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1753 * Returns 0 on success, -1 on error.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1754 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1755 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1756 merge_at(MergeState *ms, Py_ssize_t i)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1757 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1758 sortslice ssa, ssb;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1759 Py_ssize_t na, nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1760 Py_ssize_t k;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1761
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1762 assert(ms != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1763 assert(ms->n >= 2);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1764 assert(i >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1765 assert(i == ms->n - 2 || i == ms->n - 3);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1766
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1767 ssa = ms->pending[i].base;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1768 na = ms->pending[i].len;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1769 ssb = ms->pending[i+1].base;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1770 nb = ms->pending[i+1].len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1771 assert(na > 0 && nb > 0);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1772 assert(ssa.keys + na == ssb.keys);
8322
e6ef0e39e35c Tim's quicksort on May 10.
Guido van Rossum <guido@python.org>
parents: 8186
diff changeset
1773
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1774 /* Record the length of the combined runs; if i is the 3rd-last
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1775 * run now, also slide over the last run (which isn't involved
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1776 * in this merge). The current run i+1 goes away in any case.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1777 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1778 ms->pending[i].len = na + nb;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1779 if (i == ms->n - 3)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1780 ms->pending[i+1] = ms->pending[i+2];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1781 --ms->n;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1782
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1783 /* Where does b start in a? Elements in a before that can be
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1784 * ignored (already in place).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1785 */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1786 k = gallop_right(*ssb.keys, ssa.keys, na, 0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1787 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1788 return -1;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1789 sortslice_advance(&ssa, k);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1790 na -= k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1791 if (na == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1792 return 0;
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1793
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1794 /* Where does a end in b? Elements in b after that can be
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1795 * ignored (already in place).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1796 */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1797 nb = gallop_left(ssa.keys[na-1], ssb.keys, nb, nb-1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1798 if (nb <= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1799 return nb;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1800
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1801 /* Merge what remains of the runs, using a temp array with
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1802 * min(na, nb) elements.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1803 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1804 if (na <= nb)
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1805 return merge_lo(ms, ssa, na, ssb, nb);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1806 else
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1807 return merge_hi(ms, ssa, na, ssb, nb);
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1808 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1809
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1810 /* Examine the stack of runs waiting to be merged, merging adjacent runs
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1811 * until the stack invariants are re-established:
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1812 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1813 * 1. len[-3] > len[-2] + len[-1]
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1814 * 2. len[-2] > len[-1]
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1815 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1816 * See listsort.txt for more info.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1817 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1818 * Returns 0 on success, -1 on error.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1819 */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1820 static int
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1821 merge_collapse(MergeState *ms)
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1822 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1823 struct s_slice *p = ms->pending;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1824
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1825 assert(ms);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1826 while (ms->n > 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1827 Py_ssize_t n = ms->n - 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1828 if (n > 0 && p[n-1].len <= p[n].len + p[n+1].len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1829 if (p[n-1].len < p[n+1].len)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1830 --n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1831 if (merge_at(ms, n) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1832 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1833 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1834 else if (p[n].len <= p[n+1].len) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1835 if (merge_at(ms, n) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1836 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1837 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1838 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1839 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1840 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1841 return 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1842 }
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1843
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1844 /* Regardless of invariants, merge all runs on the stack until only one
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1845 * remains. This is used at the end of the mergesort.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1846 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1847 * Returns 0 on success, -1 on error.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1848 */
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1849 static int
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1850 merge_force_collapse(MergeState *ms)
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1851 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1852 struct s_slice *p = ms->pending;
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1853
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1854 assert(ms);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1855 while (ms->n > 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1856 Py_ssize_t n = ms->n - 2;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1857 if (n > 0 && p[n-1].len < p[n+1].len)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1858 --n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1859 if (merge_at(ms, n) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1860 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1861 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1862 return 0;
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1863 }
8457
af48887c9717 Tim's revision of the previous patch. He also added some sparts to
Guido van Rossum <guido@python.org>
parents: 8440
diff changeset
1864
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1865 /* Compute a good value for the minimum run length; natural runs shorter
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1866 * than this are boosted artificially via binary insertion.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1867 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1868 * If n < 64, return n (it's too small to bother with fancy stuff).
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1869 * Else if n is an exact power of 2, return 32.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1870 * Else return an int k, 32 <= k <= 64, such that n/k is close to, but
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1871 * strictly less than, an exact power of 2.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1872 *
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1873 * See listsort.txt for more info.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1874 */
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1875 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36484
diff changeset
1876 merge_compute_minrun(Py_ssize_t n)
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1877 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1878 Py_ssize_t r = 0; /* becomes 1 if any 1 bits are shifted off */
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1879
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1880 assert(n >= 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1881 while (n >= 64) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1882 r |= n & 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1883 n >>= 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1884 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1885 return n + r;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1886 }
8457
af48887c9717 Tim's revision of the previous patch. He also added some sparts to
Guido van Rossum <guido@python.org>
parents: 8440
diff changeset
1887
30697
1345c23a0591 * list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents: 30156
diff changeset
1888 static void
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1889 reverse_sortslice(sortslice *s, Py_ssize_t n)
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
1890 {
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1891 reverse_slice(s->keys, &s->keys[n]);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1892 if (s->values != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1893 reverse_slice(s->values, &s->values[n]);
30697
1345c23a0591 * list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents: 30156
diff changeset
1894 }
1345c23a0591 * list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents: 30156
diff changeset
1895
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1896 /* An adaptive, stable, natural mergesort. See listsort.txt.
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1897 * Returns Py_None on success, NULL on error. Even in case of error, the
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1898 * list will be some permutation of its input state (nothing is lost or
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1899 * duplicated).
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1900 */
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
1901 static PyObject *
30697
1345c23a0591 * list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents: 30156
diff changeset
1902 listsort(PyListObject *self, PyObject *args, PyObject *kwds)
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
1903 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1904 MergeState ms;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1905 Py_ssize_t nremaining;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1906 Py_ssize_t minrun;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1907 sortslice lo;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1908 Py_ssize_t saved_ob_size, saved_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1909 PyObject **saved_ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1910 PyObject **final_ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1911 PyObject *result = NULL; /* guilty until proved innocent */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1912 int reverse = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1913 PyObject *keyfunc = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1914 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1915 static char *kwlist[] = {"key", "reverse", 0};
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1916 PyObject **keys;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
1917
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1918 assert(self != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1919 assert (PyList_Check(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1920 if (args != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1921 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:sort",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1922 kwlist, &keyfunc, &reverse))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1923 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1924 if (Py_SIZE(args) > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1925 PyErr_SetString(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1926 "must use keyword argument for key function");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1927 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1928 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1929 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1930 if (keyfunc == Py_None)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1931 keyfunc = NULL;
30697
1345c23a0591 * list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents: 30156
diff changeset
1932
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1933 /* The list is temporarily made empty, so that mutations performed
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1934 * by comparison functions can't affect the slice of memory we're
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1935 * sorting (allowing mutations during sorting is a core-dump
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1936 * factory, since ob_item may change).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1937 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1938 saved_ob_size = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1939 saved_ob_item = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1940 saved_allocated = self->allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1941 Py_SIZE(self) = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1942 self->ob_item = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1943 self->allocated = -1; /* any operation will reset it to >= 0 */
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
1944
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1945 if (keyfunc == NULL) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1946 keys = NULL;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1947 lo.keys = saved_ob_item;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1948 lo.values = NULL;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1949 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1950 else {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1951 if (saved_ob_size < MERGESTATE_TEMP_SIZE/2)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1952 /* Leverage stack space we allocated but won't otherwise use */
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1953 keys = &ms.temparray[saved_ob_size+1];
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1954 else {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1955 keys = PyMem_MALLOC(sizeof(PyObject *) * saved_ob_size);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1956 if (keys == NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1957 return NULL;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1958 }
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1959
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1960 for (i = 0; i < saved_ob_size ; i++) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1961 keys[i] = PyObject_CallFunctionObjArgs(keyfunc, saved_ob_item[i],
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1962 NULL);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1963 if (keys[i] == NULL) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1964 for (i=i-1 ; i>=0 ; i--)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1965 Py_DECREF(keys[i]);
69836
52fb7dc721ed #11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents: 68586
diff changeset
1966 if (keys != &ms.temparray[saved_ob_size+1])
52fb7dc721ed #11335: Fix memory leak after key function failure in sort
Daniel Stutzbach <daniel.stutzbach@google.com>
parents: 68586
diff changeset
1967 PyMem_FREE(keys);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1968 goto keyfunc_fail;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1969 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1970 }
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1971
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1972 lo.keys = keys;
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1973 lo.values = saved_ob_item;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1974 }
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
1975
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1976 merge_init(&ms, saved_ob_size, keys != NULL);
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
1977
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1978 nremaining = saved_ob_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1979 if (nremaining < 2)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1980 goto succeed;
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
1981
64248
ba536ac7ab4e reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
1982 /* Reverse sort stability achieved by initially reversing the list,
ba536ac7ab4e reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
1983 applying a stable forward sort, then reversing the final result. */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1984 if (reverse) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1985 if (keys != NULL)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1986 reverse_slice(&keys[0], &keys[saved_ob_size]);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1987 reverse_slice(&saved_ob_item[0], &saved_ob_item[saved_ob_size]);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1988 }
64248
ba536ac7ab4e reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents: 61466
diff changeset
1989
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1990 /* March over the array once, left to right, finding natural runs,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1991 * and extending short natural runs to minrun elements.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1992 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1993 minrun = merge_compute_minrun(nremaining);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1994 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1995 int descending;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1996 Py_ssize_t n;
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
1997
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
1998 /* Identify next run. */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
1999 n = count_run(lo.keys, lo.keys + nremaining, &descending);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2000 if (n < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2001 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2002 if (descending)
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2003 reverse_sortslice(&lo, n);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2004 /* If short, extend to min(minrun, nremaining). */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2005 if (n < minrun) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2006 const Py_ssize_t force = nremaining <= minrun ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2007 nremaining : minrun;
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2008 if (binarysort(lo, lo.keys + force, lo.keys + n) < 0)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2009 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2010 n = force;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2011 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2012 /* Push run onto pending-runs stack, and maybe merge. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2013 assert(ms.n < MAX_MERGE_PENDING);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2014 ms.pending[ms.n].base = lo;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2015 ms.pending[ms.n].len = n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2016 ++ms.n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2017 if (merge_collapse(&ms) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2018 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2019 /* Advance to find next run. */
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2020 sortslice_advance(&lo, n);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2021 nremaining -= n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2022 } while (nremaining);
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
2023
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2024 if (merge_force_collapse(&ms) < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2025 goto fail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2026 assert(ms.n == 1);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2027 assert(keys == NULL
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2028 ? ms.pending[0].base.keys == saved_ob_item
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2029 : ms.pending[0].base.keys == &keys[0]);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2030 assert(ms.pending[0].len == saved_ob_size);
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2031 lo = ms.pending[0].base;
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
2032
24456
d216e67ac221 Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents: 24424
diff changeset
2033 succeed:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2034 result = Py_None;
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
2035 fail:
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2036 if (keys != NULL) {
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2037 for (i = 0; i < saved_ob_size; i++)
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2038 Py_DECREF(keys[i]);
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2039 if (keys != &ms.temparray[saved_ob_size+1])
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2040 PyMem_FREE(keys);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2041 }
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
2042
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2043 if (self->allocated != -1 && result != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2044 /* The user mucked with the list during the sort,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2045 * and we don't already have another error to report.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2046 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2047 PyErr_SetString(PyExc_ValueError, "list modified during sort");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2048 result = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2049 }
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
2050
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2051 if (reverse && saved_ob_size > 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2052 reverse_slice(saved_ob_item, saved_ob_item + saved_ob_size);
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
2053
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2054 merge_freemem(&ms);
31093
f2e7646f7763 Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents: 31041
diff changeset
2055
66608
e339fca6e51a Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents: 65512
diff changeset
2056 keyfunc_fail:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2057 final_ob_item = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2058 i = Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2059 Py_SIZE(self) = saved_ob_size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2060 self->ob_item = saved_ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2061 self->allocated = saved_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2062 if (final_ob_item != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2063 /* we cannot use list_clear() for this because it does not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2064 guarantee that the list is really empty when it returns */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2065 while (--i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2066 Py_XDECREF(final_ob_item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2067 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2068 PyMem_FREE(final_ob_item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2069 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2070 Py_XINCREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2071 return result;
4673
a3cdc8164990 Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
2072 }
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
2073 #undef IFLT
24540
614358e3c4f6 Sped the usual case for sorting by calling PyObject_RichCompareBool
Tim Peters <tim.peters@gmail.com>
parents: 24515
diff changeset
2074 #undef ISLT
24316
dd38291b89fb More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents: 24313
diff changeset
2075
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2076 int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
2077 PyList_Sort(PyObject *v)
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2078 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2079 if (v == NULL || !PyList_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2080 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2081 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2082 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2083 v = listsort((PyListObject *)v, (PyObject *)NULL, (PyObject *)NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2084 if (v == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2085 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2086 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2087 return 0;
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2088 }
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2089
16581
c0cdf82599e0 Fix core dump whenever PyList_Reverse() was called.
Guido van Rossum <guido@python.org>
parents: 15969
diff changeset
2090 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
2091 listreverse(PyListObject *self)
16581
c0cdf82599e0 Fix core dump whenever PyList_Reverse() was called.
Guido van Rossum <guido@python.org>
parents: 15969
diff changeset
2092 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2093 if (Py_SIZE(self) > 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2094 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2095 Py_RETURN_NONE;
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2096 }
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2097
47
05057e3660f8 Added external interface to sort a list.
Guido van Rossum <guido@python.org>
parents: 27
diff changeset
2098 int
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
2099 PyList_Reverse(PyObject *v)
2159
a619a61aad1e added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents: 2143
diff changeset
2100 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2101 PyListObject *self = (PyListObject *)v;
24657
955914b0a4d6 PyList_Reverse(): This was leaking a reference to Py_None on every call.
Tim Peters <tim.peters@gmail.com>
parents: 24540
diff changeset
2102
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2103 if (v == NULL || !PyList_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2104 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2105 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2106 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2107 if (Py_SIZE(self) > 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2108 reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2109 return 0;
2159
a619a61aad1e added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents: 2143
diff changeset
2110 }
a619a61aad1e added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents: 2143
diff changeset
2111
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2112 PyObject *
13472
dbe83fd23393 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13265
diff changeset
2113 PyList_AsTuple(PyObject *v)
1836
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
2114 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2115 PyObject *w;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2116 PyObject **p, **q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2117 Py_ssize_t n;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2118 if (v == NULL || !PyList_Check(v)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2119 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2120 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2121 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2122 n = Py_SIZE(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2123 w = PyTuple_New(n);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2124 if (w == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2125 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2126 p = ((PyTupleObject *)w)->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2127 q = ((PyListObject *)v)->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2128 while (--n >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2129 Py_INCREF(*q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2130 *p = *q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2131 p++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2132 q++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2133 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2134 return w;
1836
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
2135 }
1203f0629527 Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents: 1405
diff changeset
2136
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2137 static PyObject *
29510
01e925371d7c SF #754014: list.index() should accept optional start, end arguments
Raymond Hettinger <python@rcn.com>
parents: 29198
diff changeset
2138 listindex(PyListObject *self, PyObject *args)
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2139 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2140 Py_ssize_t i, start=0, stop=Py_SIZE(self);
73403
386a319b1825 Issue #13350: Replace most usages of PyUnicode_Format by PyUnicode_FromFormat.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 73391
diff changeset
2141 PyObject *v;
11846
8b70eaaadf4b Made all list methods use PyArg_ParseTuple(), for more accurate
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
2142
73408
ed0e85efac47 Revert "Accept None as start and stop parameters for list.index() and tuple.index()"
Petri Lehtinen <petri@digip.org>
parents: 73390
diff changeset
2143 if (!PyArg_ParseTuple(args, "O|O&O&:index", &v,
ed0e85efac47 Revert "Accept None as start and stop parameters for list.index() and tuple.index()"
Petri Lehtinen <petri@digip.org>
parents: 73390
diff changeset
2144 _PyEval_SliceIndex, &start,
ed0e85efac47 Revert "Accept None as start and stop parameters for list.index() and tuple.index()"
Petri Lehtinen <petri@digip.org>
parents: 73390
diff changeset
2145 _PyEval_SliceIndex, &stop))
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2146 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2147 if (start < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2148 start += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2149 if (start < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2150 start = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2151 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2152 if (stop < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2153 stop += Py_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2154 if (stop < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2155 stop = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2156 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2157 for (i = start; i < stop && i < Py_SIZE(self); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2158 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2159 if (cmp > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2160 return PyLong_FromSsize_t(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2161 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2162 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2163 }
73403
386a319b1825 Issue #13350: Replace most usages of PyUnicode_Format by PyUnicode_FromFormat.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 73391
diff changeset
2164 PyErr_Format(PyExc_ValueError, "%R is not in list", v);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2165 return NULL;
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2166 }
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2167
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2168 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
2169 listcount(PyListObject *self, PyObject *v)
394
8154385248d8 Added count() method.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
2170 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2171 Py_ssize_t count = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2172 Py_ssize_t i;
11846
8b70eaaadf4b Made all list methods use PyArg_ParseTuple(), for more accurate
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
2173
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2174 for (i = 0; i < Py_SIZE(self); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2175 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2176 if (cmp > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2177 count++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2178 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2179 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2180 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2181 return PyLong_FromSsize_t(count);
394
8154385248d8 Added count() method.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
2182 }
8154385248d8 Added count() method.
Guido van Rossum <guido@python.org>
parents: 284
diff changeset
2183
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2184 static PyObject *
19301
b9701538f827 Patch #427190: Implement and use METH_NOARGS and METH_O.
Martin v. Löwis <martin@v.loewis.de>
parents: 18933
diff changeset
2185 listremove(PyListObject *self, PyObject *v)
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2186 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2187 Py_ssize_t i;
11846
8b70eaaadf4b Made all list methods use PyArg_ParseTuple(), for more accurate
Guido van Rossum <guido@python.org>
parents: 11673
diff changeset
2188
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2189 for (i = 0; i < Py_SIZE(self); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2190 int cmp = PyObject_RichCompareBool(self->ob_item[i], v, Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2191 if (cmp > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2192 if (list_ass_slice(self, i, i+1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2193 (PyObject *)NULL) == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2194 Py_RETURN_NONE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2195 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2196 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2197 else if (cmp < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2198 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2199 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2200 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2201 return NULL;
155
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2202 }
896c825f2f71 Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents: 145
diff changeset
2203
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2204 static int
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2205 list_traverse(PyListObject *o, visitproc visit, void *arg)
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2206 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2207 Py_ssize_t i;
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2208
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2209 for (i = Py_SIZE(o); --i >= 0; )
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2210 Py_VISIT(o->ob_item[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2211 return 0;
12990
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2212 }
e615596c5c47 Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12952
diff changeset
2213
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2214 static PyObject *
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2215 list_richcompare(PyObject *v, PyObject *w, int op)
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2216 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2217 PyListObject *vl, *wl;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2218 Py_ssize_t i;
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2219
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 69837
diff changeset
2220 if (!PyList_Check(v) || !PyList_Check(w))
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 69837
diff changeset
2221 Py_RETURN_NOTIMPLEMENTED;
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2222
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2223 vl = (PyListObject *)v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2224 wl = (PyListObject *)w;
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2225
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2226 if (Py_SIZE(vl) != Py_SIZE(wl) && (op == Py_EQ || op == Py_NE)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2227 /* Shortcut: if the lengths differ, the lists differ */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2228 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2229 if (op == Py_EQ)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2230 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2231 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2232 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2233 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2234 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2235 }
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2236
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2237 /* Search for the first index where items are different */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2238 for (i = 0; i < Py_SIZE(vl) && i < Py_SIZE(wl); i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2239 int k = PyObject_RichCompareBool(vl->ob_item[i],
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2240 wl->ob_item[i], Py_EQ);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2241 if (k < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2242 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2243 if (!k)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2244 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2245 }
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2246
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2247 if (i >= Py_SIZE(vl) || i >= Py_SIZE(wl)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2248 /* No more items to compare -- compare sizes */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2249 Py_ssize_t vs = Py_SIZE(vl);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2250 Py_ssize_t ws = Py_SIZE(wl);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2251 int cmp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2252 PyObject *res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2253 switch (op) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2254 case Py_LT: cmp = vs < ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2255 case Py_LE: cmp = vs <= ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2256 case Py_EQ: cmp = vs == ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2257 case Py_NE: cmp = vs != ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2258 case Py_GT: cmp = vs > ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2259 case Py_GE: cmp = vs >= ws; break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2260 default: return NULL; /* cannot happen */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2261 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2262 if (cmp)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2263 res = Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2264 else
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2265 res = Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2266 Py_INCREF(res);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2267 return res;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2268 }
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2269
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2270 /* We have an item that differs -- shortcuts for EQ/NE */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2271 if (op == Py_EQ) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2272 Py_INCREF(Py_False);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2273 return Py_False;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2274 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2275 if (op == Py_NE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2276 Py_INCREF(Py_True);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2277 return Py_True;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2278 }
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2279
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2280 /* Compare the final item again using the proper operator */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2281 return PyObject_RichCompare(vl->ob_item[i], wl->ob_item[i], op);
15969
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2282 }
e21da84d0c65 Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents: 15707
diff changeset
2283
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2284 static int
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2285 list_init(PyListObject *self, PyObject *args, PyObject *kw)
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2286 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2287 PyObject *arg = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2288 static char *kwlist[] = {"sequence", 0};
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2289
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2290 if (!PyArg_ParseTupleAndKeywords(args, kw, "|O:list", kwlist, &arg))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2291 return -1;
32859
45f3222b84ee * Simplify and speed-up list_resize(). Relying on the newly documented
Raymond Hettinger <python@rcn.com>
parents: 32858
diff changeset
2292
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2293 /* Verify list invariants established by PyType_GenericAlloc() */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2294 assert(0 <= Py_SIZE(self));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2295 assert(Py_SIZE(self) <= self->allocated || self->allocated == -1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2296 assert(self->ob_item != NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2297 self->allocated == 0 || self->allocated == -1);
32859
45f3222b84ee * Simplify and speed-up list_resize(). Relying on the newly documented
Raymond Hettinger <python@rcn.com>
parents: 32858
diff changeset
2298
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2299 /* Empty previous contents */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2300 if (self->ob_item != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2301 (void)list_clear(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2302 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2303 if (arg != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2304 PyObject *rv = listextend(self, arg);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2305 if (rv == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2306 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2307 Py_DECREF(rv);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2308 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2309 return 0;
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2310 }
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2311
47466
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2312 static PyObject *
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2313 list_sizeof(PyListObject *self)
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2314 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2315 Py_ssize_t res;
47466
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2316
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2317 res = sizeof(PyListObject) + self->allocated * sizeof(void*);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2318 return PyLong_FromSsize_t(res);
47466
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2319 }
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2320
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2321 static PyObject *list_iter(PyObject *seq);
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2322 static PyObject *list_reversed(PyListObject* seq, PyObject* unused);
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2323
31172
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31164
diff changeset
2324 PyDoc_STRVAR(getitem_doc,
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31164
diff changeset
2325 "x.__getitem__(y) <==> x[y]");
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2326 PyDoc_STRVAR(reversed_doc,
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2327 "L.__reversed__() -- return a reverse iterator over the list");
47466
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2328 PyDoc_STRVAR(sizeof_doc,
58f4b60773fe Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45755
diff changeset
2329 "L.__sizeof__() -- size of L in memory, in bytes");
68129
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2330 PyDoc_STRVAR(clear_doc,
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2331 "L.clear() -> None -- remove all items from L");
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2332 PyDoc_STRVAR(copy_doc,
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2333 "L.copy() -> list -- a shallow copy of L");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2334 PyDoc_STRVAR(append_doc,
72808
352d075839f7 Closes #12192: Document that mutating list methods do not return the instance (original patch by Mike Hoy).
Georg Brandl <georg@python.org>
parents: 72756
diff changeset
2335 "L.append(object) -> None -- append object to end");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2336 PyDoc_STRVAR(extend_doc,
72808
352d075839f7 Closes #12192: Document that mutating list methods do not return the instance (original patch by Mike Hoy).
Georg Brandl <georg@python.org>
parents: 72756
diff changeset
2337 "L.extend(iterable) -> None -- extend list by appending elements from the iterable");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2338 PyDoc_STRVAR(insert_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2339 "L.insert(index, object) -- insert object before index");
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2340 PyDoc_STRVAR(pop_doc,
49493
bdf4da5d04ad merge from trunk
Benjamin Peterson <benjamin@python.org>
parents: 49350
diff changeset
2341 "L.pop([index]) -> item -- remove and return item at index (default last).\n"
bdf4da5d04ad merge from trunk
Benjamin Peterson <benjamin@python.org>
parents: 49350
diff changeset
2342 "Raises IndexError if list is empty or index is out of range.");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2343 PyDoc_STRVAR(remove_doc,
72808
352d075839f7 Closes #12192: Document that mutating list methods do not return the instance (original patch by Mike Hoy).
Georg Brandl <georg@python.org>
parents: 72756
diff changeset
2344 "L.remove(value) -> None -- remove first occurrence of value.\n"
49493
bdf4da5d04ad merge from trunk
Benjamin Peterson <benjamin@python.org>
parents: 49350
diff changeset
2345 "Raises ValueError if the value is not present.");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2346 PyDoc_STRVAR(index_doc,
49493
bdf4da5d04ad merge from trunk
Benjamin Peterson <benjamin@python.org>
parents: 49350
diff changeset
2347 "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n"
bdf4da5d04ad merge from trunk
Benjamin Peterson <benjamin@python.org>
parents: 49350
diff changeset
2348 "Raises ValueError if the value is not present.");
23832
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2349 PyDoc_STRVAR(count_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2350 "L.count(value) -> integer -- return number of occurrences of value");
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2351 PyDoc_STRVAR(reverse_doc,
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2352 "L.reverse() -- reverse *IN PLACE*");
ed1ba37a46b7 Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents: 23779
diff changeset
2353 PyDoc_STRVAR(sort_doc,
72808
352d075839f7 Closes #12192: Document that mutating list methods do not return the instance (original patch by Mike Hoy).
Georg Brandl <georg@python.org>
parents: 72756
diff changeset
2354 "L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*");
8595
635c3d94a948 Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents: 8515
diff changeset
2355
31172
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31164
diff changeset
2356 static PyObject *list_subscript(PyListObject*, PyObject*);
e4fb6164158c * Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents: 31164
diff changeset
2357
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2358 static PyMethodDef list_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2359 {"__getitem__", (PyCFunction)list_subscript, METH_O|METH_COEXIST, getitem_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2360 {"__reversed__",(PyCFunction)list_reversed, METH_NOARGS, reversed_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2361 {"__sizeof__", (PyCFunction)list_sizeof, METH_NOARGS, sizeof_doc},
68129
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2362 {"clear", (PyCFunction)listclear, METH_NOARGS, clear_doc},
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2363 {"copy", (PyCFunction)listcopy, METH_NOARGS, copy_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2364 {"append", (PyCFunction)listappend, METH_O, append_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2365 {"insert", (PyCFunction)listinsert, METH_VARARGS, insert_doc},
68129
c8c0e42944a1 Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents: 67347
diff changeset
2366 {"extend", (PyCFunction)listextend, METH_O, extend_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2367 {"pop", (PyCFunction)listpop, METH_VARARGS, pop_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2368 {"remove", (PyCFunction)listremove, METH_O, remove_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2369 {"index", (PyCFunction)listindex, METH_VARARGS, index_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2370 {"count", (PyCFunction)listcount, METH_O, count_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2371 {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2372 {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc},
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2373 {NULL, NULL} /* sentinel */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2374 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2375
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2376 static PySequenceMethods list_as_sequence = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2377 (lenfunc)list_length, /* sq_length */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2378 (binaryfunc)list_concat, /* sq_concat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2379 (ssizeargfunc)list_repeat, /* sq_repeat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2380 (ssizeargfunc)list_item, /* sq_item */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2381 0, /* sq_slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2382 (ssizeobjargproc)list_ass_item, /* sq_ass_item */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2383 0, /* sq_ass_slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2384 (objobjproc)list_contains, /* sq_contains */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2385 (binaryfunc)list_inplace_concat, /* sq_inplace_concat */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2386 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2387 };
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2388
23855
2b071337205c Missed one use of new PyDoc_STRVAR macro
Neal Norwitz <nnorwitz@gmail.com>
parents: 23834
diff changeset
2389 PyDoc_STRVAR(list_doc,
59225
9b72277d6b30 Merged revisions 78541 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58904
diff changeset
2390 "list() -> new empty list\n"
9b72277d6b30 Merged revisions 78541 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58904
diff changeset
2391 "list(iterable) -> new list initialized from iterable's items");
18933
09df3254b49d Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents: 18409
diff changeset
2392
24230
2860be244263 Don't declare a function with staticforward.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24207
diff changeset
2393 static PyObject *
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2394 list_subscript(PyListObject* self, PyObject* item)
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2395 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2396 if (PyIndex_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2397 Py_ssize_t i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2398 i = PyNumber_AsSsize_t(item, PyExc_IndexError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2399 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2400 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2401 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2402 i += PyList_GET_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2403 return list_item(self, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2404 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2405 else if (PySlice_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2406 Py_ssize_t start, stop, step, slicelength, cur, i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2407 PyObject* result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2408 PyObject* it;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2409 PyObject **src, **dest;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2410
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66617
diff changeset
2411 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2412 &start, &stop, &step, &slicelength) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2413 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2414 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2415
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2416 if (slicelength <= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2417 return PyList_New(0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2418 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2419 else if (step == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2420 return list_slice(self, start, stop);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2421 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2422 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2423 result = PyList_New(slicelength);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2424 if (!result) return NULL;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2425
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2426 src = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2427 dest = ((PyListObject *)result)->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2428 for (cur = start, i = 0; i < slicelength;
72468
3fb9464f9b02 Issue #1621: Fix undefined behaviour from signed overflow in datetime module hashes, array and list iterations, and get_integer (stringlib/string_format.h)
Mark Dickinson <mdickinson@enthought.com>
parents: 72418
diff changeset
2429 cur += (size_t)step, i++) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2430 it = src[cur];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2431 Py_INCREF(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2432 dest[i] = it;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2433 }
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2434
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2435 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2436 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2437 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2438 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2439 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2440 "list indices must be integers, not %.200s",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2441 item->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2442 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2443 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2444 }
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2445
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2446 static int
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2447 list_ass_subscript(PyListObject* self, PyObject* item, PyObject* value)
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2448 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2449 if (PyIndex_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2450 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2451 if (i == -1 && PyErr_Occurred())
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2452 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2453 if (i < 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2454 i += PyList_GET_SIZE(self);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2455 return list_ass_item(self, i, value);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2456 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2457 else if (PySlice_Check(item)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2458 Py_ssize_t start, stop, step, slicelength;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2459
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 66617
diff changeset
2460 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2461 &start, &stop, &step, &slicelength) < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2462 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2463 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2464
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2465 if (step == 1)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2466 return list_ass_slice(self, start, stop, value);
23929
26ba17b758b9 Fix the bug described in
Michael W. Hudson <mwh@python.net>
parents: 23855
diff changeset
2467
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2468 /* Make sure s[5:2] = [..] inserts at the right place:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2469 before 5, not before 2. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2470 if ((step < 0 && start < stop) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2471 (step > 0 && start > stop))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2472 stop = start;
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42855
diff changeset
2473
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2474 if (value == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2475 /* delete slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2476 PyObject **garbage;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2477 size_t cur;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2478 Py_ssize_t i;
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2479
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2480 if (slicelength <= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2481 return 0;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2482
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2483 if (step < 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2484 stop = start + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2485 start = stop + step*(slicelength - 1) - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2486 step = -step;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2487 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2488
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2489 assert((size_t)slicelength <=
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2490 PY_SIZE_MAX / sizeof(PyObject*));
48330
ac854cde3135 Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 47466
diff changeset
2491
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2492 garbage = (PyObject**)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2493 PyMem_MALLOC(slicelength*sizeof(PyObject*));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2494 if (!garbage) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2495 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2496 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2497 }
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2498
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2499 /* drawing pictures might help understand these for
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2500 loops. Basically, we memmove the parts of the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2501 list that are *not* part of the slice: step-1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2502 items for each item that is part of the slice,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2503 and then tail end of the list that was not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2504 covered by the slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2505 for (cur = start, i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2506 cur < (size_t)stop;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2507 cur += step, i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2508 Py_ssize_t lim = step - 1;
24424
f4cd78b3b774 Fix for
Michael W. Hudson <mwh@python.net>
parents: 24414
diff changeset
2509
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2510 garbage[i] = PyList_GET_ITEM(self, cur);
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2511
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2512 if (cur + step >= (size_t)Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2513 lim = Py_SIZE(self) - cur - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2514 }
24424
f4cd78b3b774 Fix for
Michael W. Hudson <mwh@python.net>
parents: 24414
diff changeset
2515
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2516 memmove(self->ob_item + cur - i,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2517 self->ob_item + cur + 1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2518 lim * sizeof(PyObject *));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2519 }
72468
3fb9464f9b02 Issue #1621: Fix undefined behaviour from signed overflow in datetime module hashes, array and list iterations, and get_integer (stringlib/string_format.h)
Mark Dickinson <mdickinson@enthought.com>
parents: 72418
diff changeset
2520 cur = start + (size_t)slicelength * step;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2521 if (cur < (size_t)Py_SIZE(self)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2522 memmove(self->ob_item + cur - slicelength,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2523 self->ob_item + cur,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2524 (Py_SIZE(self) - cur) *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2525 sizeof(PyObject *));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2526 }
31633
5bd455638c7a Optimize inner loops for subscript, repeat, and concat.
Raymond Hettinger <python@rcn.com>
parents: 31632
diff changeset
2527
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2528 Py_SIZE(self) -= slicelength;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2529 list_resize(self, Py_SIZE(self));
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2530
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2531 for (i = 0; i < slicelength; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2532 Py_DECREF(garbage[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2533 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2534 PyMem_FREE(garbage);
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2535
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2536 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2537 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2538 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2539 /* assign slice */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2540 PyObject *ins, *seq;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2541 PyObject **garbage, **seqitems, **selfitems;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2542 Py_ssize_t cur, i;
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2543
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2544 /* protect against a[::-1] = a */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2545 if (self == (PyListObject*)value) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2546 seq = list_slice((PyListObject*)value, 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2547 PyList_GET_SIZE(value));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2548 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2549 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2550 seq = PySequence_Fast(value,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2551 "must assign iterable "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2552 "to extended slice");
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2553 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2554 if (!seq)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2555 return -1;
26543
975482d5eb5c The final tweaks before closing
Michael W. Hudson <mwh@python.net>
parents: 26161
diff changeset
2556
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2557 if (PySequence_Fast_GET_SIZE(seq) != slicelength) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2558 PyErr_Format(PyExc_ValueError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2559 "attempt to assign sequence of "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2560 "size %zd to extended slice of "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2561 "size %zd",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2562 PySequence_Fast_GET_SIZE(seq),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2563 slicelength);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2564 Py_DECREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2565 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2566 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2567
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2568 if (!slicelength) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2569 Py_DECREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2570 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2571 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2572
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2573 garbage = (PyObject**)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2574 PyMem_MALLOC(slicelength*sizeof(PyObject*));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2575 if (!garbage) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2576 Py_DECREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2577 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2578 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2579 }
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2580
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2581 selfitems = self->ob_item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2582 seqitems = PySequence_Fast_ITEMS(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2583 for (cur = start, i = 0; i < slicelength;
72468
3fb9464f9b02 Issue #1621: Fix undefined behaviour from signed overflow in datetime module hashes, array and list iterations, and get_integer (stringlib/string_format.h)
Mark Dickinson <mdickinson@enthought.com>
parents: 72418
diff changeset
2584 cur += (size_t)step, i++) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2585 garbage[i] = selfitems[cur];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2586 ins = seqitems[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2587 Py_INCREF(ins);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2588 selfitems[cur] = ins;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2589 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2590
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2591 for (i = 0; i < slicelength; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2592 Py_DECREF(garbage[i]);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2593 }
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2594
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2595 PyMem_FREE(garbage);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2596 Py_DECREF(seq);
24310
5ede9bcc651e Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents: 24309
diff changeset
2597
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2598 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2599 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2600 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2601 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2602 PyErr_Format(PyExc_TypeError,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2603 "list indices must be integers, not %.200s",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2604 item->ob_type->tp_name);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2605 return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2606 }
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2607 }
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2608
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2609 static PyMappingMethods list_as_mapping = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2610 (lenfunc)list_length,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2611 (binaryfunc)list_subscript,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2612 (objobjargproc)list_ass_subscript
23778
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2613 };
245224d1b8c9 This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents: 23615
diff changeset
2614
5396
d1447950fa04 Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents: 5288
diff changeset
2615 PyTypeObject PyList_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2616 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2617 "list",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2618 sizeof(PyListObject),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2619 0,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2620 (destructor)list_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2621 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2622 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2623 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2624 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2625 (reprfunc)list_repr, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2626 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2627 &list_as_sequence, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2628 &list_as_mapping, /* tp_as_mapping */
65512
17c96aaf93c8 Remove unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents: 64248
diff changeset
2629 PyObject_HashNotImplemented, /* tp_hash */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2630 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2631 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2632 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2633 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2634 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2635 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2636 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LIST_SUBCLASS, /* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2637 list_doc, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2638 (traverseproc)list_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2639 (inquiry)list_clear, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2640 list_richcompare, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2641 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2642 list_iter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2643 0, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2644 list_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2645 0, /* tp_members */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2646 0, /* tp_getset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2647 0, /* tp_base */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2648 0, /* tp_dict */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2649 0, /* tp_descr_get */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2650 0, /* tp_descr_set */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2651 0, /* tp_dictoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2652 (initproc)list_init, /* tp_init */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2653 PyType_GenericAlloc, /* tp_alloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2654 PyType_GenericNew, /* tp_new */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2655 PyObject_GC_Del, /* tp_free */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2656 };
8511
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2657
69662f16a838 Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents: 8457
diff changeset
2658
23606
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2659 /*********************** List Iterator **************************/
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2660
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2661 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2662 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2663 long it_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2664 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
23606
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2665 } listiterobject;
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2666
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2667 static PyObject *list_iter(PyObject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2668 static void listiter_dealloc(listiterobject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2669 static int listiter_traverse(listiterobject *, visitproc, void *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2670 static PyObject *listiter_next(listiterobject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2671 static PyObject *listiter_len(listiterobject *);
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2672 static PyObject *listiter_reduce_general(void *_it, int forward);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2673 static PyObject *listiter_reduce(listiterobject *);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2674 static PyObject *listiter_setstate(listiterobject *, PyObject *state);
31686
823279ae43eb Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents: 31665
diff changeset
2675
36484
20f75d5e79e9 Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents: 35999
diff changeset
2676 PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2677 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2678 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
35636
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35365
diff changeset
2679
e22334b1da67 Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents: 35365
diff changeset
2680 static PyMethodDef listiter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2681 {"__length_hint__", (PyCFunction)listiter_len, METH_NOARGS, length_hint_doc},
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2682 {"__reduce__", (PyCFunction)listiter_reduce, METH_NOARGS, reduce_doc},
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2683 {"__setstate__", (PyCFunction)listiter_setstate, METH_O, setstate_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2684 {NULL, NULL} /* sentinel */
31686
823279ae43eb Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents: 31665
diff changeset
2685 };
823279ae43eb Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents: 31665
diff changeset
2686
23606
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2687 PyTypeObject PyListIter_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2688 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2689 "list_iterator", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2690 sizeof(listiterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2691 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2692 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2693 (destructor)listiter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2694 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2695 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2696 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2697 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2698 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2699 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2700 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2701 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2702 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2703 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2704 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2705 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2706 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2707 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2708 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2709 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2710 (traverseproc)listiter_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2711 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2712 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2713 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2714 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2715 (iternextfunc)listiter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2716 listiter_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2717 0, /* tp_members */
23606
5edea752a421 SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents: 23517
diff changeset
2718 };
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2719
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2720
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2721 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2722 list_iter(PyObject *seq)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2723 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2724 listiterobject *it;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2725
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2726 if (!PyList_Check(seq)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2727 PyErr_BadInternalCall();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2728 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2729 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2730 it = PyObject_GC_New(listiterobject, &PyListIter_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2731 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2732 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2733 it->it_index = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2734 Py_INCREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2735 it->it_seq = (PyListObject *)seq;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2736 _PyObject_GC_TRACK(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2737 return (PyObject *)it;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2738 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2739
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2740 static void
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2741 listiter_dealloc(listiterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2742 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2743 _PyObject_GC_UNTRACK(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2744 Py_XDECREF(it->it_seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2745 PyObject_GC_Del(it);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2746 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2747
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2748 static int
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2749 listiter_traverse(listiterobject *it, visitproc visit, void *arg)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2750 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2751 Py_VISIT(it->it_seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2752 return 0;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2753 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2754
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2755 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2756 listiter_next(listiterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2757 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2758 PyListObject *seq;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2759 PyObject *item;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2760
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2761 assert(it != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2762 seq = it->it_seq;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2763 if (seq == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2764 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2765 assert(PyList_Check(seq));
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2766
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2767 if (it->it_index < PyList_GET_SIZE(seq)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2768 item = PyList_GET_ITEM(seq, it->it_index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2769 ++it->it_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2770 Py_INCREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2771 return item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2772 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2773
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2774 Py_DECREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2775 it->it_seq = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2776 return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2777 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2778
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2779 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2780 listiter_len(listiterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2781 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2782 Py_ssize_t len;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2783 if (it->it_seq) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2784 len = PyList_GET_SIZE(it->it_seq) - it->it_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2785 if (len >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2786 return PyLong_FromSsize_t(len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2787 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2788 return PyLong_FromLong(0);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2789 }
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2790
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2791 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2792 listiter_reduce(listiterobject *it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2793 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2794 return listiter_reduce_general(it, 1);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2795 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2796
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2797 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2798 listiter_setstate(listiterobject *it, PyObject *state)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2799 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2800 long index = PyLong_AsLong(state);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2801 if (index == -1 && PyErr_Occurred())
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2802 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2803 if (it->it_seq != NULL) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2804 if (index < 0)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2805 index = 0;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2806 it->it_index = index;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2807 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2808 Py_RETURN_NONE;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2809 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2810
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2811 /*********************** List Reverse Iterator **************************/
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2812
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2813 typedef struct {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2814 PyObject_HEAD
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2815 Py_ssize_t it_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2816 PyListObject *it_seq; /* Set to NULL when iterator is exhausted */
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2817 } listreviterobject;
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2818
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2819 static PyObject *list_reversed(PyListObject *, PyObject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2820 static void listreviter_dealloc(listreviterobject *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2821 static int listreviter_traverse(listreviterobject *, visitproc, void *);
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2822 static PyObject *listreviter_next(listreviterobject *);
49925
86ee2e0d4d41 Issue 3689: list_reverseiterator should support __length_hint__ instead of __len__.
Raymond Hettinger <python@rcn.com>
parents: 49493
diff changeset
2823 static PyObject *listreviter_len(listreviterobject *);
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2824 static PyObject *listreviter_reduce(listreviterobject *);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2825 static PyObject *listreviter_setstate(listreviterobject *, PyObject *);
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31633
diff changeset
2826
49925
86ee2e0d4d41 Issue 3689: list_reverseiterator should support __length_hint__ instead of __len__.
Raymond Hettinger <python@rcn.com>
parents: 49493
diff changeset
2827 static PyMethodDef listreviter_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2828 {"__length_hint__", (PyCFunction)listreviter_len, METH_NOARGS, length_hint_doc},
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2829 {"__reduce__", (PyCFunction)listreviter_reduce, METH_NOARGS, reduce_doc},
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2830 {"__setstate__", (PyCFunction)listreviter_setstate, METH_O, setstate_doc},
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2831 {NULL, NULL} /* sentinel */
31635
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31633
diff changeset
2832 };
04eb2ebb46e2 Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents: 31633
diff changeset
2833
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2834 PyTypeObject PyListRevIter_Type = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2835 PyVarObject_HEAD_INIT(&PyType_Type, 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2836 "list_reverseiterator", /* tp_name */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2837 sizeof(listreviterobject), /* tp_basicsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2838 0, /* tp_itemsize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2839 /* methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2840 (destructor)listreviter_dealloc, /* tp_dealloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2841 0, /* tp_print */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2842 0, /* tp_getattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2843 0, /* tp_setattr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2844 0, /* tp_reserved */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2845 0, /* tp_repr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2846 0, /* tp_as_number */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2847 0, /* tp_as_sequence */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2848 0, /* tp_as_mapping */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2849 0, /* tp_hash */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2850 0, /* tp_call */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2851 0, /* tp_str */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2852 PyObject_GenericGetAttr, /* tp_getattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2853 0, /* tp_setattro */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2854 0, /* tp_as_buffer */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2855 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2856 0, /* tp_doc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2857 (traverseproc)listreviter_traverse, /* tp_traverse */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2858 0, /* tp_clear */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2859 0, /* tp_richcompare */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2860 0, /* tp_weaklistoffset */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2861 PyObject_SelfIter, /* tp_iter */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2862 (iternextfunc)listreviter_next, /* tp_iternext */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2863 listreviter_methods, /* tp_methods */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2864 0,
30874
682d1b67c7b5 Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents: 30849
diff changeset
2865 };
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2866
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2867 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2868 list_reversed(PyListObject *seq, PyObject *unused)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2869 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2870 listreviterobject *it;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2871
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2872 it = PyObject_GC_New(listreviterobject, &PyListRevIter_Type);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2873 if (it == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2874 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2875 assert(PyList_Check(seq));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2876 it->it_index = PyList_GET_SIZE(seq) - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2877 Py_INCREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2878 it->it_seq = seq;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2879 PyObject_GC_Track(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2880 return (PyObject *)it;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2881 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2882
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2883 static void
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2884 listreviter_dealloc(listreviterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2885 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2886 PyObject_GC_UnTrack(it);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2887 Py_XDECREF(it->it_seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2888 PyObject_GC_Del(it);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2889 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2890
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2891 static int
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2892 listreviter_traverse(listreviterobject *it, visitproc visit, void *arg)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2893 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2894 Py_VISIT(it->it_seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2895 return 0;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2896 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2897
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2898 static PyObject *
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2899 listreviter_next(listreviterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2900 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2901 PyObject *item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2902 Py_ssize_t index = it->it_index;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2903 PyListObject *seq = it->it_seq;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2904
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2905 if (index>=0 && index < PyList_GET_SIZE(seq)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2906 item = PyList_GET_ITEM(seq, index);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2907 it->it_index--;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2908 Py_INCREF(item);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2909 return item;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2910 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2911 it->it_index = -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2912 if (seq != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2913 it->it_seq = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2914 Py_DECREF(seq);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2915 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2916 return NULL;
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2917 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2918
49925
86ee2e0d4d41 Issue 3689: list_reverseiterator should support __length_hint__ instead of __len__.
Raymond Hettinger <python@rcn.com>
parents: 49493
diff changeset
2919 static PyObject *
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2920 listreviter_len(listreviterobject *it)
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2921 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2922 Py_ssize_t len = it->it_index + 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2923 if (it->it_seq == NULL || PyList_GET_SIZE(it->it_seq) < len)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2924 len = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59225
diff changeset
2925 return PyLong_FromSsize_t(len);
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36882
diff changeset
2926 }
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2927
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2928 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2929 listreviter_reduce(listreviterobject *it)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2930 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2931 return listiter_reduce_general(it, 0);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2932 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2933
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2934 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2935 listreviter_setstate(listreviterobject *it, PyObject *state)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2936 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2937 Py_ssize_t index = PyLong_AsSsize_t(state);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2938 if (index == -1 && PyErr_Occurred())
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2939 return NULL;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2940 if (it->it_seq != NULL) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2941 if (index < -1)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2942 index = -1;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2943 else if (index > PyList_GET_SIZE(it->it_seq) - 1)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2944 index = PyList_GET_SIZE(it->it_seq) - 1;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2945 it->it_index = index;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2946 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2947 Py_RETURN_NONE;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2948 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2949
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2950 /* common pickling support */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2951
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2952 static PyObject *
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2953 listiter_reduce_general(void *_it, int forward)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2954 {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2955 PyObject *list;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2956
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2957 /* the objects are not the same, index is of different types! */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2958 if (forward) {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2959 listiterobject *it = (listiterobject *)_it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2960 if (it->it_seq)
76105
fb907ee4fdfa Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76091
diff changeset
2961 return Py_BuildValue("N(O)l", _PyObject_GetBuiltin("iter"),
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2962 it->it_seq, it->it_index);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2963 } else {
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2964 listreviterobject *it = (listreviterobject *)_it;
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2965 if (it->it_seq)
76105
fb907ee4fdfa Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76091
diff changeset
2966 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("reversed"),
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2967 it->it_seq, it->it_index);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2968 }
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2969 /* empty iterator, create an empty list */
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2970 list = PyList_New(0);
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2971 if (list == NULL)
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2972 return NULL;
76105
fb907ee4fdfa Rename _PyIter_GetBuiltin to _PyObject_GetBuiltin, and do not include it in the stable ABI.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76091
diff changeset
2973 return Py_BuildValue("N(N)", _PyObject_GetBuiltin("iter"), list);
76091
4ff234337e24 Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 75876
diff changeset
2974 }