diff options
author | Alexandre Vassalotti <alexandre@peadrop.com> | 2009-07-21 02:51:58 (GMT) |
---|---|---|
committer | Alexandre Vassalotti <alexandre@peadrop.com> | 2009-07-21 02:51:58 (GMT) |
commit | 6f8281865292ff1cec78331cb881fa311c4f6f92 (patch) | |
tree | ca67f272a1ca2b16c70085a75001eabb9204999a /Python | |
parent | 7b53fbfd35dbb5497807bfcc560a93b64eada695 (diff) | |
download | cpython-6f8281865292ff1cec78331cb881fa311c4f6f92.zip cpython-6f8281865292ff1cec78331cb881fa311c4f6f92.tar.gz cpython-6f8281865292ff1cec78331cb881fa311c4f6f92.tar.bz2 |
Merged revisions 73683,73786 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r73683 | georg.brandl | 2009-06-29 10:44:49 -0400 (Mon, 29 Jun 2009) | 1 line
Fix error handling in PyCode_Optimize, by Alexander Schremmer at EuroPython sprint.
........
r73786 | benjamin.peterson | 2009-07-02 18:56:16 -0400 (Thu, 02 Jul 2009) | 1 line
condense with assertRaises
........
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 23735b0..9163091 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -330,7 +330,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(PyBytes_Check(lineno_obj)); @@ -348,7 +348,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, PyBytes_AS_STRING(code), codelen); @@ -363,11 +363,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])) { @@ -413,7 +413,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, name = _PyUnicode_AsString(PyTuple_GET_ITEM(names, j)); h = load_global(codestr, i, name, consts); if (h < 0) - goto exitUnchanged; + goto exitError; else if (h == 0) continue; cumlc = lastlc + 1; @@ -667,6 +667,9 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, PyMem_Free(blocks); return code; + exitError: + code = NULL; + exitUnchanged: if (blocks != NULL) PyMem_Free(blocks); @@ -674,6 +677,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; } |