diff options
author | Tom Tromey <tromey@redhat.com> | 2012-03-30 20:05:55 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-03-30 20:05:55 +0000 |
commit | 9bc3523d11081b973ad34f212cb5cacf3126a27f (patch) | |
tree | 9635876e96067d128db087aa9d90211a6e5a648e /gdb/python | |
parent | f87a302320198a6e616d5c64b8cb377236ed38df (diff) | |
download | gdb-9bc3523d11081b973ad34f212cb5cacf3126a27f.zip gdb-9bc3523d11081b973ad34f212cb5cacf3126a27f.tar.gz gdb-9bc3523d11081b973ad34f212cb5cacf3126a27f.tar.bz2 |
* python/python.c (gdbpy_decode_line): Move cleanup creation out
of TRY_CATCH. Fix error handling.
* python/py-value.c (convert_value_from_python): Move 'old'
declaration to innermost scope.
Diffstat (limited to 'gdb/python')
-rw-r--r-- | gdb/python/py-value.c | 3 | ||||
-rw-r--r-- | gdb/python/python.c | 29 |
2 files changed, 23 insertions, 9 deletions
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 58513d8..6f67bdb 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1250,7 +1250,6 @@ struct value * convert_value_from_python (PyObject *obj) { struct value *value = NULL; /* -Wall */ - struct cleanup *old; volatile struct gdb_exception except; int cmp; @@ -1319,6 +1318,8 @@ convert_value_from_python (PyObject *obj) s = python_string_to_target_string (obj); if (s != NULL) { + struct cleanup *old; + old = make_cleanup (xfree, s); value = value_cstring (s, strlen (s), builtin_type_pychar); do_cleanups (old); diff --git a/gdb/python/python.c b/gdb/python/python.c index 735d94d..938275a 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -503,7 +503,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args) appease gcc. */ struct symtab_and_line sal; const char *arg = NULL; - char *copy = NULL; + char *copy_to_free = NULL, *copy = NULL; struct cleanup *cleanups; PyObject *result = NULL; PyObject *return_result = NULL; @@ -515,14 +515,14 @@ gdbpy_decode_line (PyObject *self, PyObject *args) cleanups = make_cleanup (null_cleanup, NULL); + sals.sals = NULL; TRY_CATCH (except, RETURN_MASK_ALL) { if (arg) { copy = xstrdup (arg); - make_cleanup (xfree, copy); + copy_to_free = copy; sals = decode_line_1 (©, 0, 0, 0); - make_cleanup (xfree, sals.sals); } else { @@ -532,6 +532,13 @@ gdbpy_decode_line (PyObject *self, PyObject *args) sals.nelts = 1; } } + + if (sals.sals != NULL && sals.sals != &sal) + { + make_cleanup (xfree, copy_to_free); + make_cleanup (xfree, sals.sals); + } + if (except.reason < 0) { do_cleanups (cleanups); @@ -575,7 +582,16 @@ gdbpy_decode_line (PyObject *self, PyObject *args) } if (copy && strlen (copy) > 0) - unparsed = PyString_FromString (copy); + { + unparsed = PyString_FromString (copy); + if (unparsed == NULL) + { + Py_DECREF (result); + Py_DECREF (return_result); + return_result = NULL; + goto error; + } + } else { unparsed = Py_None; @@ -585,13 +601,10 @@ gdbpy_decode_line (PyObject *self, PyObject *args) PyTuple_SetItem (return_result, 0, unparsed); PyTuple_SetItem (return_result, 1, result); + error: do_cleanups (cleanups); return return_result; - - error: - do_cleanups (cleanups); - return NULL; } /* Parse a string and evaluate it as an expression. */ |