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: