diff options
Diffstat (limited to 'Python/pythonrun.c')
| -rw-r--r-- | Python/pythonrun.c | 50 | 
1 files changed, 31 insertions, 19 deletions
| diff --git a/Python/pythonrun.c b/Python/pythonrun.c index dcb2c0e..afb4c51 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -989,55 +989,67 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,          return PyArg_ParseTuple(err, "O(ziiz)", message, filename,                                  lineno, offset, text); -    /* new style errors.  `err' is an instance */ +    *message = NULL; -    if (! (v = PyObject_GetAttrString(err, "msg"))) +    /* new style errors.  `err' is an instance */ +    *message = PyObject_GetAttrString(err, "msg"); +    if (!*message)          goto finally; -    *message = v; -    if (!(v = PyObject_GetAttrString(err, "filename"))) +    v = PyObject_GetAttrString(err, "filename"); +    if (!v)          goto finally; -    if (v == Py_None) +    if (v == Py_None) { +        Py_DECREF(v);          *filename = NULL; -    else if (! (*filename = PyString_AsString(v))) -        goto finally; +    } +    else { +        *filename = PyString_AsString(v); +        Py_DECREF(v); +        if (!*filename) +            goto finally; +    } -    Py_DECREF(v); -    if (!(v = PyObject_GetAttrString(err, "lineno"))) +    v = PyObject_GetAttrString(err, "lineno"); +    if (!v)          goto finally;      hold = PyInt_AsLong(v);      Py_DECREF(v); -    v = NULL;      if (hold < 0 && PyErr_Occurred())          goto finally;      *lineno = (int)hold; -    if (!(v = PyObject_GetAttrString(err, "offset"))) +    v = PyObject_GetAttrString(err, "offset"); +    if (!v)          goto finally;      if (v == Py_None) {          *offset = -1;          Py_DECREF(v); -        v = NULL;      } else {          hold = PyInt_AsLong(v);          Py_DECREF(v); -        v = NULL;          if (hold < 0 && PyErr_Occurred())              goto finally;          *offset = (int)hold;      } -    if (!(v = PyObject_GetAttrString(err, "text"))) +    v = PyObject_GetAttrString(err, "text"); +    if (!v)          goto finally; -    if (v == Py_None) +    if (v == Py_None) { +        Py_DECREF(v);          *text = NULL; -    else if (! (*text = PyString_AsString(v))) -        goto finally; -    Py_DECREF(v); +    } +    else { +        *text = PyString_AsString(v); +        Py_DECREF(v); +        if (!*text) +            goto finally; +    }      return 1;  finally: -    Py_XDECREF(v); +    Py_XDECREF(*message);      return 0;  } | 
