diff options
author | Benjamin Peterson <benjamin@python.org> | 2012-04-03 00:30:38 -0400 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2012-04-03 00:30:38 -0400 |
commit | b9348e76e40f9324330b496824d81941e9ee69d8 (patch) | |
tree | 34ba3d6d4c2fcd615d9b9c82a149e8a8507e85b3 /Python/pythonrun.c | |
parent | b6e21a0725bdbcf56d232b2be72998934438422d (diff) | |
download | cpython-git-b9348e76e40f9324330b496824d81941e9ee69d8.tar.gz |
fix parse_syntax_error to clean up its resources
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 dcb2c0ebcc..afb4c51017 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; } |