Mercurial > cpython-lru_cache-weakref
annotate Objects/listobject.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | b508253f2876 |
| children |
| rev | line source |
|---|---|
| 6 | 1 /* List object implementation */ |
| 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 | 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 | 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 | 180 } |
| 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 | 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 | 191 } |
| 192 | |
| 31983 | 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 | 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 | 213 } |
| 214 | |
| 215 int | |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
216 PyList_SetItem(PyObject *op, Py_ssize_t i, |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
217 PyObject *newitem) |
| 6 | 218 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
219 PyObject *olditem; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
220 PyObject **p; |
|
61467
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 | 237 } |
| 238 | |
| 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 | 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 | 270 } |
| 271 | |
| 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 | 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 | 280 } |
| 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 | 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 | 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 | 309 } |
| 310 | |
| 311 /* Methods */ | |
| 312 | |
| 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 | 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 | 335 } |
| 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 | 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; |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
341 PyObject *s; |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
342 _PyUnicodeWriter writer; |
|
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
|
343 |
|
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 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
|
345 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
|
346 } |
|
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 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
348 i = Py_ReprEnter((PyObject*)v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
349 if (i != 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
350 return i > 0 ? PyUnicode_FromString("[...]") : NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
351 } |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
17971
diff
changeset
|
352 |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
353 _PyUnicodeWriter_Init(&writer); |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
354 writer.overallocate = 1; |
|
87253
ead9043f69df
Issue #19513: Simplify list_repr()
Victor Stinner <victor.stinner@gmail.com>
parents:
87250
diff
changeset
|
355 /* "[" + "1" + ", 2" * (len - 1) + "]" */ |
|
ead9043f69df
Issue #19513: Simplify list_repr()
Victor Stinner <victor.stinner@gmail.com>
parents:
87250
diff
changeset
|
356 writer.min_length = 1 + 1 + (2 + 1) * (Py_SIZE(v) - 1) + 1; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
17971
diff
changeset
|
357 |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
358 if (_PyUnicodeWriter_WriteChar(&writer, '[') < 0) |
|
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
|
359 goto error; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
17971
diff
changeset
|
360 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
361 /* 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
|
362 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
|
363 for (i = 0; i < Py_SIZE(v); ++i) { |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
364 if (i > 0) { |
|
87263
d1ca05428c38
Add _PyUnicodeWriter_WriteASCIIString() function
Victor Stinner <victor.stinner@gmail.com>
parents:
87262
diff
changeset
|
365 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
366 goto error; |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
367 } |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
368 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
369 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
|
370 goto error; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
371 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
|
372 Py_LeaveRecursiveCall(); |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
373 if (s == NULL) |
|
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
|
374 goto error; |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
375 |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
376 if (_PyUnicodeWriter_WriteStr(&writer, s) < 0) { |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
377 Py_DECREF(s); |
|
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
|
378 goto error; |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
379 } |
|
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
380 Py_DECREF(s); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
381 } |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
382 |
|
87262
27461e6a7763
Issue #19513: Disable overallocation of the PyUnicodeWriter before the last write
Victor Stinner <victor.stinner@gmail.com>
parents:
87253
diff
changeset
|
383 writer.overallocate = 0; |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
384 if (_PyUnicodeWriter_WriteChar(&writer, ']') < 0) |
|
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
|
385 goto error; |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
17971
diff
changeset
|
386 |
|
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
|
387 Py_ReprLeave((PyObject *)v); |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
388 return _PyUnicodeWriter_Finish(&writer); |
|
18129
9d533ae574d2
SF bug 433228: repr(list) woes when len(list) big.
Tim Peters <tim.peters@gmail.com>
parents:
17971
diff
changeset
|
389 |
|
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
|
390 error: |
|
87250
fc7ceb001eec
Issue #19513: repr(list) now uses the PyUnicodeWriter API, it is faster than
Victor Stinner <victor.stinner@gmail.com>
parents:
85157
diff
changeset
|
391 _PyUnicodeWriter_Dealloc(&writer); |
|
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 | 394 } |
| 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 | 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 | 400 } |
| 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 | 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 | 429 } |
| 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 | 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 | 458 } |
| 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 | 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 | 506 #undef b |
| 507 } | |
| 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 | 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 | 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 */ |
|
84717
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
647 Py_ssize_t tail; |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
648 tail = (Py_SIZE(a) - ihigh) * sizeof(PyObject *); |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
649 memmove(&item[ihigh+d], &item[ihigh], tail); |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
650 if (list_resize(a, Py_SIZE(a) + d) < 0) { |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
651 memmove(&item[ihigh], &item[ihigh+d], tail); |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
652 memcpy(&item[ilow], recycle, s); |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
653 goto Error; |
|
3f25a7dd8346
Issue #18408: Fix list_ass_slice(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84695
diff
changeset
|
654 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
655 item = a->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
656 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
657 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
|
658 k = Py_SIZE(a); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
659 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
|
660 goto Error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
661 item = a->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
662 memmove(&item[ihigh+d], &item[ihigh], |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
663 (k - ihigh)*sizeof(PyObject *)); |
|
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 = 0; k < n; k++, ilow++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
666 PyObject *w = vitem[k]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
667 Py_XINCREF(w); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
668 item[ilow] = w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
669 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
670 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
|
671 Py_XDECREF(recycle[k]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
672 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
|
673 Error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
674 if (recycle != recycle_on_stack) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
675 PyMem_FREE(recycle); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
676 Py_XDECREF(v_as_SF); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
677 return result; |
| 6 | 678 #undef b |
| 679 } | |
| 680 | |
|
1313
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1211
diff
changeset
|
681 int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
682 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
|
683 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
684 if (!PyList_Check(a)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
685 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
686 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
687 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
688 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
|
689 } |
|
6ee380349c84
* Added gmtime/localtime/mktime and SYSV timezone globals to timemodule.c.
Guido van Rossum <guido@python.org>
parents:
1211
diff
changeset
|
690 |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
691 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
692 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
|
693 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
694 PyObject **items; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
695 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
|
696 |
|
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
697 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
698 size = PyList_GET_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
699 if (size == 0 || n == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
700 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
701 return (PyObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
702 } |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
703 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
704 if (n < 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
705 (void)list_clear(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
706 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
707 return (PyObject *)self; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
708 } |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
709 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
710 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
|
711 return PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
712 } |
|
44999
7c02182e2979
Merged revisions 60284-60349 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44351
diff
changeset
|
713 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
714 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
|
715 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
|
716 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
717 p = size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
718 items = self->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
719 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
|
720 for (j = 0; j < size; j++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
721 PyObject *o = items[j]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
722 Py_INCREF(o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
723 items[p++] = o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
724 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
725 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
726 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
727 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
|
728 } |
|
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
729 |
|
167
3fa2b14be270
Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents:
155
diff
changeset
|
730 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
731 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
|
732 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
733 PyObject *old_value; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
734 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
|
735 PyErr_SetString(PyExc_IndexError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
736 "list assignment index out of range"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
737 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
738 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
739 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
740 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
|
741 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
742 old_value = a->ob_item[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
743 a->ob_item[i] = v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
744 Py_DECREF(old_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
745 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
|
746 } |
|
3fa2b14be270
Swapped list_ass_item and list_ass_slice to satisfy Standard C.
Guido van Rossum <guido@python.org>
parents:
155
diff
changeset
|
747 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
748 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
749 listinsert(PyListObject *self, PyObject *args) |
| 6 | 750 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
751 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
752 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
753 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
|
754 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
755 if (ins1(self, i, v) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
756 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
757 return NULL; |
| 6 | 758 } |
| 759 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
760 static PyObject * |
|
68129
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
761 listclear(PyListObject *self) |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
762 { |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
763 list_clear(self); |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
764 Py_RETURN_NONE; |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
765 } |
|
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 static PyObject * |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
768 listcopy(PyListObject *self) |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
769 { |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
770 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
|
771 } |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
772 |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
773 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
|
774 listappend(PyListObject *self, PyObject *v) |
| 6 | 775 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
776 if (app1(self, v) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
777 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
778 return NULL; |
| 6 | 779 } |
| 780 | |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
781 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
|
782 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
|
783 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
784 PyObject *it; /* iter(v) */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
785 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
|
786 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
|
787 Py_ssize_t mn; /* m + n */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
788 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
789 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
|
790 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
791 /* Special cases: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
792 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
|
793 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
|
794 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
795 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
|
796 PyObject **src, **dest; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
797 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
|
798 if (!b) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
799 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
800 n = PySequence_Fast_GET_SIZE(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
801 if (n == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
802 /* short circuit when b is empty */ |
|
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 Py_RETURN_NONE; |
|
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 m = Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
807 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
|
808 Py_DECREF(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
809 return NULL; |
|
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 /* 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
|
812 * 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
|
813 * 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
|
814 * before calling PySequence_Fast_ITEMS. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
815 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
816 /* 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
|
817 src = PySequence_Fast_ITEMS(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
818 dest = self->ob_item + m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
819 for (i = 0; i < n; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
820 PyObject *o = src[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
821 Py_INCREF(o); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
822 dest[i] = o; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
823 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
824 Py_DECREF(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
825 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
826 } |
|
31528
1233bd95da1a
Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents:
31527
diff
changeset
|
827 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
828 it = PyObject_GetIter(b); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
829 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
830 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
831 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
|
832 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
833 /* Guess a result list size. */ |
|
79511
a7ec0a1b0f7c
Issue #16148: implemented PEP 424
Armin Ronacher <armin.ronacher@active-4.com>
parents:
77577
diff
changeset
|
834 n = PyObject_LengthHint(b, 8); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
835 if (n == -1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
836 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
837 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
838 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
839 m = Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
840 mn = m + n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
841 if (mn >= m) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
842 /* Make room. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
843 if (list_resize(self, mn) == -1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
844 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
845 /* Make the list sane again. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
846 Py_SIZE(self) = m; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
847 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
848 /* 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
|
849 * 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
|
850 * 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
|
851 */ |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
852 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
853 /* Run iterator to exhaustion. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
854 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
855 PyObject *item = iternext(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
856 if (item == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
857 if (PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
858 if (PyErr_ExceptionMatches(PyExc_StopIteration)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
859 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
860 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
861 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
862 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
863 break; |
|
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 if (Py_SIZE(self) < self->allocated) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
866 /* steals ref */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
867 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
|
868 ++Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
869 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
870 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
871 int status = app1(self, item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
872 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
|
873 if (status < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
874 goto error; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
875 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
876 } |
|
31528
1233bd95da1a
Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents:
31527
diff
changeset
|
877 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
878 /* Cut back result list if initial guess was too large. */ |
|
84671
395e67f348e7
Issue #18408: Fix list.extend(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84510
diff
changeset
|
879 if (Py_SIZE(self) < self->allocated) { |
|
395e67f348e7
Issue #18408: Fix list.extend(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84510
diff
changeset
|
880 if (list_resize(self, Py_SIZE(self)) < 0) |
|
395e67f348e7
Issue #18408: Fix list.extend(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84510
diff
changeset
|
881 goto error; |
|
395e67f348e7
Issue #18408: Fix list.extend(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84510
diff
changeset
|
882 } |
|
33589
23036c7af687
Checkin Tim's fix to an error discussed on python-dev.
Raymond Hettinger <python@rcn.com>
parents:
33464
diff
changeset
|
883 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
884 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
885 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
|
886 |
|
1233bd95da1a
Refactor list_extend() and list_fill() for gains in code size, memory
Raymond Hettinger <python@rcn.com>
parents:
31527
diff
changeset
|
887 error: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
888 Py_DECREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
889 return NULL; |
|
14161
52fd496d3532
Support for the in-place operations introduced by augmented assignment. Only
Thomas Wouters <thomas@python.org>
parents:
14125
diff
changeset
|
890 } |
|
9317
003b42c9f24d
listextend(): New method which implements L.extend(L2).
Barry Warsaw <barry@python.org>
parents:
9275
diff
changeset
|
891 |
|
31642
30e305bfdddb
Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents:
31641
diff
changeset
|
892 PyObject * |
|
30e305bfdddb
Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents:
31641
diff
changeset
|
893 _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
|
894 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
895 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
|
896 } |
|
30e305bfdddb
Eliminate a big block of duplicate code in PySequence_List() by
Raymond Hettinger <python@rcn.com>
parents:
31641
diff
changeset
|
897 |
|
9317
003b42c9f24d
listextend(): New method which implements L.extend(L2).
Barry Warsaw <barry@python.org>
parents:
9275
diff
changeset
|
898 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
|
899 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
|
900 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
901 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
|
902 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
903 result = listextend(self, other); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
904 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
905 return result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
906 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
907 Py_INCREF(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
908 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
|
909 } |
|
eea674bf7b59
list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents:
31636
diff
changeset
|
910 |
|
eea674bf7b59
list_inplace_concat() is now expressed in terms of list_extend() which
Raymond Hettinger <python@rcn.com>
parents:
31636
diff
changeset
|
911 static PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
912 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
|
913 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
914 Py_ssize_t i = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
915 PyObject *v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
916 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
|
917 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
918 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
|
919 return NULL; |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39658
diff
changeset
|
920 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
921 if (Py_SIZE(self) == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
922 /* Special-case most common failure cause */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
923 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
|
924 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
925 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
926 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
927 i += Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
928 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
|
929 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
|
930 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
931 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
932 v = self->ob_item[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
933 if (i == Py_SIZE(self) - 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
934 status = list_resize(self, Py_SIZE(self) - 1); |
|
84510
68887e177dd4
Issue #18408: Fix list.pop() to handle list_resize() failure (MemoryError).
Victor Stinner <victor.stinner@gmail.com>
parents:
84329
diff
changeset
|
935 if (status >= 0) |
|
68887e177dd4
Issue #18408: Fix list.pop() to handle list_resize() failure (MemoryError).
Victor Stinner <victor.stinner@gmail.com>
parents:
84329
diff
changeset
|
936 return v; /* and v now owns the reference the list had */ |
|
68887e177dd4
Issue #18408: Fix list.pop() to handle list_resize() failure (MemoryError).
Victor Stinner <victor.stinner@gmail.com>
parents:
84329
diff
changeset
|
937 else |
|
68887e177dd4
Issue #18408: Fix list.pop() to handle list_resize() failure (MemoryError).
Victor Stinner <victor.stinner@gmail.com>
parents:
84329
diff
changeset
|
938 return NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
939 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
940 Py_INCREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
941 status = list_ass_slice(self, i, i+1, (PyObject *)NULL); |
|
84695
97bb3bdf1443
Issue #18408: Fix listpop(), handle list_ass_slice() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84671
diff
changeset
|
942 if (status < 0) { |
|
97bb3bdf1443
Issue #18408: Fix listpop(), handle list_ass_slice() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84671
diff
changeset
|
943 Py_DECREF(v); |
|
97bb3bdf1443
Issue #18408: Fix listpop(), handle list_ass_slice() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84671
diff
changeset
|
944 return NULL; |
|
97bb3bdf1443
Issue #18408: Fix listpop(), handle list_ass_slice() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
84671
diff
changeset
|
945 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
946 return v; |
|
8595
635c3d94a948
Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents:
8515
diff
changeset
|
947 } |
|
635c3d94a948
Added doc strings for methods and a new pop() method.
Guido van Rossum <guido@python.org>
parents:
8515
diff
changeset
|
948 |
|
24309
08d307cbccd9
Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
949 /* 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
|
950 static void |
|
08d307cbccd9
Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
951 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
|
952 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
953 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
|
954 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
955 --hi; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
956 while (lo < hi) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
957 PyObject *t = *lo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
958 *lo = *hi; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
959 *hi = t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
960 ++lo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
961 --hi; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
962 } |
|
24309
08d307cbccd9
Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
963 } |
|
08d307cbccd9
Cleanup: Define one internal utility for reversing a list slice, and
Tim Peters <tim.peters@gmail.com>
parents:
24280
diff
changeset
|
964 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
965 /* 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
|
966 * 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
|
967 */ |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
968 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
969 /* 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
|
970 * 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
|
971 * 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
|
972 * also the values. |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
973 * |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
974 * 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
|
975 * values are always moved in sync. |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
976 */ |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
977 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
978 typedef struct { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
979 PyObject **keys; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
980 PyObject **values; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
981 } sortslice; |
|
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 Py_LOCAL_INLINE(void) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
984 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
|
985 { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
986 s1->keys[i] = s2->keys[j]; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
987 if (s1->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
988 s1->values[i] = s2->values[j]; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
989 } |
|
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 Py_LOCAL_INLINE(void) |
| 66617 | 992 sortslice_copy_incr(sortslice *dst, sortslice *src) |
| 993 { | |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
994 *dst->keys++ = *src->keys++; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
995 if (dst->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
996 *dst->values++ = *src->values++; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
997 } |
|
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 Py_LOCAL_INLINE(void) |
| 66617 | 1000 sortslice_copy_decr(sortslice *dst, sortslice *src) |
| 1001 { | |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1002 *dst->keys-- = *src->keys--; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1003 if (dst->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1004 *dst->values-- = *src->values--; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1005 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1006 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1007 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1008 Py_LOCAL_INLINE(void) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1009 sortslice_memcpy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j, |
| 66617 | 1010 Py_ssize_t n) |
| 1011 { | |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1012 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
|
1013 if (s1->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1014 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
|
1015 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1016 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1017 Py_LOCAL_INLINE(void) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1018 sortslice_memmove(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j, |
| 66617 | 1019 Py_ssize_t n) |
| 1020 { | |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1021 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
|
1022 if (s1->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1023 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
|
1024 } |
|
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 Py_LOCAL_INLINE(void) |
| 66617 | 1027 sortslice_advance(sortslice *slice, Py_ssize_t n) |
| 1028 { | |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1029 slice->keys += n; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1030 if (slice->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1031 slice->values += n; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1032 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1033 |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
44999
diff
changeset
|
1034 /* 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
|
1035 * 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
|
1036 */ |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
1037 |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
44999
diff
changeset
|
1038 #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
|
1039 |
|
614358e3c4f6
Sped the usual case for sorting by calling PyObject_RichCompareBool
Tim Peters <tim.peters@gmail.com>
parents:
24515
diff
changeset
|
1040 /* 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
|
1041 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
|
1042 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
|
1043 */ |
|
45061
b9ee31a26f38
Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents:
44999
diff
changeset
|
1044 #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
|
1045 if (k) |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
1046 |
|
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
|
1047 /* 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
|
1048 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
|
1049 elements. |
|
8515
16b3a121ff77
Minor cleanup by Tim after my changes:
Guido van Rossum <guido@python.org>
parents:
8511
diff
changeset
|
1050 [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
|
1051 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
|
1052 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
|
1053 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
|
1054 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
|
1055 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
|
1056 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
|
1057 */ |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
1058 static int |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1059 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
|
1060 { |
|
85157
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
1061 Py_ssize_t k; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
1062 PyObject **l, **p, **r; |
|
e7f6cef7a4cc
Issue #18722: Remove uses of the "register" keyword in C code.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84717
diff
changeset
|
1063 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
|
1064 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1065 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
|
1066 /* assert [lo, start) is sorted */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1067 if (lo.keys == start) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1068 ++start; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1069 for (; start < hi; ++start) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1070 /* set l to where *start belongs */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1071 l = lo.keys; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1072 r = start; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1073 pivot = *r; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1074 /* Invariants: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1075 * pivot >= all in [lo, l). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1076 * pivot < all in [r, start). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1077 * 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
|
1078 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1079 assert(l < r); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1080 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1081 p = l + ((r - l) >> 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1082 IFLT(pivot, *p) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1083 r = p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1084 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1085 l = p+1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1086 } while (l < r); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1087 assert(l == r); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1088 /* 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
|
1089 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
|
1090 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
|
1091 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
|
1092 Slide over to make room. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1093 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
|
1094 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
|
1095 for (p = start; p > l; --p) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1096 *p = *(p-1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1097 *l = pivot; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1098 if (lo.values != NULL) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1099 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
|
1100 p = start + offset; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1101 pivot = *p; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1102 l += offset; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1103 for (p = start + offset; p > l; --p) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1104 *p = *(p-1); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1105 *l = pivot; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1106 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1107 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1108 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
|
1109 |
|
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 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1111 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
|
1112 } |
|
69662f16a838
Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents:
8457
diff
changeset
|
1113 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1114 /* |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1115 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
|
1116 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
|
1117 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1118 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
|
1119 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1120 or the longest descending sequence, with |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
1121 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1122 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
|
1123 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1124 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
|
1125 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
|
1126 "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
|
1127 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
|
1128 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
|
1129 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1130 Returns -1 in case of error. |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1131 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1132 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
|
1133 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
|
1134 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1135 Py_ssize_t k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1136 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
|
1137 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1138 assert(lo < hi); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1139 *descending = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1140 ++lo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1141 if (lo == hi) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1142 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
|
1143 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1144 n = 2; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1145 IFLT(*lo, *(lo-1)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1146 *descending = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1147 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
|
1148 IFLT(*lo, *(lo-1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1149 ; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1150 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1151 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1152 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1153 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1154 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1155 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
|
1156 IFLT(*lo, *(lo-1)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1157 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1158 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1159 } |
|
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
|
1160 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1161 return n; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1162 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1163 return -1; |
|
24456
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 |
|
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 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
|
1168 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
|
1169 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
|
1170 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
|
1171 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1172 "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
|
1173 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1174 "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
|
1175 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
|
1176 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1177 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
|
1178 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1179 a[k-1] < key <= a[k] |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1180 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1181 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
|
1182 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
|
1183 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
|
1184 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1185 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
|
1186 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1187 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
|
1188 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
|
1189 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1190 Py_ssize_t ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1191 Py_ssize_t lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1192 Py_ssize_t k; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1193 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1194 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
|
1195 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1196 a += hint; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1197 lastofs = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1198 ofs = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1199 IFLT(*a, key) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1200 /* a[hint] < key -- gallop right, until |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1201 * 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
|
1202 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1203 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
|
1204 while (ofs < maxofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1205 IFLT(a[ofs], key) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1206 lastofs = ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1207 ofs = (ofs << 1) + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1208 if (ofs <= 0) /* int overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1209 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1210 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1211 else /* key <= a[hint + ofs] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1212 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1213 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1214 if (ofs > maxofs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1215 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1216 /* 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
|
1217 lastofs += hint; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1218 ofs += hint; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1219 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1220 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1221 /* key <= a[hint] -- gallop left, until |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1222 * 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
|
1223 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1224 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
|
1225 while (ofs < maxofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1226 IFLT(*(a-ofs), key) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1227 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1228 /* key <= a[hint - ofs] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1229 lastofs = ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1230 ofs = (ofs << 1) + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1231 if (ofs <= 0) /* int overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1232 ofs = maxofs; |
|
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 if (ofs > maxofs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1235 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1236 /* 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
|
1237 k = lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1238 lastofs = hint - ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1239 ofs = hint - k; |
|
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 a -= hint; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1242 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1243 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
|
1244 /* 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
|
1245 * 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
|
1246 * 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
|
1247 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1248 ++lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1249 while (lastofs < ofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1250 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
|
1251 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1252 IFLT(a[m], key) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1253 lastofs = m+1; /* a[m] < key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1254 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1255 ofs = m; /* key <= a[m] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1256 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1257 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
|
1258 return ofs; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1259 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1260 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1261 return -1; |
|
24456
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 |
|
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 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
|
1266 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
|
1267 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1268 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
|
1269 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1270 a[k-1] <= key < a[k] |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1271 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1272 or -1 if error. |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1273 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1274 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
|
1275 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
|
1276 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
|
1277 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1278 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
|
1279 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
|
1280 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1281 Py_ssize_t ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1282 Py_ssize_t lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1283 Py_ssize_t k; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1284 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1285 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
|
1286 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1287 a += hint; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1288 lastofs = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1289 ofs = 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1290 IFLT(key, *a) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1291 /* key < a[hint] -- gallop left, until |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1292 * 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
|
1293 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1294 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
|
1295 while (ofs < maxofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1296 IFLT(key, *(a-ofs)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1297 lastofs = ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1298 ofs = (ofs << 1) + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1299 if (ofs <= 0) /* int overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1300 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1301 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1302 else /* a[hint - ofs] <= key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1303 break; |
|
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 if (ofs > maxofs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1306 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1307 /* 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
|
1308 k = lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1309 lastofs = hint - ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1310 ofs = hint - k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1311 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1312 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1313 /* a[hint] <= key -- gallop right, until |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1314 * 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
|
1315 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1316 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
|
1317 while (ofs < maxofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1318 IFLT(key, a[ofs]) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1319 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1320 /* a[hint + ofs] <= key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1321 lastofs = ofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1322 ofs = (ofs << 1) + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1323 if (ofs <= 0) /* int overflow */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1324 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1325 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1326 if (ofs > maxofs) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1327 ofs = maxofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1328 /* 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
|
1329 lastofs += hint; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1330 ofs += hint; |
|
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 a -= hint; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1333 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1334 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
|
1335 /* 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
|
1336 * 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
|
1337 * 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
|
1338 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1339 ++lastofs; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1340 while (lastofs < ofs) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1341 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
|
1342 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1343 IFLT(key, a[m]) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1344 ofs = m; /* key < a[m] */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1345 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1346 lastofs = m+1; /* a[m] <= key */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1347 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1348 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
|
1349 return ofs; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1350 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1351 fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1352 return -1; |
|
24456
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 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1355 /* 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
|
1356 * 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
|
1357 * 32 * phi ** MAX_MERGE_PENDING |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1358 * 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
|
1359 * with 2**64 elements. |
|
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 #define MAX_MERGE_PENDING 85 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1362 |
|
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
|
1363 /* 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
|
1364 * 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
|
1365 */ |
|
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
|
1366 #define MIN_GALLOP 7 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1367 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1368 /* Avoid malloc for small temp arrays. */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1369 #define MERGESTATE_TEMP_SIZE 256 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1370 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1371 /* 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
|
1372 * 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
|
1373 */ |
|
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
|
1374 struct s_slice { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1375 sortslice base; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1376 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
|
1377 }; |
|
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 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1379 typedef struct s_MergeState { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1380 /* 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
|
1381 * 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
|
1382 * 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
|
1383 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1384 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
|
1385 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1386 /* '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
|
1387 * alloced entries. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1388 */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1389 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
|
1390 Py_ssize_t alloced; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1391 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1392 /* 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
|
1393 * 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
|
1394 * 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
|
1395 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1396 * 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
|
1397 * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1398 * 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
|
1399 * 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
|
1400 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1401 int n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1402 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
|
1403 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1404 /* '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
|
1405 PyObject *temparray[MERGESTATE_TEMP_SIZE]; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1406 } MergeState; |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1407 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1408 /* Conceptually a MergeState's constructor. */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1409 static void |
|
67347
3bf4d9f1660a
Issue #9566: use Py_ssize_t instead of int
Victor Stinner <victor.stinner@haypocalc.com>
parents:
66664
diff
changeset
|
1410 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
|
1411 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1412 assert(ms != NULL); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1413 if (has_keyfunc) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1414 /* 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
|
1415 * 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
|
1416 * 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
|
1417 * 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
|
1418 */ |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1419 ms->alloced = (list_size + 1) / 2; |
|
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 /* 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
|
1422 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
|
1423 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
|
1424 if (MERGESTATE_TEMP_SIZE / 2 < ms->alloced) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1425 ms->alloced = MERGESTATE_TEMP_SIZE / 2; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1426 ms->a.values = &ms->temparray[ms->alloced]; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1427 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1428 else { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1429 ms->alloced = MERGESTATE_TEMP_SIZE; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1430 ms->a.values = NULL; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1431 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1432 ms->a.keys = ms->temparray; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1433 ms->n = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1434 ms->min_gallop = MIN_GALLOP; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1435 } |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1436 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1437 /* 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
|
1438 * 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
|
1439 * 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
|
1440 */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1441 static void |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1442 merge_freemem(MergeState *ms) |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1443 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1444 assert(ms != NULL); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1445 if (ms->a.keys != ms->temparray) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1446 PyMem_Free(ms->a.keys); |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1447 } |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1448 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1449 /* 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
|
1450 * 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
|
1451 */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1452 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1453 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
|
1454 { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1455 int multiplier; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1456 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1457 assert(ms != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1458 if (need <= ms->alloced) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1459 return 0; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1460 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1461 multiplier = ms->a.values != NULL ? 2 : 1; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1462 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1463 /* 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
|
1464 * 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
|
1465 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1466 merge_freemem(ms); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1467 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
|
1468 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1469 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1470 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1471 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
|
1472 * sizeof(PyObject *)); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1473 if (ms->a.keys != NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1474 ms->alloced = need; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1475 if (ms->a.values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1476 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
|
1477 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1478 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1479 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1480 return -1; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1481 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1482 #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
|
1483 merge_getmem(MS, NEED)) |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1484 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1485 /* 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
|
1486 * 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
|
1487 * 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
|
1488 * 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
|
1489 * successful, -1 if error. |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1490 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1491 static Py_ssize_t |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1492 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
|
1493 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
|
1494 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1495 Py_ssize_t k; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1496 sortslice dest; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1497 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
|
1498 Py_ssize_t min_gallop; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1499 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1500 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
|
1501 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
|
1502 if (MERGE_GETMEM(ms, na) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1503 return -1; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1504 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
|
1505 dest = ssa; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1506 ssa = ms->a; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1507 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1508 sortslice_copy_incr(&dest, &ssb); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1509 --nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1510 if (nb == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1511 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1512 if (na == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1513 goto CopyB; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1514 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1515 min_gallop = ms->min_gallop; |
|
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 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
|
1518 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
|
1519 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1520 /* 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
|
1521 * appears to win consistently. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1522 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1523 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1524 assert(na > 1 && nb > 0); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1525 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
|
1526 if (k) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1527 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1528 goto Fail; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1529 sortslice_copy_incr(&dest, &ssb); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1530 ++bcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1531 acount = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1532 --nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1533 if (nb == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1534 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1535 if (bcount >= min_gallop) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1536 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1537 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1538 else { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1539 sortslice_copy_incr(&dest, &ssa); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1540 ++acount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1541 bcount = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1542 --na; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1543 if (na == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1544 goto CopyB; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1545 if (acount >= min_gallop) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1546 break; |
|
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 } |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1549 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1550 /* 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
|
1551 * 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
|
1552 * (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
|
1553 * anymore. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1554 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1555 ++min_gallop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1556 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1557 assert(na > 1 && nb > 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1558 min_gallop -= min_gallop > 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1559 ms->min_gallop = min_gallop; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1560 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
|
1561 acount = k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1562 if (k) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1563 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1564 goto Fail; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1565 sortslice_memcpy(&dest, 0, &ssa, 0, k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1566 sortslice_advance(&dest, k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1567 sortslice_advance(&ssa, k); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1568 na -= k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1569 if (na == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1570 goto CopyB; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1571 /* 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
|
1572 * 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
|
1573 * that it is. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1574 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1575 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1576 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1577 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1578 sortslice_copy_incr(&dest, &ssb); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1579 --nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1580 if (nb == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1581 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
|
1582 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1583 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
|
1584 bcount = k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1585 if (k) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1586 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1587 goto Fail; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1588 sortslice_memmove(&dest, 0, &ssb, 0, k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1589 sortslice_advance(&dest, k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1590 sortslice_advance(&ssb, k); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1591 nb -= k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1592 if (nb == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1593 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1594 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1595 sortslice_copy_incr(&dest, &ssa); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1596 --na; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1597 if (na == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1598 goto CopyB; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1599 } 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
|
1600 ++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
|
1601 ms->min_gallop = min_gallop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1602 } |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1603 Succeed: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1604 result = 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1605 Fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1606 if (na) |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1607 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
|
1608 return result; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1609 CopyB: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1610 assert(na == 1 && nb > 0); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1611 /* 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
|
1612 sortslice_memmove(&dest, 0, &ssb, 0, nb); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1613 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
|
1614 return 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1615 } |
|
6814
0fe3dc28b92c
Modified quicksort by Raymund Galvin, after studying the GNU libg++
Guido van Rossum <guido@python.org>
parents:
6154
diff
changeset
|
1616 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1617 /* 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
|
1618 * 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
|
1619 * 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
|
1620 * 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
|
1621 * successful, -1 if error. |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1622 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1623 static Py_ssize_t |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1624 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
|
1625 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
|
1626 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1627 Py_ssize_t k; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1628 sortslice dest, basea, baseb; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1629 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
|
1630 Py_ssize_t min_gallop; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1631 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1632 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
|
1633 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
|
1634 if (MERGE_GETMEM(ms, nb) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1635 return -1; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1636 dest = ssb; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1637 sortslice_advance(&dest, nb-1); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1638 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
|
1639 basea = ssa; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1640 baseb = ms->a; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1641 ssb.keys = ms->a.keys + nb - 1; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1642 if (ssb.values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1643 ssb.values = ms->a.values + nb - 1; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1644 sortslice_advance(&ssa, na - 1); |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1645 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1646 sortslice_copy_decr(&dest, &ssa); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1647 --na; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1648 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1649 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1650 if (nb == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1651 goto CopyA; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1652 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1653 min_gallop = ms->min_gallop; |
|
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 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
|
1656 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
|
1657 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1658 /* 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
|
1659 * appears to win consistently. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1660 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1661 for (;;) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1662 assert(na > 0 && nb > 1); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1663 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
|
1664 if (k) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1665 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1666 goto Fail; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1667 sortslice_copy_decr(&dest, &ssa); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1668 ++acount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1669 bcount = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1670 --na; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1671 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1672 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1673 if (acount >= min_gallop) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1674 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1675 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1676 else { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1677 sortslice_copy_decr(&dest, &ssb); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1678 ++bcount; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1679 acount = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1680 --nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1681 if (nb == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1682 goto CopyA; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1683 if (bcount >= min_gallop) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1684 break; |
|
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 } |
|
8164
ea59bb921380
Quicksort retuned by Tim Peters.
Guido van Rossum <guido@python.org>
parents:
7986
diff
changeset
|
1687 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1688 /* 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
|
1689 * 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
|
1690 * (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
|
1691 * anymore. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1692 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1693 ++min_gallop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1694 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1695 assert(na > 0 && nb > 1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1696 min_gallop -= min_gallop > 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1697 ms->min_gallop = min_gallop; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1698 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
|
1699 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1700 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1701 k = na - k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1702 acount = k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1703 if (k) { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1704 sortslice_advance(&dest, -k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1705 sortslice_advance(&ssa, -k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1706 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
|
1707 na -= k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1708 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1709 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1710 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1711 sortslice_copy_decr(&dest, &ssb); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1712 --nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1713 if (nb == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1714 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
|
1715 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1716 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
|
1717 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1718 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1719 k = nb - k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1720 bcount = k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1721 if (k) { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1722 sortslice_advance(&dest, -k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1723 sortslice_advance(&ssb, -k); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1724 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
|
1725 nb -= k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1726 if (nb == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1727 goto CopyA; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1728 /* 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
|
1729 * 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
|
1730 * that it is. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1731 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1732 if (nb == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1733 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1734 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1735 sortslice_copy_decr(&dest, &ssa); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1736 --na; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1737 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1738 goto Succeed; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1739 } 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
|
1740 ++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
|
1741 ms->min_gallop = min_gallop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1742 } |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1743 Succeed: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1744 result = 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1745 Fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1746 if (nb) |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1747 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
|
1748 return result; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1749 CopyA: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1750 assert(nb == 1 && na > 0); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1751 /* 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
|
1752 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
|
1753 sortslice_advance(&dest, -na); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1754 sortslice_advance(&ssa, -na); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1755 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
|
1756 return 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1757 } |
|
6814
0fe3dc28b92c
Modified quicksort by Raymund Galvin, after studying the GNU libg++
Guido van Rossum <guido@python.org>
parents:
6154
diff
changeset
|
1758 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1759 /* 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
|
1760 * 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
|
1761 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1762 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1763 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
|
1764 { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1765 sortslice ssa, ssb; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1766 Py_ssize_t na, nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1767 Py_ssize_t k; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1768 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1769 assert(ms != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1770 assert(ms->n >= 2); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1771 assert(i >= 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1772 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
|
1773 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1774 ssa = ms->pending[i].base; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1775 na = ms->pending[i].len; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1776 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
|
1777 nb = ms->pending[i+1].len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1778 assert(na > 0 && nb > 0); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1779 assert(ssa.keys + na == ssb.keys); |
|
8322
e6ef0e39e35c
Tim's quicksort on May 10.
Guido van Rossum <guido@python.org>
parents:
8186
diff
changeset
|
1780 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1781 /* 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
|
1782 * 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
|
1783 * 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
|
1784 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1785 ms->pending[i].len = na + nb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1786 if (i == ms->n - 3) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1787 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
|
1788 --ms->n; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1789 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1790 /* 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
|
1791 * ignored (already in place). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1792 */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1793 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
|
1794 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1795 return -1; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1796 sortslice_advance(&ssa, k); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1797 na -= k; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1798 if (na == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1799 return 0; |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
1800 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1801 /* 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
|
1802 * ignored (already in place). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1803 */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1804 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
|
1805 if (nb <= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1806 return nb; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1807 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1808 /* 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
|
1809 * min(na, nb) elements. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1810 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1811 if (na <= nb) |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1812 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
|
1813 else |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1814 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
|
1815 } |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1816 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1817 /* 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
|
1818 * 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
|
1819 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1820 * 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
|
1821 * 2. len[-2] > len[-1] |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1822 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1823 * See listsort.txt for more info. |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1824 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1825 * 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
|
1826 */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1827 static int |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1828 merge_collapse(MergeState *ms) |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1829 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1830 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
|
1831 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1832 assert(ms); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1833 while (ms->n > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1834 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
|
1835 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
|
1836 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
|
1837 --n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1838 if (merge_at(ms, n) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1839 return -1; |
|
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 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
|
1842 if (merge_at(ms, n) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1843 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1844 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1845 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1846 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1847 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1848 return 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1849 } |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1850 |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1851 /* 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
|
1852 * 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
|
1853 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1854 * 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
|
1855 */ |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1856 static int |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1857 merge_force_collapse(MergeState *ms) |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1858 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1859 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
|
1860 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1861 assert(ms); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1862 while (ms->n > 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1863 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
|
1864 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
|
1865 --n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1866 if (merge_at(ms, n) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1867 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1868 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1869 return 0; |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1870 } |
|
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
|
1871 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1872 /* 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
|
1873 * 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
|
1874 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1875 * 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
|
1876 * 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
|
1877 * 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
|
1878 * 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
|
1879 * |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1880 * See listsort.txt for more info. |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1881 */ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1882 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36484
diff
changeset
|
1883 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
|
1884 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1885 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
|
1886 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1887 assert(n >= 0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1888 while (n >= 64) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1889 r |= n & 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1890 n >>= 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1891 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1892 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
|
1893 } |
|
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
|
1894 |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
30156
diff
changeset
|
1895 static void |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1896 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
|
1897 { |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1898 reverse_slice(s->keys, &s->keys[n]); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1899 if (s->values != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1900 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
|
1901 } |
|
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
30156
diff
changeset
|
1902 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1903 /* 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
|
1904 * 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
|
1905 * 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
|
1906 * duplicated). |
|
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
1907 */ |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
1908 static PyObject * |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
30156
diff
changeset
|
1909 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
|
1910 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1911 MergeState ms; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1912 Py_ssize_t nremaining; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1913 Py_ssize_t minrun; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1914 sortslice lo; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1915 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
|
1916 PyObject **saved_ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1917 PyObject **final_ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1918 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
|
1919 int reverse = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1920 PyObject *keyfunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1921 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1922 static char *kwlist[] = {"key", "reverse", 0}; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1923 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
|
1924 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1925 assert(self != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1926 assert (PyList_Check(self)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1927 if (args != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1928 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
|
1929 kwlist, &keyfunc, &reverse)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1930 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1931 if (Py_SIZE(args) > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1932 PyErr_SetString(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1933 "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
|
1934 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1935 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1936 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1937 if (keyfunc == Py_None) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1938 keyfunc = NULL; |
|
30697
1345c23a0591
* list.sort() now supports three keyword arguments: cmp, key, and reverse.
Raymond Hettinger <python@rcn.com>
parents:
30156
diff
changeset
|
1939 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1940 /* 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
|
1941 * 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
|
1942 * 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
|
1943 * factory, since ob_item may change). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1944 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1945 saved_ob_size = Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1946 saved_ob_item = self->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1947 saved_allocated = self->allocated; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1948 Py_SIZE(self) = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1949 self->ob_item = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1950 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
|
1951 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1952 if (keyfunc == NULL) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1953 keys = NULL; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1954 lo.keys = saved_ob_item; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1955 lo.values = NULL; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1956 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1957 else { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1958 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
|
1959 /* 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
|
1960 keys = &ms.temparray[saved_ob_size+1]; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1961 else { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1962 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
|
1963 if (keys == NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1964 return NULL; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1965 } |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1966 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1967 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
|
1968 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
|
1969 NULL); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1970 if (keys[i] == NULL) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1971 for (i=i-1 ; i>=0 ; i--) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1972 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
|
1973 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
|
1974 PyMem_FREE(keys); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1975 goto keyfunc_fail; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1976 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1977 } |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1978 |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1979 lo.keys = keys; |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1980 lo.values = saved_ob_item; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1981 } |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
1982 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1983 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
|
1984 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1985 nremaining = saved_ob_size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1986 if (nremaining < 2) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1987 goto succeed; |
|
24316
dd38291b89fb
More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents:
24313
diff
changeset
|
1988 |
|
64248
ba536ac7ab4e
reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
1989 /* Reverse sort stability achieved by initially reversing the list, |
|
ba536ac7ab4e
reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
1990 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
|
1991 if (reverse) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1992 if (keys != NULL) |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
1993 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
|
1994 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
|
1995 } |
|
64248
ba536ac7ab4e
reorder and save a comparison
Benjamin Peterson <benjamin@python.org>
parents:
61466
diff
changeset
|
1996 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
1997 /* 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
|
1998 * 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
|
1999 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2000 minrun = merge_compute_minrun(nremaining); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2001 do { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2002 int descending; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2003 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
|
2004 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2005 /* Identify next run. */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2006 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
|
2007 if (n < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2008 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2009 if (descending) |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2010 reverse_sortslice(&lo, n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2011 /* 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
|
2012 if (n < minrun) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2013 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
|
2014 nremaining : minrun; |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2015 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
|
2016 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2017 n = force; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2018 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2019 /* 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
|
2020 assert(ms.n < MAX_MERGE_PENDING); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2021 ms.pending[ms.n].base = lo; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2022 ms.pending[ms.n].len = n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2023 ++ms.n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2024 if (merge_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 /* Advance to find next run. */ |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2027 sortslice_advance(&lo, n); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2028 nremaining -= n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2029 } while (nremaining); |
|
24316
dd38291b89fb
More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents:
24313
diff
changeset
|
2030 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2031 if (merge_force_collapse(&ms) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2032 goto fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2033 assert(ms.n == 1); |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2034 assert(keys == NULL |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2035 ? 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
|
2036 : 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
|
2037 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
|
2038 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
|
2039 |
|
24456
d216e67ac221
Replaced samplesort with a stable, adaptive mergesort.
Tim Peters <tim.peters@gmail.com>
parents:
24424
diff
changeset
|
2040 succeed: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2041 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
|
2042 fail: |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2043 if (keys != NULL) { |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2044 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
|
2045 Py_DECREF(keys[i]); |
|
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2046 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
|
2047 PyMem_FREE(keys); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2048 } |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
2049 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2050 if (self->allocated != -1 && result != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2051 /* 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
|
2052 * 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
|
2053 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2054 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
|
2055 result = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2056 } |
|
31093
f2e7646f7763
Fixes and tests for various "holding pointers when arbitrary Python code
Michael W. Hudson <mwh@python.net>
parents:
31041
diff
changeset
|
2057 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2058 if (reverse && saved_ob_size > 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2059 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
|
2060 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2061 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
|
2062 |
|
66608
e339fca6e51a
Issue9915: speeding up sorting with a key
Daniel Stutzbach <daniel@stutzbachenterprises.com>
parents:
65512
diff
changeset
|
2063 keyfunc_fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2064 final_ob_item = self->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2065 i = Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2066 Py_SIZE(self) = saved_ob_size; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2067 self->ob_item = saved_ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2068 self->allocated = saved_allocated; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2069 if (final_ob_item != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2070 /* 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
|
2071 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
|
2072 while (--i >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2073 Py_XDECREF(final_ob_item[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2074 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2075 PyMem_FREE(final_ob_item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2076 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2077 Py_XINCREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2078 return result; |
|
4673
a3cdc8164990
Added new quicksort implementation, tailored to sorting arrays of
Guido van Rossum <guido@python.org>
parents:
4503
diff
changeset
|
2079 } |
|
24316
dd38291b89fb
More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents:
24313
diff
changeset
|
2080 #undef IFLT |
|
24540
614358e3c4f6
Sped the usual case for sorting by calling PyObject_RichCompareBool
Tim Peters <tim.peters@gmail.com>
parents:
24515
diff
changeset
|
2081 #undef ISLT |
|
24316
dd38291b89fb
More sort cleanup: Moved the special cases from samplesortslice into
Tim Peters <tim.peters@gmail.com>
parents:
24313
diff
changeset
|
2082 |
|
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
|
2083 int |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
2084 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
|
2085 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2086 if (v == NULL || !PyList_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2087 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2088 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2089 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2090 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
|
2091 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2092 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2093 Py_DECREF(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2094 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
|
2095 } |
|
69662f16a838
Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents:
8457
diff
changeset
|
2096 |
|
16581
c0cdf82599e0
Fix core dump whenever PyList_Reverse() was called.
Guido van Rossum <guido@python.org>
parents:
15969
diff
changeset
|
2097 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
|
2098 listreverse(PyListObject *self) |
|
16581
c0cdf82599e0
Fix core dump whenever PyList_Reverse() was called.
Guido van Rossum <guido@python.org>
parents:
15969
diff
changeset
|
2099 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2100 if (Py_SIZE(self) > 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2101 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
|
2102 Py_RETURN_NONE; |
|
155
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2103 } |
|
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2104 |
|
47
05057e3660f8
Added external interface to sort a list.
Guido van Rossum <guido@python.org>
parents:
27
diff
changeset
|
2105 int |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
2106 PyList_Reverse(PyObject *v) |
|
2159
a619a61aad1e
added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents:
2143
diff
changeset
|
2107 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2108 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
|
2109 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2110 if (v == NULL || !PyList_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2111 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2112 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2113 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2114 if (Py_SIZE(self) > 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2115 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
|
2116 return 0; |
|
2159
a619a61aad1e
added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents:
2143
diff
changeset
|
2117 } |
|
a619a61aad1e
added reverselist; free recycling bin on error exit
Guido van Rossum <guido@python.org>
parents:
2143
diff
changeset
|
2118 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2119 PyObject * |
|
13472
dbe83fd23393
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13265
diff
changeset
|
2120 PyList_AsTuple(PyObject *v) |
|
1836
1203f0629527
Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents:
1405
diff
changeset
|
2121 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2122 PyObject *w; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2123 PyObject **p, **q; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2124 Py_ssize_t n; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2125 if (v == NULL || !PyList_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2126 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2127 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2128 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2129 n = Py_SIZE(v); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2130 w = PyTuple_New(n); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2131 if (w == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2132 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2133 p = ((PyTupleObject *)w)->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2134 q = ((PyListObject *)v)->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2135 while (--n >= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2136 Py_INCREF(*q); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2137 *p = *q; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2138 p++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2139 q++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2140 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2141 return w; |
|
1836
1203f0629527
Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents:
1405
diff
changeset
|
2142 } |
|
1203f0629527
Correct problems found by THINK C 6.0
Guido van Rossum <guido@python.org>
parents:
1405
diff
changeset
|
2143 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2144 static PyObject * |
|
29510
01e925371d7c
SF #754014: list.index() should accept optional start, end arguments
Raymond Hettinger <python@rcn.com>
parents:
29198
diff
changeset
|
2145 listindex(PyListObject *self, PyObject *args) |
|
155
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2146 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2147 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
|
2148 PyObject *v; |
|
11846
8b70eaaadf4b
Made all list methods use PyArg_ParseTuple(), for more accurate
Guido van Rossum <guido@python.org>
parents:
11673
diff
changeset
|
2149 |
|
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
|
2150 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
|
2151 _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
|
2152 _PyEval_SliceIndex, &stop)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2153 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2154 if (start < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2155 start += Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2156 if (start < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2157 start = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2158 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2159 if (stop < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2160 stop += Py_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2161 if (stop < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2162 stop = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2163 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2164 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
|
2165 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
|
2166 if (cmp > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2167 return PyLong_FromSsize_t(i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2168 else if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2169 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2170 } |
|
73403
386a319b1825
Issue #13350: Replace most usages of PyUnicode_Format by PyUnicode_FromFormat.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
73391
diff
changeset
|
2171 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
|
2172 return NULL; |
|
155
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2173 } |
|
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2174 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2175 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
|
2176 listcount(PyListObject *self, PyObject *v) |
| 394 | 2177 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2178 Py_ssize_t count = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2179 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
|
2180 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2181 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
|
2182 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
|
2183 if (cmp > 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2184 count++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2185 else if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2186 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2187 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2188 return PyLong_FromSsize_t(count); |
| 394 | 2189 } |
| 2190 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2191 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
|
2192 listremove(PyListObject *self, PyObject *v) |
|
155
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2193 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2194 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
|
2195 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2196 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
|
2197 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
|
2198 if (cmp > 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2199 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
|
2200 (PyObject *)NULL) == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2201 Py_RETURN_NONE; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2202 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2203 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2204 else if (cmp < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2205 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2206 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2207 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
|
2208 return NULL; |
|
155
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2209 } |
|
896c825f2f71
Added repeat (for list*integet).
Guido van Rossum <guido@python.org>
parents:
145
diff
changeset
|
2210 |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12952
diff
changeset
|
2211 static int |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12952
diff
changeset
|
2212 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
|
2213 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2214 Py_ssize_t i; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12952
diff
changeset
|
2215 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2216 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
|
2217 Py_VISIT(o->ob_item[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2218 return 0; |
|
12990
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12952
diff
changeset
|
2219 } |
|
e615596c5c47
Round 1 of Neil Schemenauer's GC patches:
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
12952
diff
changeset
|
2220 |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2221 static PyObject * |
|
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2222 list_richcompare(PyObject *v, PyObject *w, int op) |
|
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2223 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2224 PyListObject *vl, *wl; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2225 Py_ssize_t i; |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2226 |
|
71810
d0b0fcbb40db
Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents:
69837
diff
changeset
|
2227 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
|
2228 Py_RETURN_NOTIMPLEMENTED; |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2229 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2230 vl = (PyListObject *)v; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2231 wl = (PyListObject *)w; |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2232 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2233 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
|
2234 /* 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
|
2235 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2236 if (op == Py_EQ) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2237 res = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2238 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2239 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2240 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2241 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2242 } |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2243 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2244 /* 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
|
2245 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
|
2246 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
|
2247 wl->ob_item[i], Py_EQ); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2248 if (k < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2249 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2250 if (!k) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2251 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2252 } |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2253 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2254 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
|
2255 /* 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
|
2256 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
|
2257 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
|
2258 int cmp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2259 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2260 switch (op) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2261 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
|
2262 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
|
2263 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
|
2264 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
|
2265 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
|
2266 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
|
2267 default: return NULL; /* cannot happen */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2268 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2269 if (cmp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2270 res = Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2271 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2272 res = Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2273 Py_INCREF(res); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2274 return res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2275 } |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2276 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2277 /* 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
|
2278 if (op == Py_EQ) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2279 Py_INCREF(Py_False); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2280 return Py_False; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2281 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2282 if (op == Py_NE) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2283 Py_INCREF(Py_True); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2284 return Py_True; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2285 } |
|
15969
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2286 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2287 /* 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
|
2288 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
|
2289 } |
|
e21da84d0c65
Convert to rich comparisons:
Guido van Rossum <guido@python.org>
parents:
15707
diff
changeset
|
2290 |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18409
diff
changeset
|
2291 static int |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18409
diff
changeset
|
2292 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
|
2293 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2294 PyObject *arg = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2295 static char *kwlist[] = {"sequence", 0}; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18409
diff
changeset
|
2296 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2297 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
|
2298 return -1; |
|
32859
45f3222b84ee
* Simplify and speed-up list_resize(). Relying on the newly documented
Raymond Hettinger <python@rcn.com>
parents:
32858
diff
changeset
|
2299 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2300 /* 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
|
2301 assert(0 <= Py_SIZE(self)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2302 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
|
2303 assert(self->ob_item != NULL || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2304 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
|
2305 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2306 /* Empty previous contents */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2307 if (self->ob_item != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2308 (void)list_clear(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2309 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2310 if (arg != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2311 PyObject *rv = listextend(self, arg); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2312 if (rv == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2313 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2314 Py_DECREF(rv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2315 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2316 return 0; |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18409
diff
changeset
|
2317 } |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
18409
diff
changeset
|
2318 |
|
47466
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45755
diff
changeset
|
2319 static PyObject * |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45755
diff
changeset
|
2320 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
|
2321 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2322 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
|
2323 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2324 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
|
2325 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
|
2326 } |
|
58f4b60773fe
Merged revisions 63856-63857,63859-63860 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45755
diff
changeset
|
2327 |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2328 static PyObject *list_iter(PyObject *seq); |
|
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2329 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
|
2330 |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31164
diff
changeset
|
2331 PyDoc_STRVAR(getitem_doc, |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31164
diff
changeset
|
2332 "x.__getitem__(y) <==> x[y]"); |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2333 PyDoc_STRVAR(reversed_doc, |
|
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2334 "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
|
2335 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
|
2336 "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
|
2337 PyDoc_STRVAR(clear_doc, |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
2338 "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
|
2339 PyDoc_STRVAR(copy_doc, |
|
c8c0e42944a1
Issue #10516: adding list.clear() and list.copy() methods
Eli Bendersky <eliben@gmail.com>
parents:
67347
diff
changeset
|
2340 "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
|
2341 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
|
2342 "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
|
2343 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
|
2344 "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
|
2345 PyDoc_STRVAR(insert_doc, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23779
diff
changeset
|
2346 "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
|
2347 PyDoc_STRVAR(pop_doc, |
| 49493 | 2348 "L.pop([index]) -> item -- remove and return item at index (default last).\n" |
| 2349 "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
|
2350 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
|
2351 "L.remove(value) -> None -- remove first occurrence of value.\n" |
| 49493 | 2352 "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
|
2353 PyDoc_STRVAR(index_doc, |
| 49493 | 2354 "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n" |
| 2355 "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
|
2356 PyDoc_STRVAR(count_doc, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23779
diff
changeset
|
2357 "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
|
2358 PyDoc_STRVAR(reverse_doc, |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23779
diff
changeset
|
2359 "L.reverse() -- reverse *IN PLACE*"); |
|
ed1ba37a46b7
Patch #568124: Add doc string macros.
Martin v. Löwis <martin@v.loewis.de>
parents:
23779
diff
changeset
|
2360 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
|
2361 "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
|
2362 |
|
31172
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31164
diff
changeset
|
2363 static PyObject *list_subscript(PyListObject*, PyObject*); |
|
e4fb6164158c
* Added a new method flag, METH_COEXIST.
Raymond Hettinger <python@rcn.com>
parents:
31164
diff
changeset
|
2364 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2365 static PyMethodDef list_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2366 {"__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
|
2367 {"__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
|
2368 {"__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
|
2369 {"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
|
2370 {"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
|
2371 {"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
|
2372 {"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
|
2373 {"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
|
2374 {"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
|
2375 {"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
|
2376 {"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
|
2377 {"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
|
2378 {"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
|
2379 {"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
|
2380 {NULL, NULL} /* sentinel */ |
| 6 | 2381 }; |
| 2382 | |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2383 static PySequenceMethods list_as_sequence = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2384 (lenfunc)list_length, /* sq_length */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2385 (binaryfunc)list_concat, /* sq_concat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2386 (ssizeargfunc)list_repeat, /* sq_repeat */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2387 (ssizeargfunc)list_item, /* sq_item */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2388 0, /* sq_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2389 (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
|
2390 0, /* sq_ass_slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2391 (objobjproc)list_contains, /* sq_contains */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2392 (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
|
2393 (ssizeargfunc)list_inplace_repeat, /* sq_inplace_repeat */ |
| 6 | 2394 }; |
| 2395 | |
|
23855
2b071337205c
Missed one use of new PyDoc_STRVAR macro
Neal Norwitz <nnorwitz@gmail.com>
parents:
23834
diff
changeset
|
2396 PyDoc_STRVAR(list_doc, |
|
59225
9b72277d6b30
Merged revisions 78541 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
58904
diff
changeset
|
2397 "list() -> new empty list\n" |
|
9b72277d6b30
Merged revisions 78541 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents:
58904
diff
changeset
|
2398 "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
|
2399 |
|
24230
2860be244263
Don't declare a function with staticforward.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
24207
diff
changeset
|
2400 static PyObject * |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2401 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
|
2402 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2403 if (PyIndex_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2404 Py_ssize_t i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2405 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
|
2406 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2407 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2408 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2409 i += PyList_GET_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2410 return list_item(self, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2411 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2412 else if (PySlice_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2413 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
|
2414 PyObject* result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2415 PyObject* it; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2416 PyObject **src, **dest; |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2417 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66617
diff
changeset
|
2418 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
|
2419 &start, &stop, &step, &slicelength) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2420 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2421 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2422 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2423 if (slicelength <= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2424 return PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2425 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2426 else if (step == 1) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2427 return list_slice(self, start, stop); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2428 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2429 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2430 result = PyList_New(slicelength); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2431 if (!result) return NULL; |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2432 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2433 src = self->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2434 dest = ((PyListObject *)result)->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2435 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
|
2436 cur += (size_t)step, i++) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2437 it = src[cur]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2438 Py_INCREF(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2439 dest[i] = it; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2440 } |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2441 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2442 return result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2443 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2444 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2445 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2446 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2447 "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
|
2448 item->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2449 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2450 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2451 } |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2452 |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2453 static int |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2454 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
|
2455 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2456 if (PyIndex_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2457 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
|
2458 if (i == -1 && PyErr_Occurred()) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2459 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2460 if (i < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2461 i += PyList_GET_SIZE(self); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2462 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
|
2463 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2464 else if (PySlice_Check(item)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2465 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
|
2466 |
|
66664
62b61abd02b8
Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents:
66617
diff
changeset
|
2467 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
|
2468 &start, &stop, &step, &slicelength) < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2469 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2470 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2471 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2472 if (step == 1) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2473 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
|
2474 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2475 /* 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
|
2476 before 5, not before 2. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2477 if ((step < 0 && start < stop) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2478 (step > 0 && start > stop)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2479 stop = start; |
|
42954
27f0289b6835
Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents:
42855
diff
changeset
|
2480 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2481 if (value == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2482 /* delete slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2483 PyObject **garbage; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2484 size_t cur; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2485 Py_ssize_t i; |
|
87308
b508253f2876
Close #19578: Fix list_ass_subscript(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
87263
diff
changeset
|
2486 int res; |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2487 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2488 if (slicelength <= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2489 return 0; |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2490 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2491 if (step < 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2492 stop = start + 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2493 start = stop + step*(slicelength - 1) - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2494 step = -step; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2495 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2496 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2497 assert((size_t)slicelength <= |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2498 PY_SIZE_MAX / sizeof(PyObject*)); |
|
48330
ac854cde3135
Merged revisions 64114 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
47466
diff
changeset
|
2499 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2500 garbage = (PyObject**) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2501 PyMem_MALLOC(slicelength*sizeof(PyObject*)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2502 if (!garbage) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2503 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2504 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2505 } |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2506 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2507 /* 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
|
2508 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
|
2509 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
|
2510 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
|
2511 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
|
2512 covered by the slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2513 for (cur = start, i = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2514 cur < (size_t)stop; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2515 cur += step, i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2516 Py_ssize_t lim = step - 1; |
| 24424 | 2517 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2518 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
|
2519 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2520 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
|
2521 lim = Py_SIZE(self) - cur - 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2522 } |
| 24424 | 2523 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2524 memmove(self->ob_item + cur - i, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2525 self->ob_item + cur + 1, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2526 lim * sizeof(PyObject *)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2527 } |
|
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
|
2528 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
|
2529 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
|
2530 memmove(self->ob_item + cur - slicelength, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2531 self->ob_item + cur, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2532 (Py_SIZE(self) - cur) * |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2533 sizeof(PyObject *)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2534 } |
|
31633
5bd455638c7a
Optimize inner loops for subscript, repeat, and concat.
Raymond Hettinger <python@rcn.com>
parents:
31632
diff
changeset
|
2535 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2536 Py_SIZE(self) -= slicelength; |
|
87308
b508253f2876
Close #19578: Fix list_ass_subscript(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
87263
diff
changeset
|
2537 res = 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
|
2538 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2539 for (i = 0; i < slicelength; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2540 Py_DECREF(garbage[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2541 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2542 PyMem_FREE(garbage); |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2543 |
|
87308
b508253f2876
Close #19578: Fix list_ass_subscript(), handle list_resize() failure
Victor Stinner <victor.stinner@gmail.com>
parents:
87263
diff
changeset
|
2544 return res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2545 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2546 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2547 /* assign slice */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2548 PyObject *ins, *seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2549 PyObject **garbage, **seqitems, **selfitems; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2550 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
|
2551 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2552 /* protect against a[::-1] = a */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2553 if (self == (PyListObject*)value) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2554 seq = list_slice((PyListObject*)value, 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2555 PyList_GET_SIZE(value)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2556 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2557 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2558 seq = PySequence_Fast(value, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2559 "must assign iterable " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2560 "to extended slice"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2561 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2562 if (!seq) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2563 return -1; |
|
26543
975482d5eb5c
The final tweaks before closing
Michael W. Hudson <mwh@python.net>
parents:
26161
diff
changeset
|
2564 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2565 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
|
2566 PyErr_Format(PyExc_ValueError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2567 "attempt to assign sequence of " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2568 "size %zd to extended slice of " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2569 "size %zd", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2570 PySequence_Fast_GET_SIZE(seq), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2571 slicelength); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2572 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2573 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2574 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2575 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2576 if (!slicelength) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2577 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2578 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2579 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2580 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2581 garbage = (PyObject**) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2582 PyMem_MALLOC(slicelength*sizeof(PyObject*)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2583 if (!garbage) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2584 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2585 PyErr_NoMemory(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2586 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2587 } |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2588 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2589 selfitems = self->ob_item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2590 seqitems = PySequence_Fast_ITEMS(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2591 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
|
2592 cur += (size_t)step, i++) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2593 garbage[i] = selfitems[cur]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2594 ins = seqitems[i]; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2595 Py_INCREF(ins); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2596 selfitems[cur] = ins; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2597 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2598 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2599 for (i = 0; i < slicelength; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2600 Py_DECREF(garbage[i]); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2601 } |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2602 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2603 PyMem_FREE(garbage); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2604 Py_DECREF(seq); |
|
24310
5ede9bcc651e
Trimmed trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
24309
diff
changeset
|
2605 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2606 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2607 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2608 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2609 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2610 PyErr_Format(PyExc_TypeError, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2611 "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
|
2612 item->ob_type->tp_name); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2613 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2614 } |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2615 } |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2616 |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2617 static PyMappingMethods list_as_mapping = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2618 (lenfunc)list_length, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2619 (binaryfunc)list_subscript, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2620 (objobjargproc)list_ass_subscript |
|
23778
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2621 }; |
|
245224d1b8c9
This is my nearly two year old patch
Michael W. Hudson <mwh@python.net>
parents:
23615
diff
changeset
|
2622 |
|
5396
d1447950fa04
Quickly renamed the last directory.
Guido van Rossum <guido@python.org>
parents:
5288
diff
changeset
|
2623 PyTypeObject PyList_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2624 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2625 "list", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2626 sizeof(PyListObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2627 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2628 (destructor)list_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2629 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2630 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2631 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2632 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2633 (reprfunc)list_repr, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2634 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2635 &list_as_sequence, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2636 &list_as_mapping, /* tp_as_mapping */ |
|
65512
17c96aaf93c8
Remove unneeded casts to hashfunc.
Georg Brandl <georg@python.org>
parents:
64248
diff
changeset
|
2637 PyObject_HashNotImplemented, /* tp_hash */ |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2638 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2639 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2640 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2641 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2642 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2643 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
|
2644 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
|
2645 list_doc, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2646 (traverseproc)list_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2647 (inquiry)list_clear, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2648 list_richcompare, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2649 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2650 list_iter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2651 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2652 list_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2653 0, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2654 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2655 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2656 0, /* tp_dict */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2657 0, /* tp_descr_get */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2658 0, /* tp_descr_set */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2659 0, /* tp_dictoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2660 (initproc)list_init, /* tp_init */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2661 PyType_GenericAlloc, /* tp_alloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2662 PyType_GenericNew, /* tp_new */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2663 PyObject_GC_Del, /* tp_free */ |
| 6 | 2664 }; |
|
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
|
2665 |
|
69662f16a838
Tim's latest, with some of my changes (also a TP suggestion) added:
Guido van Rossum <guido@python.org>
parents:
8457
diff
changeset
|
2666 |
|
23606
5edea752a421
SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents:
23517
diff
changeset
|
2667 /*********************** List Iterator **************************/ |
|
5edea752a421
SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents:
23517
diff
changeset
|
2668 |
|
5edea752a421
SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents:
23517
diff
changeset
|
2669 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2670 PyObject_HEAD |
|
84329
3a393fc86b29
Issue #9566: More long/Py_ssize_t fixes in tuple and list iterators (it_index)
Victor Stinner <victor.stinner@gmail.com>
parents:
79511
diff
changeset
|
2671 Py_ssize_t it_index; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2672 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
|
2673 } listiterobject; |
|
5edea752a421
SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents:
23517
diff
changeset
|
2674 |
|
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
|
2675 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
|
2676 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
|
2677 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
|
2678 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
|
2679 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
|
2680 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
|
2681 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
|
2682 static PyObject *listiter_setstate(listiterobject *, PyObject *state); |
|
31686
823279ae43eb
Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents:
31665
diff
changeset
|
2683 |
|
36484
20f75d5e79e9
Renamed _length_cue() to __length_hint__(). See:
Armin Rigo <arigo@tunes.org>
parents:
35999
diff
changeset
|
2684 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
|
2685 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
|
2686 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
|
2687 |
|
e22334b1da67
Convert iterator __len__() methods to a private API.
Raymond Hettinger <python@rcn.com>
parents:
35365
diff
changeset
|
2688 static PyMethodDef listiter_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2689 {"__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
|
2690 {"__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
|
2691 {"__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
|
2692 {NULL, NULL} /* sentinel */ |
|
31686
823279ae43eb
Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents:
31665
diff
changeset
|
2693 }; |
|
823279ae43eb
Make iterators length transparent where possible.
Raymond Hettinger <python@rcn.com>
parents:
31665
diff
changeset
|
2694 |
|
23606
5edea752a421
SF 560736. Optimize list iteration by filling the tp_iter slot.
Raymond Hettinger <python@rcn.com>
parents:
23517
diff
changeset
|
2695 PyTypeObject PyListIter_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2696 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2697 "list_iterator", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2698 sizeof(listiterobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2699 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2700 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2701 (destructor)listiter_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2702 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2703 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2704 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2705 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2706 0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2707 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2708 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2709 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2710 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2711 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2712 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2713 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2714 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2715 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2716 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
|
2717 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2718 (traverseproc)listiter_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2719 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2720 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2721 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2722 PyObject_SelfIter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2723 (iternextfunc)listiter_next, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2724 listiter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2725 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
|
2726 }; |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2727 |
|
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
|
2728 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2729 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
|
2730 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
|
2731 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2732 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
|
2733 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2734 if (!PyList_Check(seq)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2735 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2736 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2737 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2738 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
|
2739 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2740 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2741 it->it_index = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2742 Py_INCREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2743 it->it_seq = (PyListObject *)seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2744 _PyObject_GC_TRACK(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2745 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
|
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 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
|
2749 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
|
2750 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2751 _PyObject_GC_UNTRACK(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2752 Py_XDECREF(it->it_seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2753 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
|
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 |
|
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 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
|
2757 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
|
2758 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2759 Py_VISIT(it->it_seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2760 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
|
2761 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2762 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2763 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
|
2764 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
|
2765 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2766 PyListObject *seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2767 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
|
2768 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2769 assert(it != NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2770 seq = it->it_seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2771 if (seq == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2772 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2773 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
|
2774 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2775 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
|
2776 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
|
2777 ++it->it_index; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2778 Py_INCREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2779 return item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2780 } |
|
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
|
2781 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2782 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2783 it->it_seq = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2784 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
|
2785 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2786 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2787 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
|
2788 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
|
2789 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2790 Py_ssize_t len; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2791 if (it->it_seq) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2792 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
|
2793 if (len >= 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2794 return PyLong_FromSsize_t(len); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2795 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2796 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
|
2797 } |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2798 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2799 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2800 listiter_reduce(listiterobject *it) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2801 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2802 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
|
2803 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2804 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2805 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2806 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
|
2807 { |
|
84329
3a393fc86b29
Issue #9566: More long/Py_ssize_t fixes in tuple and list iterators (it_index)
Victor Stinner <victor.stinner@gmail.com>
parents:
79511
diff
changeset
|
2808 Py_ssize_t index = PyLong_AsSsize_t(state); |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2809 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
|
2810 return NULL; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2811 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
|
2812 if (index < 0) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2813 index = 0; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2814 it->it_index = index; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2815 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2816 Py_RETURN_NONE; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2817 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2818 |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2819 /*********************** List Reverse Iterator **************************/ |
|
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2820 |
|
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2821 typedef struct { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2822 PyObject_HEAD |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2823 Py_ssize_t it_index; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2824 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
|
2825 } listreviterobject; |
|
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2826 |
|
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
|
2827 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
|
2828 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
|
2829 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
|
2830 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
|
2831 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
|
2832 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
|
2833 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
|
2834 |
|
49925
86ee2e0d4d41
Issue 3689: list_reverseiterator should support __length_hint__ instead of __len__.
Raymond Hettinger <python@rcn.com>
parents:
49493
diff
changeset
|
2835 static PyMethodDef listreviter_methods[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2836 {"__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
|
2837 {"__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
|
2838 {"__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
|
2839 {NULL, NULL} /* sentinel */ |
|
31635
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31633
diff
changeset
|
2840 }; |
|
04eb2ebb46e2
Tidied up the implementations of reversed (including the custom ones
Raymond Hettinger <python@rcn.com>
parents:
31633
diff
changeset
|
2841 |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2842 PyTypeObject PyListRevIter_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2843 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2844 "list_reverseiterator", /* tp_name */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2845 sizeof(listreviterobject), /* tp_basicsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2846 0, /* tp_itemsize */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2847 /* methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2848 (destructor)listreviter_dealloc, /* tp_dealloc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2849 0, /* tp_print */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2850 0, /* tp_getattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2851 0, /* tp_setattr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2852 0, /* tp_reserved */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2853 0, /* tp_repr */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2854 0, /* tp_as_number */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2855 0, /* tp_as_sequence */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2856 0, /* tp_as_mapping */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2857 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2858 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2859 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2860 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2861 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2862 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2863 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
|
2864 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2865 (traverseproc)listreviter_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2866 0, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2867 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2868 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2869 PyObject_SelfIter, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2870 (iternextfunc)listreviter_next, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2871 listreviter_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2872 0, |
|
30874
682d1b67c7b5
Optimize reversed(list) using a custom iterator.
Raymond Hettinger <python@rcn.com>
parents:
30849
diff
changeset
|
2873 }; |
|
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
|
2874 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2875 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
|
2876 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
|
2877 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2878 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
|
2879 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2880 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
|
2881 if (it == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2882 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2883 assert(PyList_Check(seq)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2884 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
|
2885 Py_INCREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2886 it->it_seq = seq; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2887 PyObject_GC_Track(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2888 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
|
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 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
|
2892 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
|
2893 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2894 PyObject_GC_UnTrack(it); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2895 Py_XDECREF(it->it_seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2896 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
|
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 |
|
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 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
|
2900 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
|
2901 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2902 Py_VISIT(it->it_seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2903 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
|
2904 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2905 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36882
diff
changeset
|
2906 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
|
2907 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
|
2908 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2909 PyObject *item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2910 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
|
2911 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
|
2912 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2913 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
|
2914 item = PyList_GET_ITEM(seq, index); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2915 it->it_index--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2916 Py_INCREF(item); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2917 return item; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2918 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2919 it->it_index = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2920 if (seq != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2921 it->it_seq = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2922 Py_DECREF(seq); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2923 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2924 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
|
2925 } |
|
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 |
|
49925
86ee2e0d4d41
Issue 3689: list_reverseiterator should support __length_hint__ instead of __len__.
Raymond Hettinger <python@rcn.com>
parents:
49493
diff
changeset
|
2927 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
|
2928 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
|
2929 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2930 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
|
2931 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
|
2932 len = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59225
diff
changeset
|
2933 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
|
2934 } |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2935 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2936 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2937 listreviter_reduce(listreviterobject *it) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2938 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2939 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
|
2940 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2941 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2942 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2943 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
|
2944 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2945 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
|
2946 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
|
2947 return NULL; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2948 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
|
2949 if (index < -1) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2950 index = -1; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2951 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
|
2952 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
|
2953 it->it_index = index; |
|
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 Py_RETURN_NONE; |
|
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 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2958 /* common pickling support */ |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2959 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2960 static PyObject * |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2961 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
|
2962 { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2963 PyObject *list; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2964 |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2965 /* 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
|
2966 if (forward) { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2967 listiterobject *it = (listiterobject *)_it; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2968 if (it->it_seq) |
|
84329
3a393fc86b29
Issue #9566: More long/Py_ssize_t fixes in tuple and list iterators (it_index)
Victor Stinner <victor.stinner@gmail.com>
parents:
79511
diff
changeset
|
2969 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"), |
|
76091
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2970 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
|
2971 } else { |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2972 listreviterobject *it = (listreviterobject *)_it; |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2973 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
|
2974 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
|
2975 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
|
2976 } |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2977 /* 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
|
2978 list = PyList_New(0); |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2979 if (list == NULL) |
|
4ff234337e24
Issue #14288: Serialization support for builtin iterators.
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
75876
diff
changeset
|
2980 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
|
2981 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
|
2982 } |
