Add a new "python-interactive" command that starts a standard
Python interactive prompt with "pi" as alias, and add "py" as an alias to "python". * NEWS: Mention the new commands. * doc/gdb.texinfo (Python Commands): Document the new commands. * python/python.c (eval_python_command): New function. (python_interactive_command): For "python-interactive" with arguments, call eval_python_command. For "python-interactive" without arguments, call PyRun_InteractiveLoop. (_initialize_python): Add "python-interactive" command with "pi" as alias, and add "py" as an alias to "python".
This commit is contained in:
parent
1e2bee4f5f
commit
8315665ec1
4 changed files with 145 additions and 4 deletions
|
@ -1,3 +1,18 @@
|
||||||
|
2012-08-22 Khoo Yit Phang <khooyp@cs.umd.edu>
|
||||||
|
|
||||||
|
Add a new "python-interactive" command that starts a standard
|
||||||
|
Python interactive prompt with "pi" as alias, and add "py" as
|
||||||
|
an alias to "python".
|
||||||
|
* NEWS: Mention the new commands.
|
||||||
|
* doc/gdb.texinfo (Python Commands): Document the new
|
||||||
|
commands.
|
||||||
|
* python/python.c (eval_python_command): New function.
|
||||||
|
(python_interactive_command): For "python-interactive" with
|
||||||
|
arguments, call eval_python_command. For "python-interactive"
|
||||||
|
without arguments, call PyRun_InteractiveLoop.
|
||||||
|
(_initialize_python): Add "python-interactive" command with
|
||||||
|
"pi" as alias, and add "py" as an alias to "python".
|
||||||
|
|
||||||
2012-08-22 Tom Tromey <tromey@redhat.com>
|
2012-08-22 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* defs.h (quit_flag): Don't declare.
|
* defs.h (quit_flag): Don't declare.
|
||||||
|
|
8
gdb/NEWS
8
gdb/NEWS
|
@ -31,6 +31,14 @@
|
||||||
maint info bfds
|
maint info bfds
|
||||||
List the BFDs known to GDB.
|
List the BFDs known to GDB.
|
||||||
|
|
||||||
|
python-interactive [command]
|
||||||
|
pi [command]
|
||||||
|
Start a Python interactive prompt, or evaluate the optional command
|
||||||
|
and print the result of expressions.
|
||||||
|
|
||||||
|
py [command]
|
||||||
|
"py" is a new alias for "python".
|
||||||
|
|
||||||
* MI changes
|
* MI changes
|
||||||
|
|
||||||
** Command parameter changes are now notified using new async record
|
** Command parameter changes are now notified using new async record
|
||||||
|
|
|
@ -22506,12 +22506,30 @@ automatically imported when @value{GDBN} starts.
|
||||||
@cindex python commands
|
@cindex python commands
|
||||||
@cindex commands to access python
|
@cindex commands to access python
|
||||||
|
|
||||||
@value{GDBN} provides one command for accessing the Python interpreter,
|
@value{GDBN} provides two commands for accessing the Python interpreter,
|
||||||
and one related setting:
|
and one related setting:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
@kindex python-interactive
|
||||||
|
@kindex pi
|
||||||
|
@item python-interactive @r{[}@var{command}@r{]}
|
||||||
|
@itemx pi @r{[}@var{command}@r{]}
|
||||||
|
Without an argument, the @code{python-interactive} command can be used
|
||||||
|
to start an interactive Python prompt.
|
||||||
|
|
||||||
|
Alternatively, a single-line Python command can be given as an
|
||||||
|
argument and evaluated. If the command is an expression, the result
|
||||||
|
will be printed; otherwise, nothing will be printed. For example:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
(@value{GDBP}) python-interactive 2 + 3
|
||||||
|
5
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
@kindex python
|
@kindex python
|
||||||
@item python @r{[}@var{code}@r{]}
|
@kindex py
|
||||||
|
@item python @r{[}@var{command}@r{]}
|
||||||
|
@itemx py @r{[}@var{command}@r{]}
|
||||||
The @code{python} command can be used to evaluate Python code.
|
The @code{python} command can be used to evaluate Python code.
|
||||||
|
|
||||||
If given an argument, the @code{python} command will evaluate the
|
If given an argument, the @code{python} command will evaluate the
|
||||||
|
|
|
@ -176,6 +176,75 @@ check_quit_flag (void)
|
||||||
return PyOS_InterruptOccurred ();
|
return PyOS_InterruptOccurred ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Evaluate a Python command like PyRun_SimpleString, but uses
|
||||||
|
Py_single_input which prints the result of expressions, and does
|
||||||
|
not automatically print the stack on errors. */
|
||||||
|
|
||||||
|
static int
|
||||||
|
eval_python_command (const char *command)
|
||||||
|
{
|
||||||
|
PyObject *m, *d, *v;
|
||||||
|
|
||||||
|
m = PyImport_AddModule ("__main__");
|
||||||
|
if (m == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
d = PyModule_GetDict (m);
|
||||||
|
if (d == NULL)
|
||||||
|
return -1;
|
||||||
|
v = PyRun_StringFlags (command, Py_single_input, d, d, NULL);
|
||||||
|
if (v == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
Py_DECREF (v);
|
||||||
|
if (Py_FlushLine ())
|
||||||
|
PyErr_Clear ();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Implementation of the gdb "python-interactive" command. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
python_interactive_command (char *arg, int from_tty)
|
||||||
|
{
|
||||||
|
struct cleanup *cleanup;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
cleanup = make_cleanup_restore_integer (&interpreter_async);
|
||||||
|
interpreter_async = 0;
|
||||||
|
|
||||||
|
while (arg && *arg && isspace (*arg))
|
||||||
|
++arg;
|
||||||
|
|
||||||
|
ensure_python_env (get_current_arch (), current_language);
|
||||||
|
|
||||||
|
if (arg && *arg)
|
||||||
|
{
|
||||||
|
int len = strlen (arg);
|
||||||
|
char *script = xmalloc (len + 2);
|
||||||
|
|
||||||
|
strcpy (script, arg);
|
||||||
|
script[len] = '\n';
|
||||||
|
script[len + 1] = '\0';
|
||||||
|
err = eval_python_command (script);
|
||||||
|
xfree (script);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
err = PyRun_InteractiveLoop (instream, "<stdin>");
|
||||||
|
dont_repeat ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
gdbpy_print_stack ();
|
||||||
|
error (_("Error while executing Python code."));
|
||||||
|
}
|
||||||
|
|
||||||
|
do_cleanups (cleanup);
|
||||||
|
}
|
||||||
|
|
||||||
/* A wrapper around PyRun_SimpleFile. FILE is the Python script to run
|
/* A wrapper around PyRun_SimpleFile. FILE is the Python script to run
|
||||||
named FILENAME.
|
named FILENAME.
|
||||||
|
|
||||||
|
@ -1112,10 +1181,11 @@ gdbpy_objfiles (PyObject *unused1, PyObject *unused2)
|
||||||
|
|
||||||
#else /* HAVE_PYTHON */
|
#else /* HAVE_PYTHON */
|
||||||
|
|
||||||
/* Dummy implementation of the gdb "python" command. */
|
/* Dummy implementation of the gdb "python-interactive" and "python"
|
||||||
|
command. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
python_command (char *arg, int from_tty)
|
python_interactive_command (char *arg, int from_tty)
|
||||||
{
|
{
|
||||||
while (arg && *arg && isspace (*arg))
|
while (arg && *arg && isspace (*arg))
|
||||||
++arg;
|
++arg;
|
||||||
|
@ -1131,6 +1201,12 @@ python_command (char *arg, int from_tty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
python_command (char *arg, int from_tty)
|
||||||
|
{
|
||||||
|
python_interactive_command (arg, from_tty);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eval_python_from_control_command (struct command_line *cmd)
|
eval_python_from_control_command (struct command_line *cmd)
|
||||||
{
|
{
|
||||||
|
@ -1197,6 +1273,29 @@ _initialize_python (void)
|
||||||
char *cmd_name;
|
char *cmd_name;
|
||||||
struct cmd_list_element *cmd;
|
struct cmd_list_element *cmd;
|
||||||
|
|
||||||
|
add_com ("python-interactive", class_obscure,
|
||||||
|
python_interactive_command,
|
||||||
|
#ifdef HAVE_PYTHON
|
||||||
|
_("\
|
||||||
|
Start a Python interactive prompt.\n\
|
||||||
|
\n\
|
||||||
|
Alternatively, a single-line Python command can be given as an\n\
|
||||||
|
argument, and if the command is an expression, the result will be\n\
|
||||||
|
printed. For example:\n\
|
||||||
|
\n\
|
||||||
|
(gdb) python-interactive 2 + 3\n\
|
||||||
|
5\n\
|
||||||
|
")
|
||||||
|
#else /* HAVE_PYTHON */
|
||||||
|
_("\
|
||||||
|
Start a Python interactive prompt.\n\
|
||||||
|
\n\
|
||||||
|
Python scripting is not supported in this copy of GDB.\n\
|
||||||
|
This command is only a placeholder.")
|
||||||
|
#endif /* HAVE_PYTHON */
|
||||||
|
);
|
||||||
|
add_com_alias ("pi", "python-interactive", class_obscure, 1);
|
||||||
|
|
||||||
add_com ("python", class_obscure, python_command,
|
add_com ("python", class_obscure, python_command,
|
||||||
#ifdef HAVE_PYTHON
|
#ifdef HAVE_PYTHON
|
||||||
_("\
|
_("\
|
||||||
|
@ -1217,6 +1316,7 @@ Python scripting is not supported in this copy of GDB.\n\
|
||||||
This command is only a placeholder.")
|
This command is only a placeholder.")
|
||||||
#endif /* HAVE_PYTHON */
|
#endif /* HAVE_PYTHON */
|
||||||
);
|
);
|
||||||
|
add_com_alias ("py", "python", class_obscure, 1);
|
||||||
|
|
||||||
/* Add set/show python print-stack. */
|
/* Add set/show python print-stack. */
|
||||||
add_prefix_cmd ("python", no_class, user_show_python,
|
add_prefix_cmd ("python", no_class, user_show_python,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue