Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 33259:b63b30821ef4 legacy-trunk
Simplify chains of conditional jumps.
(Suggested by Neal Norwitz.)
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Wed, 25 Aug 2004 03:18:29 +0000 |
| parents | c654334dc961 |
| children | 3dbdbd572d94 |
line wrap: on
line diff
--- a/Python/compile.c Wed Aug 25 03:09:58 2004 +0000 +++ b/Python/compile.c Wed Aug 25 03:18:29 2004 +0000 @@ -550,11 +550,34 @@ } break; + /* Simplify conditional jump to conditional jump where the + result of the first test implies the success of a similar + test or the failure of the opposite test. + Arises in code like: + "a and b or c" + "a and b and c" + x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z + x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE y+3 + */ + case JUMP_IF_FALSE: + case JUMP_IF_TRUE: + tgt = GETJUMPTGT(codestr, i); + j = codestr[tgt]; + if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) { + if (j == opcode) { + tgttgt = GETJUMPTGT(codestr, tgt) - i - 3; + SETARG(codestr, i, tgttgt); + } else { + tgt -= i; + SETARG(codestr, i, tgt); + } + break; + } + /* Intentional fallthrough */ + /* Replace jumps to unconditional jumps */ case FOR_ITER: case JUMP_FORWARD: - case JUMP_IF_FALSE: - case JUMP_IF_TRUE: case JUMP_ABSOLUTE: case CONTINUE_LOOP: case SETUP_LOOP:
