Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 33838:fdce3d39bec1 legacy-trunk
SF bug #1053819: Segfault in tuple_of_constants
Peepholer could be fooled into misidentifying a tuple_of_constants.
Added code to count consecutive occurrences of LOAD_CONST.
Use the count to weed out the misidentified cases.
Added a unittest.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Tue, 26 Oct 2004 08:59:14 +0000 |
| parents | bf18caca0730 |
| children | 3467288089a1 |
line wrap: on
line diff
--- a/Python/compile.c Tue Oct 26 07:38:16 2004 +0000 +++ b/Python/compile.c Tue Oct 26 08:59:14 2004 +0000 @@ -419,15 +419,16 @@ newconst = PyTuple_New(n); if (newconst == NULL) return 0; + len_consts = PyList_GET_SIZE(consts); for (i=0 ; i<n ; i++) { arg = GETARG(codestr, (i*3)); + assert(arg < len_consts); constant = PyList_GET_ITEM(consts, arg); Py_INCREF(constant); PyTuple_SET_ITEM(newconst, i, constant); } /* Append folded constant onto consts */ - len_consts = PyList_GET_SIZE(consts); if (PyList_Append(consts, newconst)) { Py_DECREF(newconst); return 0; @@ -501,6 +502,7 @@ unsigned char *lineno; int *addrmap = NULL; int new_line, cum_orig_line, last_line, tabsiz; + int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */ unsigned int *blocks; char *name; @@ -536,6 +538,10 @@ for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) { addrmap[i] = i - nops; opcode = codestr[i]; + + lastlc = cumlc; + cumlc = 0; + switch (opcode) { /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with @@ -589,6 +595,7 @@ /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */ case LOAD_CONST: + cumlc = lastlc + 1; j = GETARG(codestr, i); if (codestr[i+3] != JUMP_IF_FALSE || codestr[i+6] != POP_TOP || @@ -607,6 +614,7 @@ j = GETARG(codestr, i); h = i - 3 * j; if (h >= 0 && + j == lastlc && codestr[h] == LOAD_CONST && ISBASICBLOCK(blocks, h, 3*(j+1)) && tuple_of_constants(&codestr[h], j, consts)) {
