Allow "source" to load python scripts.

* exceptions.h (enum errors): Add UNSUPPORTED_ERROR.
        * python/python.c (source_python_script): New function.
        * python/python.h (source_python_script): Add declaration.
        * cli/cli-cmds.c: #include exceptions.h and python/python.h.
        (script_ext_off, script_ext_soft, script_ext_strict)
        (script_ext_enums, script_ext_mode): New static constants.
        (show_script_ext_mode, find_and_open_script): New functions.
        (source_script): Enhance to handle Python scripts.
        (init_cli_cmds): Add set/show script-extension commands.
This commit is contained in:
Joel Brobecker 2010-01-18 06:25:22 +00:00
parent 23db03a605
commit 973817a313
5 changed files with 139 additions and 12 deletions

View File

@ -1,3 +1,17 @@
2010-01-18 Tom Tromey <tromey@redhat.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
Allow "source" to load python scripts.
* exceptions.h (enum errors): Add UNSUPPORTED_ERROR.
* python/python.c (source_python_script): New function.
* python/python.h (source_python_script): Add declaration.
* cli/cli-cmds.c: #include exceptions.h and python/python.h.
(script_ext_off, script_ext_soft, script_ext_strict)
(script_ext_enums, script_ext_mode): New static constants.
(show_script_ext_mode, find_and_open_script): New functions.
(source_script): Enhance to handle Python scripts.
(init_cli_cmds): Add set/show script-extension commands.
2010-01-16 Stan Shebs <stan@codesourcery.com>
* tracepoint.h (struct trace_status): Use unsigned long long

View File

@ -19,6 +19,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
#include "exceptions.h"
#include "arch-utils.h"
#include "readline/readline.h"
#include "readline/tilde.h"
@ -47,6 +48,8 @@ extern void disconnect_or_stop_tracing (int from_tty);
#include "cli/cli-setshow.h"
#include "cli/cli-cmds.h"
#include "python/python.h"
#ifdef TUI
#include "tui/tui.h" /* For tui_active et.al. */
#endif
@ -187,6 +190,21 @@ struct cmd_list_element *showchecklist;
int source_verbose = 0;
int trace_commands = 0;
/* 'script-extension' option support. */
static const char script_ext_off[] = "off";
static const char script_ext_soft[] = "soft";
static const char script_ext_strict[] = "strict";
static const char *script_ext_enums[] = {
script_ext_off,
script_ext_soft,
script_ext_strict,
NULL
};
static const char *script_ext_mode = script_ext_soft;
/* Utility used everywhere when at least one argument is needed and
none is supplied. */
@ -441,18 +459,25 @@ cd_command (char *dir, int from_tty)
pwd_command ((char *) 0, 1);
}
void
source_script (char *file, int from_tty)
/* Show the current value of the 'script-extension' option. */
static void
show_script_ext_mode (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
FILE *stream;
struct cleanup *old_cleanups;
fprintf_filtered (file, _("\
Script filename extension recognition is \"%s\".\n"),
value);
}
static int
find_and_open_script (int from_tty, char **filep, FILE **streamp,
struct cleanup **cleanupp)
{
char *file = *filep;
char *full_pathname = NULL;
int fd;
if (file == NULL || *file == 0)
{
error (_("source command requires file name of file to source."));
}
struct cleanup *old_cleanups;
file = tilde_expand (file);
old_cleanups = make_cleanup (xfree, file);
@ -476,12 +501,58 @@ source_script (char *file, int from_tty)
else
{
do_cleanups (old_cleanups);
return;
return 0;
}
}
stream = fdopen (fd, FOPEN_RT);
script_from_file (stream, file);
*streamp = fdopen (fd, FOPEN_RT);
*filep = file;
*cleanupp = old_cleanups;
return 1;
}
void
source_script (char *file, int from_tty)
{
FILE *stream;
struct cleanup *old_cleanups;
if (file == NULL || *file == 0)
{
error (_("source command requires file name of file to source."));
}
if (!find_and_open_script (from_tty, &file, &stream, &old_cleanups))
return;
if (script_ext_mode != script_ext_off
&& strlen (file) > 3 && !strcmp (&file[strlen (file) - 3], ".py"))
{
volatile struct gdb_exception e;
TRY_CATCH (e, RETURN_MASK_ERROR)
{
source_python_script (stream, file);
}
if (e.reason < 0)
{
/* Should we fallback to ye olde GDB script mode? */
if (script_ext_mode == script_ext_soft
&& e.reason == RETURN_ERROR && e.error == UNSUPPORTED_ERROR)
{
if (!find_and_open_script (from_tty, &file, &stream, &old_cleanups))
return;
script_from_file (stream, file);
}
else
/* Nope, just punt. */
throw_exception (e);
}
}
else
script_from_file (stream, file);
do_cleanups (old_cleanups);
}
@ -1314,6 +1385,19 @@ when GDB is started."), gdbinit);
source_help_text, &cmdlist);
set_cmd_completer (c, filename_completer);
add_setshow_enum_cmd ("script-extension", class_support,
script_ext_enums, &script_ext_mode, _("\
Set mode for script filename extension recognition."), _("\
Show mode for script filename extension recognition."), _("\
off == no filename extension recognition (all sourced files are GDB scripts)\n\
soft == evaluate script according to filename extension, fallback to GDB script"
"\n\
strict == evaluate script according to filename extension, error if not supported"
),
NULL,
show_script_ext_mode,
&setlist, &showlist);
add_com ("quit", class_support, quit_command, _("Exit gdb."));
c = add_com ("help", class_support, help_command,
_("Print list of commands."));

View File

@ -75,6 +75,9 @@ enum errors {
/* Error accessing memory. */
MEMORY_ERROR,
/* Feature is not supported in this copy of GDB. */
UNSUPPORTED_ERROR,
/* Add more errors here. */
NR_ERRORS
};

View File

@ -343,6 +343,22 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args)
return value_to_value_object (result);
}
/* Read a file as Python code. STREAM is the input file; FILE is the
name of the file. */
void
source_python_script (FILE *stream, char *file)
{
PyGILState_STATE state;
state = PyGILState_Ensure ();
PyRun_SimpleFile (stream, file);
fclose (stream);
PyGILState_Release (state);
}
/* Printing. */
@ -525,6 +541,14 @@ eval_python_from_control_command (struct command_line *cmd)
error (_("Python scripting is not supported in this copy of GDB."));
}
void
source_python_script (FILE *stream, char *file)
{
fclose (stream);
throw_error (UNSUPPORTED_ERROR,
_("Python scripting is not supported in this copy of GDB."));
}
#endif /* HAVE_PYTHON */

View File

@ -24,6 +24,8 @@
void eval_python_from_control_command (struct command_line *);
void source_python_script (FILE *stream, char *file);
int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,