diff options
author | Tom Tromey <tromey@redhat.com> | 2010-06-25 18:15:18 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2010-06-25 18:15:18 +0000 |
commit | bc9f0842f1f46aa754b20c5f2e12e2fa035041e3 (patch) | |
tree | 738e98334da63119066ee4dff2f1cf386a4e2df0 /gdb/python/python.c | |
parent | 099ef718e3aaecb6668e206fd9110ab57ae5cc45 (diff) | |
download | gdb-bc9f0842f1f46aa754b20c5f2e12e2fa035041e3.zip gdb-bc9f0842f1f46aa754b20c5f2e12e2fa035041e3.tar.gz gdb-bc9f0842f1f46aa754b20c5f2e12e2fa035041e3.tar.bz2 |
gdb
PR python/10808:
* python/python.c (execute_gdb_command): Add keywords. Accept
"to_string" argument.
(struct restore_ui_file_closure): New.
(restore_ui_file): New function.
(make_cleanup_restore_ui_file): Likewise.
(GdbMethods) <execute>: Update.
gdb/doc
PR python/10808:
* gdb.texinfo (Basic Python): Document new gdb.execute argument.
gdb/testsuite
PR python/10808:
* gdb.python/python.exp: Add new tests.
Diffstat (limited to 'gdb/python/python.c')
-rw-r--r-- | gdb/python/python.c | 80 |
1 files changed, 72 insertions, 8 deletions
diff --git a/gdb/python/python.c b/gdb/python/python.c index 18b2cdc..b9a8cf6 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -309,36 +309,94 @@ gdbpy_target_wide_charset (PyObject *self, PyObject *args) return PyUnicode_Decode (cset, strlen (cset), host_charset (), NULL); } +struct restore_ui_file_closure +{ + struct ui_file **variable; + struct ui_file *value; +}; + +static void +restore_ui_file (void *p) +{ + struct restore_ui_file_closure *closure = p; + + *(closure->variable) = closure->value; +} + +/* Remember the current value of *VARIABLE and make it restored when + the cleanup is run. */ +struct cleanup * +make_cleanup_restore_ui_file (struct ui_file **variable) +{ + struct restore_ui_file_closure *c = XNEW (struct restore_ui_file_closure); + + c->variable = variable; + c->value = *variable; + + return make_cleanup_dtor (restore_ui_file, (void *) c, xfree); +} + /* A Python function which evaluates a string using the gdb CLI. */ static PyObject * -execute_gdb_command (PyObject *self, PyObject *args) +execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) { char *arg; - PyObject *from_tty_obj = NULL; - int from_tty; - int cmp; + PyObject *from_tty_obj = NULL, *to_string_obj = NULL; + int from_tty, to_string; volatile struct gdb_exception except; + static char *keywords[] = {"command", "from_tty", "to_string", NULL }; + char *result = NULL; - if (! PyArg_ParseTuple (args, "s|O!", &arg, &PyBool_Type, &from_tty_obj)) + if (! PyArg_ParseTupleAndKeywords (args, kw, "s|O!O!", keywords, &arg, + &PyBool_Type, &from_tty_obj, + &PyBool_Type, &to_string_obj)) return NULL; from_tty = 0; if (from_tty_obj) { - cmp = PyObject_IsTrue (from_tty_obj); + int cmp = PyObject_IsTrue (from_tty_obj); if (cmp < 0) - return NULL; + return NULL; from_tty = cmp; } + to_string = 0; + if (to_string_obj) + { + int cmp = PyObject_IsTrue (to_string_obj); + if (cmp < 0) + return NULL; + to_string = cmp; + } + TRY_CATCH (except, RETURN_MASK_ALL) { /* Copy the argument text in case the command modifies it. */ char *copy = xstrdup (arg); struct cleanup *cleanup = make_cleanup (xfree, copy); + struct ui_file *str_file = NULL; + + if (to_string) + { + str_file = mem_fileopen (); + + make_cleanup_restore_ui_file (&gdb_stdout); + make_cleanup_restore_ui_file (&gdb_stderr); + make_cleanup_ui_file_delete (str_file); + + gdb_stdout = str_file; + gdb_stderr = str_file; + } execute_command (copy, from_tty); + + if (str_file) + result = ui_file_xstrdup (str_file, NULL); + else + result = NULL; + do_cleanups (cleanup); } GDB_PY_HANDLE_EXCEPTION (except); @@ -346,6 +404,12 @@ execute_gdb_command (PyObject *self, PyObject *args) /* Do any commands attached to breakpoint we stopped at. */ bpstat_do_actions (); + if (result) + { + PyObject *r = PyString_FromString (result); + xfree (result); + return r; + } Py_RETURN_NONE; } @@ -758,7 +822,7 @@ static PyMethodDef GdbMethods[] = { { "history", gdbpy_history, METH_VARARGS, "Get a value from history" }, - { "execute", execute_gdb_command, METH_VARARGS, + { "execute", (PyCFunction) execute_gdb_command, METH_VARARGS | METH_KEYWORDS, "Execute a gdb command" }, { "parameter", gdbpy_parameter, METH_VARARGS, "Return a gdb parameter's value" }, |