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:
Tom Tromey 2010-06-25 18:15:18 +00:00
parent 099ef718e3
commit bc9f0842f1
6 changed files with 103 additions and 10 deletions

View file

@ -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" },