[Python-checkins] python/dist/src/Python compile.c,2.334,2.335

rhettinger at users.sourceforge.net rhettinger at users.sourceforge.net
Mon Nov 1 16:19:15 CET 2004


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10498

Modified Files:
	compile.c 
Log Message:
Simplify and future proof NOP counting in the peepholer.
No longer assumes that the input is NOP free.



Index: compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.334
retrieving revision 2.335
diff -u -d -r2.334 -r2.335
--- compile.c	30 Oct 2004 21:08:59 -0000	2.334
+++ compile.c	1 Nov 2004 15:19:11 -0000	2.335
@@ -536,8 +536,7 @@
 		goto exitUnchanged;
 	assert(PyList_Check(consts));
 
-	for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
-		addrmap[i] = i - nops;
+	for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
 		opcode = codestr[i];
 
 		lastlc = cumlc;
@@ -560,7 +559,6 @@
 			SETARG(codestr, i, j);
 			codestr[i+3] = POP_TOP;
 			codestr[i+4] = NOP;
-			nops++;
 			break;
 
 		/* not a is b -->  a is not b
@@ -575,7 +573,6 @@
 				continue;
 			SETARG(codestr, i, (j^1));
 			codestr[i+3] = NOP;
-			nops++;
 			break;
 
 		/* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
@@ -604,7 +601,6 @@
 			    !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
 				continue;
 			memset(codestr+i, NOP, 7);
-			nops += 7;
 			break;
 
 		/* Try to fold tuples of constants.
@@ -619,7 +615,6 @@
 			    codestr[h] == LOAD_CONST  && 
 			    ISBASICBLOCK(blocks, h, 3*(j+1))  &&
 			    tuple_of_constants(&codestr[h], j, consts)) {
-				nops += 3 * j;
 				break;
 			}
 			/* Intentional fallthrough */
@@ -631,16 +626,13 @@
 				continue;
 			if (j == 1) {
 				memset(codestr+i, NOP, 6);
-				nops += 6;
 			} else if (j == 2) {
 				codestr[i] = ROT_TWO;
 				memset(codestr+i+1, NOP, 5);
-				nops += 5;
 			} else if (j == 3) {
 				codestr[i] = ROT_THREE;
 				codestr[i+1] = ROT_TWO;
 				memset(codestr+i+2, NOP, 4);
-				nops += 4;
 			}
 			break;
 
@@ -704,12 +696,16 @@
 			   !ISBASICBLOCK(blocks,i,5))
 			       continue;
 			memset(codestr+i+1, NOP, 4);
-			nops += 4;
 			break;
 		}
 	}
 
 	/* Fixup linenotab */
+	for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
+		addrmap[i] = i - nops;
+		if (codestr[i] == NOP)
+			nops++;
+	}
 	cum_orig_line = 0;
 	last_line = 0;
 	for (i=0 ; i < tabsiz ; i+=2) {
@@ -749,9 +745,6 @@
 		while (adj--)
 			codestr[h++] = codestr[i++];
 	}
-	/* The following assertion detects the presence of NOPs in the input
-	   bytecode.  The compiler never produces NOPs so far; if one day it
-	   does, the way 'nops' is counted above must be changed. */
 	assert(h + nops == codelen);
 
 	code = PyString_FromStringAndSize((char *)codestr, h);



More information about the Python-checkins mailing list