Eliminate UNSUPPORTED_ERROR.

I have a case that could use an exception for "unsupported feature".
I found UNSUPPORTED_ERROR, but looking deeper, I think as is, reusing
it for other things would be fragile.  E.g., if the Python script
sourced by source_script_from_stream triggers any other missing
functionality that would result in UNSUPPORTED_ERROR being propagated
out to source_script_from_stream, that would confuse the error for
Python not being built into GDB.

This patch thus redoes things a little.  Instead of using an exception
for the "No Python" scenario, check whether Python is configured in
before actually trying to source the file.  It adds a new function
instead of using #ifdef HAVE_PYTHON directly, as that is better at
avoiding bitrot, as both Python and !Python paths are visible to the
compiler this way.

Tested on Fedora 17, with and without Python.

gdb/
2013-12-12  Pedro Alves  <palves@redhat.com>

	* cli/cli-cmds.c (source_script_from_stream) Use have_python
	instead of catching UNSUPPORTED_ERROR.
	* exceptions.h (UNSUPPORTED_ERROR): Delete.
	* python/python.c (source_python_script) [!HAVE_PYTHON]: Internal
	error if called.
	* python/python.h (have_python): New static inline function.
This commit is contained in:
Pedro Alves 2013-12-11 09:49:08 +00:00
parent 43942612f4
commit f23981e991
5 changed files with 32 additions and 24 deletions

View File

@ -1,3 +1,12 @@
2013-12-12 Pedro Alves <palves@redhat.com>
* cli/cli-cmds.c (source_script_from_stream) Use have_python
instead of catching UNSUPPORTED_ERROR.
* exceptions.h (UNSUPPORTED_ERROR): Delete.
* python/python.c (source_python_script) [!HAVE_PYTHON]: Internal
error if called.
* python/python.h (have_python): New static inline function.
2013-12-11 Doug Evans <dje@google.com>
* dwarf2read.c (lookup_dwo_cutu): Include name of dwp file in

View File

@ -525,27 +525,15 @@ source_script_from_stream (FILE *stream, const char *file)
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)
if (have_python ())
source_python_script (stream, file);
else if (script_ext_mode == script_ext_soft)
{
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)
{
fseek (stream, 0, SEEK_SET);
script_from_file (stream, (char*) file);
}
else
{
/* Nope, just punt. */
throw_exception (e);
}
/* Fallback to GDB script mode. */
script_from_file (stream, file);
}
else
error (_("Python scripting is not supported in this copy of GDB."));
}
else
script_from_file (stream, file);

View File

@ -79,9 +79,6 @@ enum errors {
/* Error accessing memory. */
MEMORY_ERROR,
/* Feature is not supported in this copy of GDB. */
UNSUPPORTED_ERROR,
/* Value not available. E.g., a register was not collected in a
traceframe. */
NOT_AVAILABLE_ERROR,

View File

@ -1390,8 +1390,9 @@ eval_python_from_control_command (struct command_line *cmd)
void
source_python_script (FILE *file, const char *filename)
{
throw_error (UNSUPPORTED_ERROR,
_("Python scripting is not supported in this copy of GDB."));
internal_error (__FILE__, __LINE__,
_("source_python_script called when Python scripting is "
"not supported."));
}
int

View File

@ -89,6 +89,19 @@ typedef enum py_frame_args
CLI_ALL_VALUES
} py_frame_args;
/* Returns true if Python support is built into GDB, false
otherwise. */
static inline int
have_python (void)
{
#ifdef HAVE_PYTHON
return 1;
#else
return 0;
#endif
}
extern void finish_python_initialization (void);
void eval_python_from_control_command (struct command_line *);