| Index: gdb/python/python.c
|
| diff --git a/gdb/python/python.c b/gdb/python/python.c
|
| index 6611c82c8556a1ae88c2556f2d53a755c6395e3c..c66efe465e74c0689298d5bc84922c17b243dc72 100644
|
| --- a/gdb/python/python.c
|
| +++ b/gdb/python/python.c
|
| @@ -41,7 +41,7 @@ static const char python_excp_full[] = "full";
|
| static const char python_excp_message[] = "message";
|
|
|
| /* "set python print-stack" choices. */
|
| -static const char *python_excp_enums[] =
|
| +static const char *const python_excp_enums[] =
|
| {
|
| python_excp_none,
|
| python_excp_full,
|
| @@ -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
|
| @@ -504,7 +503,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
| appease gcc. */
|
| struct symtab_and_line sal;
|
| const char *arg = NULL;
|
| - char *copy = NULL;
|
| + char *copy_to_free = NULL, *copy = NULL;
|
| struct cleanup *cleanups;
|
| PyObject *result = NULL;
|
| PyObject *return_result = NULL;
|
| @@ -516,14 +515,14 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
|
|
| cleanups = make_cleanup (null_cleanup, NULL);
|
|
|
| + sals.sals = NULL;
|
| TRY_CATCH (except, RETURN_MASK_ALL)
|
| {
|
| if (arg)
|
| {
|
| copy = xstrdup (arg);
|
| - make_cleanup (xfree, copy);
|
| + copy_to_free = copy;
|
| sals = decode_line_1 (©, 0, 0, 0);
|
| - make_cleanup (xfree, sals.sals);
|
| }
|
| else
|
| {
|
| @@ -533,6 +532,13 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
| sals.nelts = 1;
|
| }
|
| }
|
| +
|
| + if (sals.sals != NULL && sals.sals != &sal)
|
| + {
|
| + make_cleanup (xfree, copy_to_free);
|
| + make_cleanup (xfree, sals.sals);
|
| + }
|
| +
|
| if (except.reason < 0)
|
| {
|
| do_cleanups (cleanups);
|
| @@ -550,7 +556,6 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
| for (i = 0; i < sals.nelts; ++i)
|
| {
|
| PyObject *obj;
|
| - char *str;
|
|
|
| obj = symtab_and_line_to_sal_object (sals.sals[i]);
|
| if (! obj)
|
| @@ -576,7 +581,16 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
| }
|
|
|
| if (copy && strlen (copy) > 0)
|
| - unparsed = PyString_FromString (copy);
|
| + {
|
| + unparsed = PyString_FromString (copy);
|
| + if (unparsed == NULL)
|
| + {
|
| + Py_DECREF (result);
|
| + Py_DECREF (return_result);
|
| + return_result = NULL;
|
| + goto error;
|
| + }
|
| + }
|
| else
|
| {
|
| unparsed = Py_None;
|
| @@ -586,13 +600,10 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
|
| PyTuple_SetItem (return_result, 0, unparsed);
|
| PyTuple_SetItem (return_result, 1, result);
|
|
|
| + error:
|
| do_cleanups (cleanups);
|
|
|
| return return_result;
|
| -
|
| - error:
|
| - do_cleanups (cleanups);
|
| - return NULL;
|
| }
|
|
|
| /* Parse a string and evaluate it as an expression. */
|
| @@ -619,18 +630,36 @@ gdbpy_parse_and_eval (PyObject *self, PyObject *args)
|
| return value_to_value_object (result);
|
| }
|
|
|
| +/* Implementation of gdb.find_pc_line function.
|
| + Returns the gdb.Symtab_and_line object corresponding to a PC value. */
|
| +
|
| +static PyObject *
|
| +gdbpy_find_pc_line (PyObject *self, PyObject *args)
|
| +{
|
| + struct symtab_and_line sal;
|
| + CORE_ADDR pc;
|
| + gdb_py_ulongest pc_llu;
|
| +
|
| + if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc_llu))
|
| + return NULL;
|
| +
|
| + pc = (CORE_ADDR) pc_llu;
|
| + sal = find_pc_line (pc, 0);
|
| + return symtab_and_line_to_sal_object (sal);
|
| +}
|
| +
|
| /* 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);
|
| }
|
|
|
| @@ -664,7 +693,6 @@ static void
|
| gdbpy_run_events (struct serial *scb, void *context)
|
| {
|
| struct cleanup *cleanup;
|
| - int r;
|
|
|
| cleanup = ensure_python_env (get_current_arch (), current_language);
|
|
|
| @@ -834,26 +862,31 @@ gdbpy_write (PyObject *self, PyObject *args, PyObject *kw)
|
| const char *arg;
|
| static char *keywords[] = {"text", "stream", NULL };
|
| int stream_type = 0;
|
| + volatile struct gdb_exception except;
|
|
|
| if (! PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &arg,
|
| &stream_type))
|
| return NULL;
|
|
|
| - switch (stream_type)
|
| + TRY_CATCH (except, RETURN_MASK_ALL)
|
| {
|
| - case 1:
|
| - {
|
| - fprintf_filtered (gdb_stderr, "%s", arg);
|
| - break;
|
| - }
|
| - case 2:
|
| - {
|
| - fprintf_filtered (gdb_stdlog, "%s", arg);
|
| - break;
|
| - }
|
| - default:
|
| - fprintf_filtered (gdb_stdout, "%s", arg);
|
| + switch (stream_type)
|
| + {
|
| + case 1:
|
| + {
|
| + fprintf_filtered (gdb_stderr, "%s", arg);
|
| + break;
|
| + }
|
| + case 2:
|
| + {
|
| + fprintf_filtered (gdb_stdlog, "%s", arg);
|
| + break;
|
| + }
|
| + default:
|
| + fprintf_filtered (gdb_stdout, "%s", arg);
|
| + }
|
| }
|
| + GDB_PY_HANDLE_EXCEPTION (except);
|
|
|
| Py_RETURN_NONE;
|
| }
|
| @@ -991,19 +1024,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 +1113,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."));
|
| @@ -1104,58 +1138,6 @@ gdbpy_breakpoint_has_py_cond (struct breakpoint_object *bp_obj)
|
| #endif /* HAVE_PYTHON */
|
|
|
|
|
| -/* Support for "mt set python print-stack on|off" is present in gdb 7.4
|
| - to not break Eclipse.
|
| - ref: https://bugs.eclipse.org/bugs/show_bug.cgi?id=367788. */
|
| -
|
| -/* Lists for 'maint set python' commands. */
|
| -
|
| -static struct cmd_list_element *maint_set_python_list;
|
| -static struct cmd_list_element *maint_show_python_list;
|
| -
|
| -/* Function for use by 'maint set python' prefix command. */
|
| -
|
| -static void
|
| -maint_set_python (char *args, int from_tty)
|
| -{
|
| - help_list (maint_set_python_list, "maintenance set python ",
|
| - class_deprecated, gdb_stdout);
|
| -}
|
| -
|
| -/* Function for use by 'maint show python' prefix command. */
|
| -
|
| -static void
|
| -maint_show_python (char *args, int from_tty)
|
| -{
|
| - cmd_show_list (maint_show_python_list, from_tty, "");
|
| -}
|
| -
|
| -/* True if we should print the stack when catching a Python error,
|
| - false otherwise. */
|
| -static int gdbpy_should_print_stack_deprecated = 0;
|
| -
|
| -static void
|
| -set_maint_python_print_stack (char *args, int from_tty,
|
| - struct cmd_list_element *e)
|
| -{
|
| - if (gdbpy_should_print_stack_deprecated)
|
| - gdbpy_should_print_stack = python_excp_full;
|
| - else
|
| - gdbpy_should_print_stack = python_excp_none;
|
| -}
|
| -
|
| -static void
|
| -show_maint_python_print_stack (struct ui_file *file, int from_tty,
|
| - struct cmd_list_element *c, const char *value)
|
| -{
|
| - fprintf_filtered (file,
|
| - _("The mode of Python stack printing on error is"
|
| - " \"%s\".\n"),
|
| - gdbpy_should_print_stack == python_excp_full
|
| - ? "on" : "off");
|
| -}
|
| -
|
| -
|
|
|
| /* Lists for 'set python' commands. */
|
|
|
| @@ -1211,34 +1193,6 @@ This command is only a placeholder.")
|
| #endif /* HAVE_PYTHON */
|
| );
|
|
|
| - add_prefix_cmd ("python", no_class, maint_show_python,
|
| - _("Prefix command for python maintenance settings."),
|
| - &maint_show_python_list, "maintenance show python ", 0,
|
| - &maintenance_show_cmdlist);
|
| - add_prefix_cmd ("python", no_class, maint_set_python,
|
| - _("Prefix command for python maintenance settings."),
|
| - &maint_set_python_list, "maintenance set python ", 0,
|
| - &maintenance_set_cmdlist);
|
| -
|
| - add_setshow_boolean_cmd ("print-stack", class_maintenance,
|
| - &gdbpy_should_print_stack_deprecated, _("\
|
| -Enable or disable printing of Python stack dump on error."), _("\
|
| -Show whether Python stack will be printed on error."), _("\
|
| -Enables or disables printing of Python stack traces."),
|
| - set_maint_python_print_stack,
|
| - show_maint_python_print_stack,
|
| - &maint_set_python_list,
|
| - &maint_show_python_list);
|
| -
|
| - /* Deprecate maint set/show python print-stack in favour of
|
| - non-maintenance alternatives. */
|
| - cmd_name = "print-stack";
|
| - cmd = lookup_cmd (&cmd_name, maint_set_python_list, "", -1, 0);
|
| - deprecate_cmd (cmd, "set python print-stack");
|
| - cmd_name = "print-stack"; /* Reset name. */
|
| - cmd = lookup_cmd (&cmd_name, maint_show_python_list, "", -1, 0);
|
| - deprecate_cmd (cmd, "show python print-stack");
|
| -
|
| /* Add set/show python print-stack. */
|
| add_prefix_cmd ("python", no_class, user_show_python,
|
| _("Prefix command for python preference settings."),
|
| @@ -1446,6 +1400,9 @@ def GdbSetPythonDirectory (dir):\n\
|
| GdbSetPythonDirectory (gdb.PYTHONDIR)\n\
|
| # Default prompt hook does nothing.\n\
|
| prompt_hook = None\n\
|
| +# Ensure that sys.argv is set to something.\n\
|
| +# We do not use PySys_SetArgvEx because it did not appear until 2.6.6.\n\
|
| +sys.argv = ['']\n\
|
| ");
|
|
|
| do_cleanups (cleanup);
|
| @@ -1522,6 +1479,9 @@ gdb.Symtab_and_line objects (or None)."},
|
| "parse_and_eval (String) -> Value.\n\
|
| Parse String as an expression, evaluate it, and return the result as a Value."
|
| },
|
| + { "find_pc_line", gdbpy_find_pc_line, METH_VARARGS,
|
| + "find_pc_line (pc) -> Symtab_and_line.\n\
|
| +Return the gdb.Symtab_and_line object corresponding to the pc value." },
|
|
|
| { "post_event", gdbpy_post_event, METH_VARARGS,
|
| "Post an event into gdb's event loop." },
|
|
|