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
|
@ -1,3 +1,13 @@
|
||||||
|
2010-06-25 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
2010-06-25 Ulrich Weigand <uweigand@de.ibm.com>
|
2010-06-25 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* s390-tdep.c (s390_push_dummy_call): Error on stack overflow
|
* s390-tdep.c (s390_push_dummy_call): Error on stack overflow
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-06-25 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
PR python/10808:
|
||||||
|
* gdb.texinfo (Basic Python): Document new gdb.execute argument.
|
||||||
|
|
||||||
2010-06-24 Hui Zhu <teawater@gmail.com>
|
2010-06-24 Hui Zhu <teawater@gmail.com>
|
||||||
|
|
||||||
* gdb.texinfo: (Commands for Controlled Output): Add
|
* gdb.texinfo: (Commands for Controlled Output): Add
|
||||||
|
|
|
@ -20200,15 +20200,20 @@ methods and classes added by @value{GDBN} are placed in this module.
|
||||||
use in all scripts evaluated by the @code{python} command.
|
use in all scripts evaluated by the @code{python} command.
|
||||||
|
|
||||||
@findex gdb.execute
|
@findex gdb.execute
|
||||||
@defun execute command [from_tty]
|
@defun execute command [from_tty] [to_string]
|
||||||
Evaluate @var{command}, a string, as a @value{GDBN} CLI command.
|
Evaluate @var{command}, a string, as a @value{GDBN} CLI command.
|
||||||
If a GDB exception happens while @var{command} runs, it is
|
If a GDB exception happens while @var{command} runs, it is
|
||||||
translated as described in @ref{Exception Handling,,Exception Handling}.
|
translated as described in @ref{Exception Handling,,Exception Handling}.
|
||||||
If no exceptions occur, this function returns @code{None}.
|
|
||||||
|
|
||||||
@var{from_tty} specifies whether @value{GDBN} ought to consider this
|
@var{from_tty} specifies whether @value{GDBN} ought to consider this
|
||||||
command as having originated from the user invoking it interactively.
|
command as having originated from the user invoking it interactively.
|
||||||
It must be a boolean value. If omitted, it defaults to @code{False}.
|
It must be a boolean value. If omitted, it defaults to @code{False}.
|
||||||
|
|
||||||
|
By default, any output produced by @var{command} is sent to
|
||||||
|
@value{GDBN}'s standard output. If the @var{to_string} parameter is
|
||||||
|
@code{True}, then output will be collected by @code{gdb.execute} and
|
||||||
|
returned as a string. The default is @code{False}, in which case the
|
||||||
|
return value is @code{None}.
|
||||||
@end defun
|
@end defun
|
||||||
|
|
||||||
@findex gdb.breakpoints
|
@findex gdb.breakpoints
|
||||||
|
|
|
@ -309,36 +309,94 @@ gdbpy_target_wide_charset (PyObject *self, PyObject *args)
|
||||||
return PyUnicode_Decode (cset, strlen (cset), host_charset (), NULL);
|
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. */
|
/* A Python function which evaluates a string using the gdb CLI. */
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
execute_gdb_command (PyObject *self, PyObject *args)
|
execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
|
||||||
{
|
{
|
||||||
char *arg;
|
char *arg;
|
||||||
PyObject *from_tty_obj = NULL;
|
PyObject *from_tty_obj = NULL, *to_string_obj = NULL;
|
||||||
int from_tty;
|
int from_tty, to_string;
|
||||||
int cmp;
|
|
||||||
volatile struct gdb_exception except;
|
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;
|
return NULL;
|
||||||
|
|
||||||
from_tty = 0;
|
from_tty = 0;
|
||||||
if (from_tty_obj)
|
if (from_tty_obj)
|
||||||
{
|
{
|
||||||
cmp = PyObject_IsTrue (from_tty_obj);
|
int cmp = PyObject_IsTrue (from_tty_obj);
|
||||||
if (cmp < 0)
|
if (cmp < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
from_tty = cmp;
|
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)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
/* Copy the argument text in case the command modifies it. */
|
/* Copy the argument text in case the command modifies it. */
|
||||||
char *copy = xstrdup (arg);
|
char *copy = xstrdup (arg);
|
||||||
struct cleanup *cleanup = make_cleanup (xfree, copy);
|
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);
|
execute_command (copy, from_tty);
|
||||||
|
|
||||||
|
if (str_file)
|
||||||
|
result = ui_file_xstrdup (str_file, NULL);
|
||||||
|
else
|
||||||
|
result = NULL;
|
||||||
|
|
||||||
do_cleanups (cleanup);
|
do_cleanups (cleanup);
|
||||||
}
|
}
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
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. */
|
/* Do any commands attached to breakpoint we stopped at. */
|
||||||
bpstat_do_actions ();
|
bpstat_do_actions ();
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
PyObject *r = PyString_FromString (result);
|
||||||
|
xfree (result);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -758,7 +822,7 @@ static PyMethodDef GdbMethods[] =
|
||||||
{
|
{
|
||||||
{ "history", gdbpy_history, METH_VARARGS,
|
{ "history", gdbpy_history, METH_VARARGS,
|
||||||
"Get a value from history" },
|
"Get a value from history" },
|
||||||
{ "execute", execute_gdb_command, METH_VARARGS,
|
{ "execute", (PyCFunction) execute_gdb_command, METH_VARARGS | METH_KEYWORDS,
|
||||||
"Execute a gdb command" },
|
"Execute a gdb command" },
|
||||||
{ "parameter", gdbpy_parameter, METH_VARARGS,
|
{ "parameter", gdbpy_parameter, METH_VARARGS,
|
||||||
"Return a gdb parameter's value" },
|
"Return a gdb parameter's value" },
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-06-25 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
|
PR python/10808:
|
||||||
|
* gdb.python/python.exp: Add new tests.
|
||||||
|
|
||||||
2010-06-25 Sami Wagiaalla <swagiaal@redhat.com>
|
2010-06-25 Sami Wagiaalla <swagiaal@redhat.com>
|
||||||
|
|
||||||
* gdb.cp/operator.cc: Created an import loop.
|
* gdb.cp/operator.cc: Created an import loop.
|
||||||
|
|
|
@ -83,3 +83,7 @@ gdb_test "python print gdb.objfiles()" "\\\[\\\]"
|
||||||
|
|
||||||
# Test http://bugs.python.org/issue4434 workaround in configure.ac
|
# Test http://bugs.python.org/issue4434 workaround in configure.ac
|
||||||
gdb_test "python import itertools; print 'IMPOR'+'TED'" "IMPORTED" "pythonX.Y/lib-dynload/*.so"
|
gdb_test "python import itertools; print 'IMPOR'+'TED'" "IMPORTED" "pythonX.Y/lib-dynload/*.so"
|
||||||
|
|
||||||
|
gdb_test_no_output \
|
||||||
|
"python x = gdb.execute('printf \"%d\", 23', to_string = True)"
|
||||||
|
gdb_test "python print x" "23"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue