Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 28610:67d36f4dfea1 legacy-trunk
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.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Tue, 15 Apr 2003 10:35:07 +0000 |
| parents | 1a2fd109f6b6 |
| children | ab4fbf8ebab3 |
line wrap: on
line diff
--- a/Python/compile.c Mon Apr 14 22:01:58 2003 +0000 +++ b/Python/compile.c Tue Apr 15 10:35:07 2003 +0000 @@ -364,23 +364,35 @@ 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; + 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; - 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) == 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:
