diff options
| author | Raymond Hettinger <python@rcn.com> | 2004-08-25 03:18:29 +0000 |
|---|---|---|
| committer | Raymond Hettinger <python@rcn.com> | 2004-08-25 03:18:29 +0000 |
| commit | 43c15b17ee78c894ca0669cc8a29bed19dca0906 (patch) | |
| tree | 3e1e49843f53d17cdde099ae7099f5e5c2445950 /Python | |
| parent | 290651ecfbdd0a1db2948b8b2a9c50c717b64752 (diff) | |
| download | cpython-43c15b17ee78c894ca0669cc8a29bed19dca0906.tar.gz | |
Simplify chains of conditional jumps.
(Suggested by Neal Norwitz.)
Diffstat (limited to 'Python')
| -rw-r--r-- | Python/compile.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/Python/compile.c b/Python/compile.c index 85182de9d7..fe31e6f105 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -550,11 +550,34 @@ optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *linen } 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: |
