diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 456533228b..60be3817f1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2011-10-27 Doug Evans + + * cli/cli-cmds.c (source_script_with_search): Pass full path to + source_script_from_stream if it may have been found on the search path. + * python/py-auto-load.c (source_section_scripts): Pass full path to + source_python_script_for_objfile. + * python/python.c (source_python_script): Delete stream parameter. + All callers updated. + (source_python_script_for_objfile): Ditto. + * python/python-internal.h (source_python_script_for_objfile): Update. + * python/python.h (source_python_script): Update. + 2011-10-27 Tom Tromey * ada-lang.h (ada_start_decode_line_1, ada_finish_decode_line_1) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 34a530af03..624d0de285 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -535,7 +535,9 @@ source_script_from_stream (FILE *stream, const char *file) TRY_CATCH (e, RETURN_MASK_ERROR) { - source_python_script (stream, file); + /* The python support reopens the file using python functions, + so there's no point in passing STREAM here. */ + source_python_script (file); } if (e.reason < 0) { @@ -577,7 +579,7 @@ source_script_with_search (const char *file, int from_tty, int search_path) if (!find_and_open_script (file, search_path, &stream, &full_path)) { - /* The script wasn't found, or was otherwise inaccessible. + /* The script wasn't found, or was otherwise inaccessible. If the source command was invoked interactively, throw an error. Otherwise (e.g. if it was invoked by a script), silently ignore the error. */ @@ -588,7 +590,12 @@ source_script_with_search (const char *file, int from_tty, int search_path) } old_cleanups = make_cleanup (xfree, full_path); - source_script_from_stream (stream, file); + /* The python support reopens the file, so we need to pass full_path here + in case the file was found on the search path. It's useful to do this + anyway so that error messages show the actual file used. But only do + this if we (may have) used search_path, as printing the full path in + errors for the non-search case can be more noise than signal. */ + source_script_from_stream (stream, search_path ? full_path : file); do_cleanups (old_cleanups); } diff --git a/gdb/python/py-auto-load.c b/gdb/python/py-auto-load.c index 75fa0411ad..2a17ed00f3 100644 --- a/gdb/python/py-auto-load.c +++ b/gdb/python/py-auto-load.c @@ -312,7 +312,7 @@ Use `info auto-load-scripts [REGEXP]' to list them."), { /* If this file is not currently loaded, load it. */ if (! in_hash_table) - source_python_script_for_objfile (objfile, stream, file); + source_python_script_for_objfile (objfile, full_path); fclose (stream); free (full_path); } @@ -431,7 +431,7 @@ auto_load_objfile_script (struct objfile *objfile, const char *suffix) It's highly unlikely that we'd ever load it twice, and these scripts are required to be idempotent under multiple loads anyway. */ - source_python_script_for_objfile (objfile, input, debugfile); + source_python_script_for_objfile (objfile, debugfile); fclose (input); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index e593612b23..ef39d5dfbe 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -247,7 +247,7 @@ extern const struct language_defn *python_language; void gdbpy_print_stack (void); void source_python_script_for_objfile (struct objfile *objfile, - FILE *stream, const char *file); + const char *file); PyObject *python_string_to_unicode (PyObject *obj); char *unicode_to_target_string (PyObject *unicode_str); diff --git a/gdb/python/python.c b/gdb/python/python.c index df8e3d5fde..3a5a6b5b2d 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -599,21 +599,18 @@ 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. - STREAM is not closed, that is the caller's responsibility. */ +/* Read a file as Python code. + FILE is the name of the file. + This does not throw any errors. If an exception occurs python will print + the traceback and clear the error indicator. */ void -source_python_script (FILE *stream, const char *file) +source_python_script (const char *file) { struct cleanup *cleanup; cleanup = ensure_python_env (get_current_arch (), current_language); - - /* Note: If an exception occurs python will print the traceback and - clear the error indicator. */ python_run_simple_file (file); - do_cleanups (cleanup); } @@ -941,15 +938,12 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2) source_python_script_for_objfile; it is NULL at other times. */ static struct objfile *gdbpy_current_objfile; -/* Set the current objfile to OBJFILE and then read STREAM,FILE as - Python code. - STREAM is left open, it is up to the caller to close it. - If an exception occurs python will print the traceback and - clear the error indicator. */ +/* Set the current objfile to OBJFILE and then read FILE as Python code. + This does not throw any errors. If an exception occurs python will print + the traceback and clear the error indicator. */ void -source_python_script_for_objfile (struct objfile *objfile, - FILE *stream, const char *file) +source_python_script_for_objfile (struct objfile *objfile, const char *file) { struct cleanup *cleanups; @@ -1032,7 +1026,7 @@ eval_python_from_control_command (struct command_line *cmd) } void -source_python_script (FILE *stream, const char *file) +source_python_script (const char *file) { throw_error (UNSUPPORTED_ERROR, _("Python scripting is not supported in this copy of GDB.")); diff --git a/gdb/python/python.h b/gdb/python/python.h index ce0eb351f7..ae55cc2cd6 100644 --- a/gdb/python/python.h +++ b/gdb/python/python.h @@ -30,7 +30,7 @@ extern void finish_python_initialization (void); void eval_python_from_control_command (struct command_line *); -void source_python_script (FILE *stream, const char *file); +void source_python_script (const char *file); int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 00d21610b0..5bb77c2edf 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,12 +1,16 @@ +2011-10-27 Doug Evans + + * gdb.python/python.exp: Test source -s. + 2011-10-26 Paul Koning * gdb.python/lib-types.cc (struct A): New structure. * gdb.python/lib-types.exp (deepitems): New tests. - + 2011-10-25 Paul Koning PR python/13327 - + * gdb.python/py-value.exp: Add testcases for is_lazy attribute, fetch_lazy method. diff --git a/gdb/testsuite/gdb.python/python.exp b/gdb/testsuite/gdb.python/python.exp index ea8a4d56ca..94d6d0da26 100644 --- a/gdb/testsuite/gdb.python/python.exp +++ b/gdb/testsuite/gdb.python/python.exp @@ -77,6 +77,8 @@ gdb_py_test_multiple "indented multi-line python command" \ gdb_test "source $srcdir/$subdir/source2.py" "yes" "source source2.py" +gdb_test "source -s source2.py" "yes" "source -s source2.py" + gdb_test "python print gdb.current_objfile()" "None" gdb_test "python print gdb.objfiles()" "\\\[\\\]"