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.
This commit is contained in:
parent
099ef718e3
commit
bc9f0842f1
6 changed files with 103 additions and 10 deletions
|
@ -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" },
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue