diff options
author | Raymond Hettinger <python@rcn.com> | 2003-04-15 10:35:07 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2003-04-15 10:35:07 (GMT) |
commit | 255a3d08a189fb6aa4acb16c2168eb396f63df0f (patch) | |
tree | 249c73d3837aaf8d8f0a518ceff482f0a55ace65 | |
parent | 8b7a9a38c66aff5633255b63be639ee8592f180b (diff) | |
download | cpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.zip cpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.tar.gz cpython-255a3d08a189fb6aa4acb16c2168eb396f63df0f.tar.bz2 |
Extend SF patch #707257: Improve code generation
to cover the case for: "x,y,z=1,2,3". Gives a 30% speed-up.
Also, added FOR_ITER to the list of opcodes that can jump.
-rw-r--r-- | Python/compile.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/Python/compile.c b/Python/compile.c index 3786cd9..57f0edb 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -364,23 +364,35 @@ optimize_code(PyObject *code, PyObject* consts) break; /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2. + Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1. Note, these opcodes occur together only in assignment statements. Accordingly, the unpack opcode is never a jump target. */ case BUILD_TUPLE: case BUILD_LIST: - if (codestr[i+3] != UNPACK_SEQUENCE || - GETARG(codestr, i) != 2 || - GETARG(codestr, i+3) != 2) + if (codestr[i+3] != UNPACK_SEQUENCE) continue; - codestr[i] = ROT_TWO; - codestr[i+1] = JUMP_FORWARD; - SETARG(codestr, i+1, 2); - codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */ - codestr[i+5] = POP_TOP; + if (GETARG(codestr, i) == 2 && \ + GETARG(codestr, i+3) == 2) { + codestr[i] = ROT_TWO; + codestr[i+1] = JUMP_FORWARD; + SETARG(codestr, i+1, 2); + codestr[i+4] = DUP_TOP; /* Filler codes used as NOPs */ + codestr[i+5] = POP_TOP; + continue; + } + if (GETARG(codestr, i) == 3 && \ + GETARG(codestr, i+3) == 3) { + codestr[i] = ROT_THREE; + codestr[i+1] = ROT_TWO; + codestr[i+2] = JUMP_FORWARD; + SETARG(codestr, i+2, 1); + codestr[i+5] = DUP_TOP; + } break; /* Replace jumps to unconditional jumps */ + case FOR_ITER: case JUMP_FORWARD: case JUMP_IF_FALSE: case JUMP_IF_TRUE: |