![](https://secure.gravatar.com/avatar/7b43f399ad17706bee01be8cd20165b0.jpg?s=120&d=mm&r=g)
Update of /cvsroot/python/python/dist/src/Python In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15896/Python Modified Files: compile.c Log Message: 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. Index: compile.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v retrieving revision 2.331 retrieving revision 2.332 diff -u -d -r2.331 -r2.332 --- compile.c 24 Oct 2004 00:10:05 -0000 2.331 +++ compile.c 26 Oct 2004 08:59:13 -0000 2.332 @@ -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)) {