Normalize includes to use common/
[deliverable/binutils-gdb.git] / gdb / python / python.c
index f541a98789439e4ccd47e43a1fa250bfb5be7cf0..b23aede1cdcabbf13090b697fc47b81576f8f38d 100644 (file)
@@ -1,6 +1,6 @@
 /* General python/gdb code
 
-   Copyright (C) 2008-2018 Free Software Foundation, Inc.
+   Copyright (C) 2008-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -93,12 +93,11 @@ const struct extension_language_defn extension_language_python =
 #include "python-internal.h"
 #include "linespec.h"
 #include "source.h"
-#include "version.h"
+#include "common/version.h"
 #include "target.h"
 #include "gdbthread.h"
 #include "interps.h"
 #include "event-top.h"
-#include "py-ref.h"
 #include "py-event.h"
 
 /* True if Python has been successfully initialized, false
@@ -214,7 +213,7 @@ gdbpy_enter::gdbpy_enter  (struct gdbarch *gdbarch,
   python_language = language;
 
   /* Save it and ensure ! PyErr_Occurred () afterwards.  */
-  PyErr_Fetch (&m_error_type, &m_error_value, &m_error_traceback);
+  m_error.emplace ();
 }
 
 gdbpy_enter::~gdbpy_enter ()
@@ -227,7 +226,7 @@ gdbpy_enter::~gdbpy_enter ()
       warning (_("internal error: Unhandled Python exception"));
     }
 
-  PyErr_Restore (m_error_type, m_error_value, m_error_traceback);
+  m_error->restore ();
 
   PyGILState_Release (m_state);
   python_gdbarch = m_gdbarch;
@@ -296,14 +295,8 @@ python_interactive_command (const char *arg, int from_tty)
 
   if (arg && *arg)
     {
-      int len = strlen (arg);
-      char *script = (char *) xmalloc (len + 2);
-
-      strcpy (script, arg);
-      script[len] = '\n';
-      script[len + 1] = '\0';
-      err = eval_python_command (script);
-      xfree (script);
+      std::string script = std::string (arg) + "\n";
+      err = eval_python_command (script.c_str ());
     }
   else
     {
@@ -438,7 +431,7 @@ gdbpy_parameter_value (enum var_types type, void *var)
 
        if (! str)
          str = "";
-       return host_string_to_python_string (str);
+       return host_string_to_python_string (str).release ();
       }
 
     case var_boolean:
@@ -495,29 +488,25 @@ gdbpy_parameter_value (enum var_types type, void *var)
 static PyObject *
 gdbpy_parameter (PyObject *self, PyObject *args)
 {
-  struct gdb_exception except = exception_none;
   struct cmd_list_element *alias, *prefix, *cmd;
   const char *arg;
-  char *newarg;
   int found = -1;
 
   if (! PyArg_ParseTuple (args, "s", &arg))
     return NULL;
 
-  newarg = concat ("show ", arg, (char *) NULL);
+  std::string newarg = std::string ("show ") + arg;
 
   TRY
     {
-      found = lookup_cmd_composition (newarg, &alias, &prefix, &cmd);
+      found = lookup_cmd_composition (newarg.c_str (), &alias, &prefix, &cmd);
     }
   CATCH (ex, RETURN_MASK_ALL)
     {
-      except = ex;
+      GDB_PY_HANDLE_EXCEPTION (ex);
     }
   END_CATCH
 
-  xfree (newarg);
-  GDB_PY_HANDLE_EXCEPTION (except);
   if (!found)
     return PyErr_Format (PyExc_RuntimeError,
                         _("Could not find parameter `%s'."), arg);
@@ -583,6 +572,8 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
 
   std::string to_string_res;
 
+  scoped_restore preventer = prevent_dont_repeat ();
+
   TRY
     {
       struct interp *interp;
@@ -612,7 +603,6 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw)
        interp = interp_lookup (current_ui, "console");
        current_uiout = interp->interp_ui_out ();
 
-       scoped_restore preventer = prevent_dont_repeat ();
        if (to_string)
          to_string_res = execute_control_commands_to_string (lines.get (),
                                                              from_tty);
@@ -743,11 +733,11 @@ gdbpy_rbreak (PyObject *self, PyObject *args, PyObject *kw)
     {
       const char **files = symtab_paths.vec.data ();
 
-      symbols = search_symbols (regex, FUNCTIONS_DOMAIN,
+      symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL,
                                symtab_paths.vec.size (), files);
     }
   else
-    symbols = search_symbols (regex, FUNCTIONS_DOMAIN, 0, NULL);
+    symbols = search_symbols (regex, FUNCTIONS_DOMAIN, NULL, 0, NULL);
 
   /* Count the number of symbols (both symbols and optionally minimal
      symbols) so we can correctly check the throttle limit.  */
@@ -987,10 +977,9 @@ gdbpy_run_events (int error, gdb_client_data client_data)
       if (gdbpy_event_list == NULL)
        gdbpy_event_list_end = &gdbpy_event_list;
 
-      /* Ignore errors.  */
       gdbpy_ref<> call_result (PyObject_CallObject (item->event, NULL));
       if (call_result == NULL)
-       PyErr_Clear ();
+       gdbpy_print_stack ();
 
       Py_DECREF (item->event);
       xfree (item);
@@ -1244,24 +1233,25 @@ gdbpy_print_stack (void)
   /* Print "message", just error print message.  */
   else
     {
-      PyObject *ptype, *pvalue, *ptraceback;
-
-      PyErr_Fetch (&ptype, &pvalue, &ptraceback);
+      gdbpy_err_fetch fetched_error;
 
-      /* Fetch the error message contained within ptype, pvalue.  */
-      gdb::unique_xmalloc_ptr<char>
-       msg (gdbpy_exception_to_string (ptype, pvalue));
-      gdb::unique_xmalloc_ptr<char> type (gdbpy_obj_to_string (ptype));
+      gdb::unique_xmalloc_ptr<char> msg = fetched_error.to_string ();
+      gdb::unique_xmalloc_ptr<char> type;
+      /* Don't compute TYPE if MSG already indicates that there is an
+        error.  */
+      if (msg != NULL)
+       type = fetched_error.type_to_string ();
 
       TRY
        {
-         if (msg == NULL)
+         if (msg == NULL || type == NULL)
            {
              /* An error occurred computing the string representation of the
                 error message.  */
              fprintf_filtered (gdb_stderr,
                                _("Error occurred computing Python error" \
                                  "message.\n"));
+             PyErr_Clear ();
            }
          else
            fprintf_filtered (gdb_stderr, "Python Exception %s %s: \n",
@@ -1271,11 +1261,21 @@ gdbpy_print_stack (void)
        {
        }
       END_CATCH
+    }
+}
+
+/* Like gdbpy_print_stack, but if the exception is a
+   KeyboardException, throw a gdb "quit" instead.  */
 
-      Py_XDECREF (ptype);
-      Py_XDECREF (pvalue);
-      Py_XDECREF (ptraceback);
+void
+gdbpy_print_stack_or_quit ()
+{
+  if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
+    {
+      PyErr_Clear ();
+      throw_quit ("Quit");
     }
+  gdbpy_print_stack ();
 }
 
 \f
@@ -1293,9 +1293,9 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2)
 
   ALL_PSPACES (ps)
   {
-    PyObject *item = pspace_to_pspace_object (ps);
+    gdbpy_ref<> item = pspace_to_pspace_object (ps);
 
-    if (!item || PyList_Append (list.get (), item) == -1)
+    if (item == NULL || PyList_Append (list.get (), item.get ()) == -1)
       return NULL;
   }
 
@@ -1359,15 +1359,10 @@ gdbpy_execute_objfile_script (const struct extension_language_defn *extlang,
 static PyObject *
 gdbpy_get_current_objfile (PyObject *unused1, PyObject *unused2)
 {
-  PyObject *result;
-
   if (! gdbpy_current_objfile)
     Py_RETURN_NONE;
 
-  result = objfile_to_objfile_object (gdbpy_current_objfile);
-  if (result)
-    Py_INCREF (result);
-  return result;
+  return objfile_to_objfile_object (gdbpy_current_objfile).release ();
 }
 
 /* Compute the list of active python type printers and store them in
@@ -1750,6 +1745,9 @@ do_start_initialization ()
 
 #endif /* HAVE_PYTHON */
 
+/* See python.h.  */
+cmd_list_element *python_cmd_element = nullptr;
+
 void
 _initialize_python (void)
 {
@@ -1779,7 +1777,7 @@ This command is only a placeholder.")
           );
   add_com_alias ("pi", "python-interactive", class_obscure, 1);
 
-  add_com ("python", class_obscure, python_command,
+  python_cmd_element = add_com ("python", class_obscure, python_command,
 #ifdef HAVE_PYTHON
           _("\
 Evaluate a Python command.\n\
This page took 0.028138 seconds and 4 git commands to generate.