diff options
author | Georg Brandl <georg@python.org> | 2009-06-29 14:44:49 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2009-06-29 14:44:49 (GMT) |
commit | e323e0e91a27df127f53d24f2d741c2172e11233 (patch) | |
tree | 8b148b3f278d81e93f81d329e25c39acda1d1a67 /Python | |
parent | 99ebc63f49f19cf24d213b998ab8887357c3b215 (diff) | |
download | cpython-e323e0e91a27df127f53d24f2d741c2172e11233.zip cpython-e323e0e91a27df127f53d24f2d741c2172e11233.tar.gz cpython-e323e0e91a27df127f53d24f2d741c2172e11233.tar.bz2 |
Fix error handling in PyCode_Optimize, by Alexander Schremmer at EuroPython sprint.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/peephole.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/Python/peephole.c b/Python/peephole.c index 13fc091..fbc81ff 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -305,7 +305,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Bail out if an exception is set */ if (PyErr_Occurred()) - goto exitUnchanged; + goto exitError; /* Bypass optimization when the lineno table is too complex */ assert(PyString_Check(lineno_obj)); @@ -323,7 +323,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Make a modifiable copy of the code string */ codestr = (unsigned char *)PyMem_Malloc(codelen); if (codestr == NULL) - goto exitUnchanged; + goto exitError; codestr = (unsigned char *)memcpy(codestr, PyString_AS_STRING(code), codelen); @@ -338,11 +338,11 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Mapping to new jump targets after NOPs are removed */ addrmap = (int *)PyMem_Malloc(codelen * sizeof(int)); if (addrmap == NULL) - goto exitUnchanged; + goto exitError; blocks = markblocks(codestr, codelen); if (blocks == NULL) - goto exitUnchanged; + goto exitError; assert(PyList_Check(consts)); for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) { @@ -394,7 +394,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, } if (j == PyList_GET_SIZE(consts)) { if (PyList_Append(consts, Py_None) == -1) - goto exitUnchanged; + goto exitError; } assert(PyList_GET_ITEM(consts, j) == Py_None); codestr[i] = LOAD_CONST; @@ -647,6 +647,9 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, PyMem_Free(blocks); return code; + exitError: + code = NULL; + exitUnchanged: if (blocks != NULL) PyMem_Free(blocks); @@ -654,6 +657,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, PyMem_Free(addrmap); if (codestr != NULL) PyMem_Free(codestr); - Py_INCREF(code); + Py_XINCREF(code); return code; } |