mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Merge 3.3 into default.
cwr_next(): move invariants out of loops. This simplifies and clarifies the code, and gives a small speedup.
This commit is contained in:
commit
c6171e49ab
1 changed files with 12 additions and 16 deletions
|
@ -2713,20 +2713,20 @@ cwr_next(cwrobject *co)
|
||||||
PyObject *result = co->result;
|
PyObject *result = co->result;
|
||||||
Py_ssize_t n = PyTuple_GET_SIZE(pool);
|
Py_ssize_t n = PyTuple_GET_SIZE(pool);
|
||||||
Py_ssize_t r = co->r;
|
Py_ssize_t r = co->r;
|
||||||
Py_ssize_t i, j, index;
|
Py_ssize_t i, index;
|
||||||
|
|
||||||
if (co->stopped)
|
if (co->stopped)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
/* On the first pass, initialize result tuple using the indices */
|
/* On the first pass, initialize result tuple with pool[0] */
|
||||||
result = PyTuple_New(r);
|
result = PyTuple_New(r);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
goto empty;
|
goto empty;
|
||||||
co->result = result;
|
co->result = result;
|
||||||
|
elem = PyTuple_GET_ITEM(pool, 0);
|
||||||
for (i=0; i<r ; i++) {
|
for (i=0; i<r ; i++) {
|
||||||
index = indices[i];
|
assert(indices[i] == 0);
|
||||||
elem = PyTuple_GET_ITEM(pool, index);
|
|
||||||
Py_INCREF(elem);
|
Py_INCREF(elem);
|
||||||
PyTuple_SET_ITEM(result, i, elem);
|
PyTuple_SET_ITEM(result, i, elem);
|
||||||
}
|
}
|
||||||
|
@ -2749,27 +2749,23 @@ cwr_next(cwrobject *co)
|
||||||
empty tuple is a singleton and cached in PyTuple's freelist. */
|
empty tuple is a singleton and cached in PyTuple's freelist. */
|
||||||
assert(r == 0 || Py_REFCNT(result) == 1);
|
assert(r == 0 || Py_REFCNT(result) == 1);
|
||||||
|
|
||||||
/* Scan indices right-to-left until finding one that is not
|
/* Scan indices right-to-left until finding one that is not
|
||||||
* at its maximum (n-1). */
|
* at its maximum (n-1). */
|
||||||
for (i=r-1 ; i >= 0 && indices[i] == n-1; i--)
|
for (i=r-1 ; i >= 0 && indices[i] == n-1; i--)
|
||||||
;
|
;
|
||||||
|
|
||||||
/* If i is negative, then the indices are all at
|
/* If i is negative, then the indices are all at
|
||||||
their maximum value and we're done. */
|
their maximum value and we're done. */
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
goto empty;
|
goto empty;
|
||||||
|
|
||||||
/* Increment the current index which we know is not at its
|
/* Increment the current index which we know is not at its
|
||||||
maximum. Then set all to the right to the same value. */
|
maximum. Then set all to the right to the same value. */
|
||||||
indices[i]++;
|
index = indices[i] + 1;
|
||||||
for (j=i+1 ; j<r ; j++)
|
assert(index < n);
|
||||||
indices[j] = indices[j-1];
|
elem = PyTuple_GET_ITEM(pool, index);
|
||||||
|
|
||||||
/* Update the result tuple for the new indices
|
|
||||||
starting with i, the leftmost index that changed */
|
|
||||||
for ( ; i<r ; i++) {
|
for ( ; i<r ; i++) {
|
||||||
index = indices[i];
|
indices[i] = index;
|
||||||
elem = PyTuple_GET_ITEM(pool, index);
|
|
||||||
Py_INCREF(elem);
|
Py_INCREF(elem);
|
||||||
oldelem = PyTuple_GET_ITEM(result, i);
|
oldelem = PyTuple_GET_ITEM(result, i);
|
||||||
PyTuple_SET_ITEM(result, i, elem);
|
PyTuple_SET_ITEM(result, i, elem);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue