[Python-checkins] python/dist/src/Python compile.c,2.321,2.322
rhettinger at users.sourceforge.net
rhettinger at users.sourceforge.net
Tue Aug 24 06:34:19 CEST 2004
Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12031
Modified Files:
compile.c
Log Message:
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.
Index: compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.321
retrieving revision 2.322
diff -u -d -r2.321 -r2.322
--- compile.c 23 Aug 2004 23:37:47 -0000 2.321
+++ compile.c 24 Aug 2004 04:34:16 -0000 2.322
@@ -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);
More information about the Python-checkins
mailing list