Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / python / py-symtab.c
index 9fdb42f393cf62cd77c8674fd1e862b8b52ebd03..6229bc5123b963912d5d02a9377dbe815983fecf 100644 (file)
@@ -1,6 +1,6 @@
 /* Python interface to symbol tables.
 
-   Copyright (C) 2008-2017 Free Software Foundation, Inc.
+   Copyright (C) 2008-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -57,7 +57,7 @@ static const struct objfile_data *stpy_objfile_data_key;
 typedef struct salpy_sal_object {
   PyObject_HEAD
   /* The GDB Symbol table structure.  */
-  symtab_object *symtab;
+  PyObject *symtab;
   /* The GDB Symbol table and line structure.  */
   struct symtab_and_line *sal;
   /* A Symtab and line object is associated with an objfile, so keep
@@ -108,7 +108,7 @@ stpy_get_filename (PyObject *self, void *closure)
   STPY_REQUIRE_VALID (self, symtab);
   filename = symtab_to_filename_for_display (symtab);
 
-  str_obj = host_string_to_python_string (filename);
+  str_obj = host_string_to_python_string (filename).release ();
   return str_obj;
 }
 
@@ -116,13 +116,10 @@ static PyObject *
 stpy_get_objfile (PyObject *self, void *closure)
 {
   struct symtab *symtab = NULL;
-  PyObject *result;
 
   STPY_REQUIRE_VALID (self, symtab);
 
-  result = objfile_to_objfile_object (SYMTAB_OBJFILE (symtab));
-  Py_XINCREF (result);
-  return result;
+  return objfile_to_objfile_object (SYMTAB_OBJFILE (symtab)).release ();
 }
 
 /* Getter function for symtab.producer.  */
@@ -139,7 +136,7 @@ stpy_get_producer (PyObject *self, void *closure)
     {
       const char *producer = COMPUNIT_PRODUCER (cust);
 
-      return host_string_to_python_string (producer);
+      return host_string_to_python_string (producer).release ();
     }
 
   Py_RETURN_NONE;
@@ -155,7 +152,7 @@ stpy_fullname (PyObject *self, PyObject *args)
 
   fullname = symtab_to_fullname (symtab);
 
-  return host_string_to_python_string (fullname);
+  return host_string_to_python_string (fullname).release ();
 }
 
 /* Implementation of gdb.Symtab.is_valid (self) -> Boolean.
@@ -179,7 +176,7 @@ static PyObject *
 stpy_global_block (PyObject *self, PyObject *args)
 {
   struct symtab *symtab = NULL;
-  struct block *block = NULL;
+  const struct block *block = NULL;
   const struct blockvector *blockvector;
 
   STPY_REQUIRE_VALID (self, symtab);
@@ -195,7 +192,7 @@ static PyObject *
 stpy_static_block (PyObject *self, PyObject *args)
 {
   struct symtab *symtab = NULL;
-  struct block *block = NULL;
+  const struct block *block = NULL;
   const struct blockvector *blockvector;
 
   STPY_REQUIRE_VALID (self, symtab);
@@ -222,25 +219,23 @@ stpy_get_linetable (PyObject *self, PyObject *args)
 static PyObject *
 salpy_str (PyObject *self)
 {
-  char *s;
   const char *filename;
   sal_object *sal_obj;
-  PyObject *result;
   struct symtab_and_line *sal = NULL;
 
   SALPY_REQUIRE_VALID (self, sal);
 
   sal_obj = (sal_object *) self;
-  filename = (sal_obj->symtab == (symtab_object *) Py_None)
-    ? "<unknown>" : symtab_to_filename_for_display (sal_obj->symtab->symtab);
-
-  s = xstrprintf ("symbol and line for %s, line %d", filename,
-                 sal->line);
-
-  result = PyString_FromString (s);
-  xfree (s);
+  if (sal_obj->symtab == Py_None)
+    filename = "<unknown>";
+  else
+    {
+      symtab *symtab = symtab_object_to_symtab (sal_obj->symtab);
+      filename = symtab_to_filename_for_display (symtab);
+    }
 
-  return result;
+  return PyString_FromFormat ("symbol and line for %s, line %d", filename,
+                             sal->line);
 }
 
 static void
@@ -258,6 +253,7 @@ stpy_dealloc (PyObject *obj)
   if (symtab->next)
     symtab->next->prev = symtab->prev;
   symtab->symtab = NULL;
+  Py_TYPE (obj)->tp_free (obj);
 }
 
 
@@ -332,9 +328,10 @@ salpy_dealloc (PyObject *self)
 
   if (self_sal->prev)
     self_sal->prev->next = self_sal->next;
-  else if (self_sal->symtab != (symtab_object * ) Py_None)
-    set_objfile_data (SYMTAB_OBJFILE (self_sal->symtab->symtab),
-                     salpy_objfile_data_key, self_sal->next);
+  else if (self_sal->symtab != Py_None)
+    set_objfile_data
+      (SYMTAB_OBJFILE (symtab_object_to_symtab (self_sal->symtab)),
+       salpy_objfile_data_key, self_sal->next);
 
   if (self_sal->next)
     self_sal->next->prev = self_sal->prev;
@@ -352,11 +349,11 @@ salpy_dealloc (PyObject *self)
 static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION
 set_sal (sal_object *sal_obj, struct symtab_and_line sal)
 {
-  symtab_object *symtab_obj;
+  PyObject *symtab_obj;
 
   if (sal.symtab)
     {
-      symtab_obj = (symtab_object *) symtab_to_symtab_object  (sal.symtab);
+      symtab_obj = symtab_to_symtab_object  (sal.symtab);
       /* If a symtab existed in the sal, but it cannot be duplicated,
         we exit.  */
       if (symtab_obj == NULL)
@@ -364,7 +361,7 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal)
     }
   else
     {
-      symtab_obj = (symtab_object *) Py_None;
+      symtab_obj = Py_None;
       Py_INCREF (Py_None);
     }
 
@@ -376,16 +373,17 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal)
 
   /* If the SAL does not have a symtab, we do not add it to the
      objfile cleanup observer linked list.  */
-  if (sal_obj->symtab != (symtab_object *)Py_None)
+  if (sal_obj->symtab != Py_None)
     {
+      symtab *symtab = symtab_object_to_symtab (sal_obj->symtab);
+
       sal_obj->next
-       = ((struct salpy_sal_object *)
-          objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab),
-                        salpy_objfile_data_key));
+       = ((struct salpy_sal_object *) objfile_data (SYMTAB_OBJFILE (symtab),
+                                                    salpy_objfile_data_key));
       if (sal_obj->next)
        sal_obj->next->prev = sal_obj;
 
-      set_objfile_data (SYMTAB_OBJFILE (sal_obj->symtab->symtab),
+      set_objfile_data (SYMTAB_OBJFILE (symtab),
                        salpy_objfile_data_key, sal_obj);
     }
   else
@@ -436,19 +434,14 @@ symtab_to_symtab_object (struct symtab *symtab)
 PyObject *
 symtab_and_line_to_sal_object (struct symtab_and_line sal)
 {
-  sal_object *sal_obj;
-
-  sal_obj = PyObject_New (sal_object, &sal_object_type);
-  if (sal_obj)
+  gdbpy_ref<sal_object> sal_obj (PyObject_New (sal_object, &sal_object_type));
+  if (sal_obj != NULL)
     {
-      if (set_sal (sal_obj, sal) < 0)
-       {
-         Py_DECREF (sal_obj);
-         return NULL;
-       }
+      if (set_sal (sal_obj.get (), sal) < 0)
+       return NULL;
     }
 
-  return (PyObject *) sal_obj;
+  return (PyObject *) sal_obj.release ();
 }
 
 /* Return struct symtab_and_line reference that is wrapped by this
@@ -505,8 +498,8 @@ del_objfile_sal (struct objfile *objfile, void *datum)
     {
       sal_object *next = obj->next;
 
-      Py_DECREF (obj->symtab);
-      obj->symtab = (symtab_object *) Py_None;
+      gdbpy_ref<> tmp (obj->symtab);
+      obj->symtab = Py_None;
       Py_INCREF (Py_None);
 
       obj->next = NULL;
@@ -548,7 +541,7 @@ gdbpy_initialize_symtabs (void)
 
 \f
 
-static PyGetSetDef symtab_object_getset[] = {
+static gdb_PyGetSetDef symtab_object_getset[] = {
   { "filename", stpy_get_filename, NULL,
     "The symbol table's source filename.", NULL },
   { "objfile", stpy_get_objfile, NULL, "The symtab's objfile.",
@@ -610,7 +603,7 @@ PyTypeObject symtab_object_type = {
   symtab_object_getset           /*tp_getset */
 };
 
-static PyGetSetDef sal_object_getset[] = {
+static gdb_PyGetSetDef sal_object_getset[] = {
   { "symtab", salpy_get_symtab, NULL, "Symtab object.", NULL },
   { "pc", salpy_get_pc, NULL, "Return the symtab_and_line's pc.", NULL },
   { "last", salpy_get_last, NULL,
This page took 0.027649 seconds and 4 git commands to generate.