gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 26 Jan 2012 21:54:45 +0000 (21:54 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 26 Jan 2012 21:54:45 +0000 (21:54 +0000)
Do not open script filenames twice.
* cli/cli-cmds.c (source_script_from_stream): Pass to
source_python_script also STREAM.
* python/py-auto-load.c (source_section_scripts): Pass to
source_python_script_for_objfile also STREAM.
(auto_load_objfile_script): Pass to source_python_script_for_objfile
also INPUT.
* python/python-internal.h (source_python_script_for_objfile): New
parameter file, rename parameter file to filename.
* python/python.c (python_run_simple_file): Call PyRun_SimpleFile
instead if !_WIN32.  Update the function comment.
(source_python_script, source_python_script_for_objfile)
(source_python_script): New parameter file, rename parameter file to
filename.  Pass FILENAME to python_run_simple_file.
* python/python.h (source_python_script): New parameter file, rename
parameter file to filename.

gdb/ChangeLog
gdb/cli/cli-cmds.c
gdb/python/py-auto-load.c
gdb/python/python-internal.h
gdb/python/python.c
gdb/python/python.h

index b918a442f6eeff819b724ee0f619a6d9c68c434c..1c177771b9e7997914e9dacea97adf68ba37c0c3 100644 (file)
@@ -1,3 +1,22 @@
+2012-01-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       Do not open script filenames twice.
+       * cli/cli-cmds.c (source_script_from_stream): Pass to
+       source_python_script also STREAM.
+       * python/py-auto-load.c (source_section_scripts): Pass to
+       source_python_script_for_objfile also STREAM.
+       (auto_load_objfile_script): Pass to source_python_script_for_objfile
+       also INPUT.
+       * python/python-internal.h (source_python_script_for_objfile): New
+       parameter file, rename parameter file to filename.
+       * python/python.c (python_run_simple_file): Call PyRun_SimpleFile
+       instead if !_WIN32.  Update the function comment.
+       (source_python_script, source_python_script_for_objfile)
+       (source_python_script): New parameter file, rename parameter file to
+       filename.  Pass FILENAME to python_run_simple_file.
+       * python/python.h (source_python_script): New parameter file, rename
+       parameter file to filename.
+
 2012-01-26  Pedro Alves  <palves@redhat.com>
 
        * corelow.c (core_has_fake_pid): Delete.
index 15b6b792c30925de03bc8aa8a5359f4849d4c7c2..9c118e10f54474f3f415f6f0d3243e173b90b528 100644 (file)
@@ -539,9 +539,7 @@ source_script_from_stream (FILE *stream, const char *file)
 
       TRY_CATCH (e, RETURN_MASK_ERROR)
        {
-          /* The python support reopens the file using python functions,
-             so there's no point in passing STREAM here.  */
-         source_python_script (file);
+         source_python_script (stream, file);
        }
       if (e.reason < 0)
        {
index 3abb82a15ce99d27d7aed0e796d6dd50ad7222cc..e297bf3afc314dc95ef89d1dc5651b8ef2297d18 100644 (file)
@@ -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, full_path);
+           source_python_script_for_objfile (objfile, stream, full_path);
          fclose (stream);
          xfree (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, debugfile);
+      source_python_script_for_objfile (objfile, input, debugfile);
       fclose (input);
     }
 
index 328e5d87878e842650d4576860fa05eba2f9daad..22e6b4192c1f35fe088772f9ee47f0b768bd1784 100644 (file)
@@ -289,8 +289,8 @@ extern const struct language_defn *python_language;
 
 void gdbpy_print_stack (void);
 
-void source_python_script_for_objfile (struct objfile *objfile,
-                                      const char *file);
+void source_python_script_for_objfile (struct objfile *objfile, FILE *file,
+                                      const char *filename);
 
 PyObject *python_string_to_unicode (PyObject *obj);
 char *unicode_to_target_string (PyObject *unicode_str);
index 5a0d7767f14aab88011fdfd7ef40917dccbd9ea2..795dd4425d261355b9d8f60e79cb33aa48025e15 100644 (file)
@@ -151,34 +151,31 @@ ensure_python_env (struct gdbarch *gdbarch,
   return make_cleanup (restore_python_env, env);
 }
 
-/* A wrapper around PyRun_SimpleFile.  FILENAME is the name of
-   the Python script to run.
-
-   One of the parameters of PyRun_SimpleFile is a FILE *.
-   The problem is that type FILE is extremely system and compiler
-   dependent.  So, unless the Python library has been compiled using
-   the same build environment as GDB, we run the risk of getting
-   a crash due to inconsistencies between the definition used by GDB,
-   and the definition used by Python.  A mismatch can very likely
-   lead to a crash.
-
-   There is also the situation where the Python library and GDB
-   are using two different versions of the C runtime library.
-   This is particularly visible on Windows, where few users would
-   build Python themselves (this is no trivial task on this platform),
-   and thus use binaries built by someone else instead. Python,
-   being built with VC, would use one version of the msvcr DLL
-   (Eg. msvcr100.dll), while MinGW uses msvcrt.dll.  A FILE *
-   from one runtime does not necessarily operate correctly in
+/* A wrapper around PyRun_SimpleFile.  FILE is the Python script to run
+   named FILENAME.
+
+   On Windows hosts few users would build Python themselves (this is no
+   trivial task on this platform), and thus use binaries built by
+   someone else instead.  There may happen situation where the Python
+   library and GDB are using two different versions of the C runtime
+   library.  Python, being built with VC, would use one version of the
+   msvcr DLL (Eg. msvcr100.dll), while MinGW uses msvcrt.dll.
+   A FILE * from one runtime does not necessarily operate correctly in
    the other runtime.
 
-   To work around this potential issue, we create the FILE object
-   using Python routines, thus making sure that it is compatible
-   with the Python library.  */
+   To work around this potential issue, we create on Windows hosts the
+   FILE object using Python routines, thus making sure that it is
+   compatible with the Python library.  */
 
 static void
-python_run_simple_file (const char *filename)
+python_run_simple_file (FILE *file, const char *filename)
 {
+#ifndef _WIN32
+
+  PyRun_SimpleFile (file, filename);
+
+#else /* _WIN32 */
+
   char *full_path;
   PyObject *python_file;
   struct cleanup *cleanup;
@@ -198,6 +195,8 @@ python_run_simple_file (const char *filename)
   make_cleanup_py_decref (python_file);
   PyRun_SimpleFile (PyFile_AsFile (python_file), filename);
   do_cleanups (cleanup);
+
+#endif /* _WIN32 */
 }
 
 /* Given a command_line, return a command string suitable for passing
@@ -620,17 +619,17 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args)
 }
 
 /* Read a file as Python code.
-   FILE is the name of the file.
+   FILE is the file to run.  FILENAME is name of the file 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 (const char *file)
+source_python_script (FILE *file, const char *filename)
 {
   struct cleanup *cleanup;
 
   cleanup = ensure_python_env (get_current_arch (), current_language);
-  python_run_simple_file (file);
+  python_run_simple_file (file, filename);
   do_cleanups (cleanup);
 }
 
@@ -991,19 +990,20 @@ 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 FILE as Python code.
-   This does not throw any errors.  If an exception occurs python will print
-   the traceback and clear the error indicator.  */
+/* Set the current objfile to OBJFILE and then read FILE named FILENAME
+   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, const char *file)
+source_python_script_for_objfile (struct objfile *objfile, FILE *file,
+                                  const char *filename)
 {
   struct cleanup *cleanups;
 
   cleanups = ensure_python_env (get_objfile_arch (objfile), current_language);
   gdbpy_current_objfile = objfile;
 
-  python_run_simple_file (file);
+  python_run_simple_file (file, filename);
 
   do_cleanups (cleanups);
   gdbpy_current_objfile = NULL;
@@ -1079,7 +1079,7 @@ eval_python_from_control_command (struct command_line *cmd)
 }
 
 void
-source_python_script (const char *file)
+source_python_script (FILE *file, const char *filename)
 {
   throw_error (UNSUPPORTED_ERROR,
               _("Python scripting is not supported in this copy of GDB."));
index 9e461f7ee9d3968b575bf31a4a3e8cae598543c1..597ed2ec992d38a76f7432939fb935276c98c8be 100644 (file)
@@ -30,7 +30,7 @@ extern void finish_python_initialization (void);
 
 void eval_python_from_control_command (struct command_line *);
 
-void source_python_script (const char *file);
+void source_python_script (FILE *file, const char *filename);
 
 int apply_val_pretty_printer (struct type *type, const gdb_byte *valaddr,
                              int embedded_offset, CORE_ADDR address,