This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[commit] Fix loading of python scripts found by search path


Hi.
The recent change to use python's stdio routines broke the loading
of scripts found via the source search path.

E.g. source -s foo.py

I'm committing this.

2011-10-27  Doug Evans  <dje@google.com>

	* 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.

	testsuite/
	* gdb.python/python.exp: Test source -s.

Index: cli/cli-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v
retrieving revision 1.116
diff -u -p -r1.116 cli-cmds.c
--- cli/cli-cmds.c	9 Oct 2011 22:21:42 -0000	1.116
+++ cli/cli-cmds.c	27 Oct 2011 13:42:19 -0000
@@ -535,7 +535,9 @@ source_script_from_stream (FILE *stream,
 
       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)
 	{
@@ -588,7 +590,12 @@ source_script_with_search (const char *f
     }
 
   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);
 }
 
Index: python/py-auto-load.c
===================================================================
RCS file: /cvs/src/src/gdb/python/py-auto-load.c,v
retrieving revision 1.13
diff -u -p -r1.13 py-auto-load.c
--- python/py-auto-load.c	19 Sep 2011 19:01:40 -0000	1.13
+++ python/py-auto-load.c	27 Oct 2011 13:42:19 -0000
@@ -312,7 +312,7 @@ Use `info auto-load-scripts [REGEXP]' to
 	{
 	  /* 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
 	 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);
     }
 
Index: python/python-internal.h
===================================================================
RCS file: /cvs/src/src/gdb/python/python-internal.h,v
retrieving revision 1.51
diff -u -p -r1.51 python-internal.h
--- python/python-internal.h	20 Oct 2011 12:31:30 -0000	1.51
+++ python/python-internal.h	27 Oct 2011 13:42:19 -0000
@@ -247,7 +247,7 @@ extern const struct language_defn *pytho
 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);
Index: python/python.c
===================================================================
RCS file: /cvs/src/src/gdb/python/python.c,v
retrieving revision 1.75
diff -u -p -r1.75 python.c
--- python/python.c	7 Oct 2011 07:38:30 -0000	1.75
+++ python/python.c	27 Oct 2011 13:42:19 -0000
@@ -599,21 +599,18 @@ gdbpy_parse_and_eval (PyObject *self, Py
   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, PyO
    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
 }
 
 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."));
Index: python/python.h
===================================================================
RCS file: /cvs/src/src/gdb/python/python.h,v
retrieving revision 1.13
diff -u -p -r1.13 python.h
--- python/python.h	14 Mar 2011 16:09:54 -0000	1.13
+++ python/python.h	27 Oct 2011 13:42:19 -0000
@@ -30,7 +30,7 @@ extern void finish_python_initialization
 
 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,
Index: testsuite/gdb.python/python.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.python/python.exp,v
retrieving revision 1.27
diff -u -p -r1.27 python.exp
--- testsuite/gdb.python/python.exp	18 Oct 2011 14:14:01 -0000	1.27
+++ testsuite/gdb.python/python.exp	27 Oct 2011 14:48:10 -0000
@@ -77,6 +77,8 @@ gdb_py_test_multiple "indented multi-lin
 
 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()" "\\\[\\\]"
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]