]> granicus.if.org Git - python/commitdiff
Fix error handling in PyCode_Optimize, by Alexander Schremmer at EuroPython sprint.
authorGeorg Brandl <georg@python.org>
Mon, 29 Jun 2009 14:44:49 +0000 (14:44 +0000)
committerGeorg Brandl <georg@python.org>
Mon, 29 Jun 2009 14:44:49 +0000 (14:44 +0000)
Python/peephole.c

index 13fc09103259d24c4f2382c8662652c07b1e9d47..fbc81ff99380a0a9abb9ceaa8f9b5e98d0146a63 100644 (file)
@@ -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;
 }