gdb/
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.
This commit is contained in:
parent
88f38a0478
commit
4c63965b8a
6 changed files with 56 additions and 39 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
/* A wrapper around PyRun_SimpleFile. FILE is the Python script to run
|
||||
named FILENAME.
|
||||
|
||||
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
|
||||
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."));
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue