Release the GIL while running a gdb command or expression
[deliverable/binutils-gdb.git] / gdb / python / py-frame.c
index cd6e859b613a88d52ec4229e991930bd0317bd53..0eef6543f848c622e313b8319a173cc97036d226 100644 (file)
@@ -1,6 +1,6 @@
 /* Python interface to stack frames
 
-   Copyright (C) 2008-2015 Free Software Foundation, Inc.
+   Copyright (C) 2008-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -80,17 +80,10 @@ frame_object_to_frame_info (PyObject *obj)
 static PyObject *
 frapy_str (PyObject *self)
 {
-  char *s;
-  PyObject *result;
-  struct ui_file *strfile;
-
-  strfile = mem_fileopen ();
-  fprint_frame_id (strfile, ((frame_object *) self)->frame_id);
-  s = ui_file_xstrdup (strfile, NULL);
-  result = PyString_FromString (s);
-  xfree (s);
+  string_file strfile;
 
-  return result;
+  fprint_frame_id (&strfile, ((frame_object *) self)->frame_id);
+  return PyString_FromString (strfile.c_str ());
 }
 
 /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
@@ -125,7 +118,7 @@ static PyObject *
 frapy_name (PyObject *self, PyObject *args)
 {
   struct frame_info *frame;
-  char *name = NULL;
+  gdb::unique_xmalloc_ptr<char> name;
   enum language lang;
   PyObject *result;
 
@@ -133,19 +126,18 @@ frapy_name (PyObject *self, PyObject *args)
     {
       FRAPY_REQUIRE_VALID (self, frame);
 
-      find_frame_funname (frame, &name, &lang, NULL);
+      name = find_frame_funname (frame, &lang, NULL);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
-      xfree (name);
       GDB_PY_HANDLE_EXCEPTION (except);
     }
   END_CATCH
 
   if (name)
     {
-      result = PyUnicode_Decode (name, strlen (name), host_charset (), NULL);
-      xfree (name);
+      result = PyUnicode_Decode (name.get (), strlen (name.get ()),
+                                host_charset (), NULL);
     }
   else
     {
@@ -340,9 +332,12 @@ frapy_function (PyObject *self, PyObject *args)
 
   TRY
     {
+      enum language funlang;
+
       FRAPY_REQUIRE_VALID (self, frame);
 
-      sym = find_pc_function (get_frame_address_in_block (frame));
+      gdb::unique_xmalloc_ptr<char> funname
+       = find_frame_funname (frame, &funlang, &sym);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
@@ -362,9 +357,8 @@ frapy_function (PyObject *self, PyObject *args)
 PyObject *
 frame_info_to_frame_object (struct frame_info *frame)
 {
-  frame_object *frame_obj;
-
-  frame_obj = PyObject_New (frame_object, &frame_object_type);
+  gdbpy_ref<frame_object> frame_obj (PyObject_New (frame_object,
+                                                  &frame_object_type));
   if (frame_obj == NULL)
     return NULL;
 
@@ -390,13 +384,12 @@ frame_info_to_frame_object (struct frame_info *frame)
     }
   CATCH (except, RETURN_MASK_ALL)
     {
-      Py_DECREF (frame_obj);
       gdbpy_convert_exception (except);
       return NULL;
     }
   END_CATCH
 
-  return (PyObject *) frame_obj;
+  return (PyObject *) frame_obj.release ();
 }
 
 /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
@@ -422,7 +415,7 @@ frapy_older (PyObject *self, PyObject *args)
   END_CATCH
 
   if (prev)
-    prev_obj = (PyObject *) frame_info_to_frame_object (prev);
+    prev_obj = frame_info_to_frame_object (prev);
   else
     {
       Py_INCREF (Py_None);
@@ -455,7 +448,7 @@ frapy_newer (PyObject *self, PyObject *args)
   END_CATCH
 
   if (next)
-    next_obj = (PyObject *) frame_info_to_frame_object (next);
+    next_obj = frame_info_to_frame_object (next);
   else
     {
       Py_INCREF (Py_None);
@@ -472,14 +465,13 @@ static PyObject *
 frapy_find_sal (PyObject *self, PyObject *args)
 {
   struct frame_info *frame;
-  struct symtab_and_line sal;
   PyObject *sal_obj = NULL;   /* Initialize to appease gcc warning.  */
 
   TRY
     {
       FRAPY_REQUIRE_VALID (self, frame);
 
-      find_frame_sal (frame, &sal);
+      symtab_and_line sal = find_frame_sal (frame);
       sal_obj = symtab_and_line_to_sal_object (sal);
     }
   CATCH (except, RETURN_MASK_ALL)
@@ -504,6 +496,7 @@ frapy_read_var (PyObject *self, PyObject *args)
   struct frame_info *frame;
   PyObject *sym_obj, *block_obj = NULL;
   struct symbol *var = NULL;   /* gcc-4.3.2 false warning.  */
+  const struct block *block = NULL;
   struct value *val = NULL;
 
   if (!PyArg_ParseTuple (args, "O|O", &sym_obj, &block_obj))
@@ -513,14 +506,11 @@ frapy_read_var (PyObject *self, PyObject *args)
     var = symbol_object_to_symbol (sym_obj);
   else if (gdbpy_is_string (sym_obj))
     {
-      char *var_name;
-      const struct block *block = NULL;
-      struct cleanup *cleanup;
+      gdb::unique_xmalloc_ptr<char>
+       var_name (python_string_to_target_string (sym_obj));
 
-      var_name = python_string_to_target_string (sym_obj);
       if (!var_name)
        return NULL;
-      cleanup = make_cleanup (xfree, var_name);
 
       if (block_obj)
        {
@@ -529,22 +519,23 @@ frapy_read_var (PyObject *self, PyObject *args)
            {
              PyErr_SetString (PyExc_RuntimeError,
                               _("Second argument must be block."));
-             do_cleanups (cleanup);
              return NULL;
            }
        }
 
       TRY
        {
+         struct block_symbol lookup_sym;
          FRAPY_REQUIRE_VALID (self, frame);
 
          if (!block)
            block = get_frame_block (frame, NULL);
-         var = lookup_symbol (var_name, block, VAR_DOMAIN, NULL);
+         lookup_sym = lookup_symbol (var_name.get (), block, VAR_DOMAIN, NULL);
+         var = lookup_sym.symbol;
+         block = lookup_sym.block;
        }
       CATCH (except, RETURN_MASK_ALL)
        {
-         do_cleanups (cleanup);
          gdbpy_convert_exception (except);
          return NULL;
        }
@@ -553,13 +544,10 @@ frapy_read_var (PyObject *self, PyObject *args)
       if (!var)
        {
          PyErr_Format (PyExc_ValueError,
-                       _("Variable '%s' not found."), var_name);
-         do_cleanups (cleanup);
+                       _("Variable '%s' not found."), var_name.get ());
 
          return NULL;
        }
-
-      do_cleanups (cleanup);
     }
   else
     {
@@ -572,7 +560,7 @@ frapy_read_var (PyObject *self, PyObject *args)
     {
       FRAPY_REQUIRE_VALID (self, frame);
 
-      val = read_var_value (var, frame);
+      val = read_var_value (var, block, frame);
     }
   CATCH (except, RETURN_MASK_ALL)
     {
@@ -666,7 +654,7 @@ gdbpy_frame_stop_reason_string (PyObject *self, PyObject *args)
       return NULL;
     }
 
-  str = unwind_stop_reason_to_string (reason);
+  str = unwind_stop_reason_to_string ((enum unwind_stop_reason) reason);
   return PyUnicode_Decode (str, strlen (str), host_charset (), NULL);
 }
 
This page took 0.026619 seconds and 4 git commands to generate.