summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2009-06-29 14:44:49 (GMT)
committerGeorg Brandl <georg@python.org>2009-06-29 14:44:49 (GMT)
commite323e0e91a27df127f53d24f2d741c2172e11233 (patch)
tree8b148b3f278d81e93f81d329e25c39acda1d1a67
parent99ebc63f49f19cf24d213b998ab8887357c3b215 (diff)
downloadcpython-e323e0e91a27df127f53d24f2d741c2172e11233.zip
cpython-e323e0e91a27df127f53d24f2d741c2172e11233.tar.gz
cpython-e323e0e91a27df127f53d24f2d741c2172e11233.tar.bz2
Fix error handling in PyCode_Optimize, by Alexander Schremmer at EuroPython sprint.
-rw-r--r--Python/peephole.c15
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;
}