Mercurial > cpython-lru_cache-weakref
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);
