diff Python/compile.c @ 33249:c654334dc961 legacy-trunk

Incorporate review comments courtesy of Neal Norwitz: * Perform the code length check earlier. * Eliminate the extra PyMem_Free() upon hitting an EXTENDED_ARG. * Assert that the NOP count used in jump retargeting matches the NOPs eliminated in the final step. * Add an XXX note to indicate that more work is being to done to handle linenotab with intervals > 255.
author Raymond Hettinger <python@rcn.com>
date Tue, 24 Aug 2004 04:34:16 +0000
parents 1f9b9c226b43
children b63b30821ef4
line wrap: on
line diff
--- a/Python/compile.c	Mon Aug 23 23:37:48 2004 +0000
+++ b/Python/compile.c	Tue Aug 24 04:34:16 2004 +0000
@@ -435,10 +435,15 @@
 	unsigned int *blocks;
 	char *name;
 
-	/* Make a modifiable copy of the code string */
 	if (!PyString_Check(code))
 		goto exitUnchanged;
+
+	/* Avoid situations where jump retargeting could overflow */
 	codelen = PyString_Size(code);
+	if (codelen > 32000)
+		goto exitUnchanged;
+
+	/* Make a modifiable copy of the code string */
 	codestr = PyMem_Malloc(codelen);
 	if (codestr == NULL)
 		goto exitUnchanged;
@@ -449,10 +454,6 @@
 	if (addrmap == NULL)
 		goto exitUnchanged;
 
-	/* Avoid situations where jump retargeting could overflow */
-	if (codelen > 32000)
-		goto exitUnchanged;
-
 	blocks = markblocks(codestr, codelen);
 	if (blocks == NULL)
 		goto exitUnchanged;
@@ -574,7 +575,6 @@
 			break;
 
 		case EXTENDED_ARG:
-			PyMem_Free(codestr);
 			goto exitUnchanged;
 
 		/* Replace RETURN LOAD_CONST None RETURN with just RETURN */
@@ -590,6 +590,7 @@
 	}
 
 	/* Fixup linenotab */
+	/* XXX make sure this handles intervals > 256 */
 	assert(PyString_Check(lineno_obj));
 	lineno = PyString_AS_STRING(lineno_obj);
 	tabsiz = PyString_GET_SIZE(lineno_obj);
@@ -631,6 +632,7 @@
 		while (adj--)
 			codestr[h++] = codestr[i++];
 	}
+	assert(h + nops == codelen);
 
 	code = PyString_FromStringAndSize((char *)codestr, h);
 	PyMem_Free(addrmap);