Maintain peepholer's cumlc invariant by updating the running total
everytime a LOAD_CONSTANT is encountered, created, or overwritten.
Added two tests to cover cases affected by the patch.
diff --git a/Python/compile.c b/Python/compile.c
index d47f8d5..be81ba0 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -586,6 +586,7 @@
if (PyList_GET_ITEM(consts, j) == Py_None) {
codestr[i] = LOAD_CONST;
SETARG(codestr, i, j);
+ cumlc = lastlc + 1;
break;
}
}
@@ -601,6 +602,7 @@
!PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
continue;
memset(codestr+i, NOP, 7);
+ cumlc = 0;
break;
/* Try to fold tuples of constants.
@@ -615,6 +617,8 @@
codestr[h] == LOAD_CONST &&
ISBASICBLOCK(blocks, h, 3*(j+1)) &&
tuple_of_constants(&codestr[h], j, consts)) {
+ assert(codestr[i] == LOAD_CONST);
+ cumlc = 1;
break;
}
/* Intentional fallthrough */