Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 33875:24fc3eaa19e0 legacy-trunk
Simplify and future proof NOP counting in the peepholer.
No longer assumes that the input is NOP free.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Mon, 01 Nov 2004 15:19:11 +0000 |
| parents | 4a3eaa1aa3af |
| children | 8a09c82e4261 |
line wrap: on
line diff
--- a/Python/compile.c Mon Nov 01 08:26:09 2004 +0000 +++ b/Python/compile.c Mon Nov 01 15:19:11 2004 +0000 @@ -536,8 +536,7 @@ goto exitUnchanged; assert(PyList_Check(consts)); - for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) { - addrmap[i] = i - nops; + for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) { opcode = codestr[i]; lastlc = cumlc; @@ -560,7 +559,6 @@ SETARG(codestr, i, j); codestr[i+3] = POP_TOP; codestr[i+4] = NOP; - nops++; break; /* not a is b --> a is not b @@ -575,7 +573,6 @@ continue; SETARG(codestr, i, (j^1)); codestr[i+3] = NOP; - nops++; break; /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */ @@ -604,7 +601,6 @@ !PyObject_IsTrue(PyList_GET_ITEM(consts, j))) continue; memset(codestr+i, NOP, 7); - nops += 7; break; /* Try to fold tuples of constants. @@ -619,7 +615,6 @@ codestr[h] == LOAD_CONST && ISBASICBLOCK(blocks, h, 3*(j+1)) && tuple_of_constants(&codestr[h], j, consts)) { - nops += 3 * j; break; } /* Intentional fallthrough */ @@ -631,16 +626,13 @@ continue; if (j == 1) { memset(codestr+i, NOP, 6); - nops += 6; } else if (j == 2) { codestr[i] = ROT_TWO; memset(codestr+i+1, NOP, 5); - nops += 5; } else if (j == 3) { codestr[i] = ROT_THREE; codestr[i+1] = ROT_TWO; memset(codestr+i+2, NOP, 4); - nops += 4; } break; @@ -704,12 +696,16 @@ !ISBASICBLOCK(blocks,i,5)) continue; memset(codestr+i+1, NOP, 4); - nops += 4; break; } } /* Fixup linenotab */ + for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) { + addrmap[i] = i - nops; + if (codestr[i] == NOP) + nops++; + } cum_orig_line = 0; last_line = 0; for (i=0 ; i < tabsiz ; i+=2) { @@ -749,9 +745,6 @@ while (adj--) codestr[h++] = codestr[i++]; } - /* The following assertion detects the presence of NOPs in the input - bytecode. The compiler never produces NOPs so far; if one day it - does, the way 'nops' is counted above must be changed. */ assert(h + nops == codelen); code = PyString_FromStringAndSize((char *)codestr, h);
