Avoid questionable casts in py-symtab.c
authorTom Tromey <tom@tromey.com>
Thu, 27 Dec 2018 19:16:06 +0000 (12:16 -0700)
committerTom Tromey <tom@tromey.com>
Thu, 3 Jan 2019 21:49:19 +0000 (14:49 -0700)
py-symtab.c has some questionable casts of Py_None to symtab_object*.
This patch avoids these casts by instead using downcasts at the
appropriate places.

gdb/ChangeLog
2019-01-03  Tom Tromey  <tom@tromey.com>

* python/py-symtab.c (salpy_str): Update.
(struct salpy_sal_object) <symtab>: Now a PyObject.
(salpy_dealloc): Update.
(del_objfile_sal): Use gdbpy_ref.

gdb/ChangeLog
gdb/python/py-symtab.c

index 3e8f66b..2292eaa 100644 (file)
@@ -1,5 +1,12 @@
 2019-01-03  Tom Tromey  <tom@tromey.com>
 
+       * python/py-symtab.c (salpy_str): Update.
+       (struct salpy_sal_object) <symtab>: Now a PyObject.
+       (salpy_dealloc): Update.
+       (del_objfile_sal): Use gdbpy_ref.
+
+2019-01-03  Tom Tromey  <tom@tromey.com>
+
        * python/py-type.c (convert_field): Use new_reference.  Return
        gdbpy_ref.
        (make_fielditem): Return gdbpy_ref.
index e4a10dc..a5f376a 100644 (file)
@@ -58,7 +58,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
@@ -227,8 +227,13 @@ salpy_str (PyObject *self)
   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);
+  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 PyString_FromFormat ("symbol and line for %s, line %d", filename,
                              sal->line);
@@ -323,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;
@@ -343,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)
@@ -355,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);
     }
 
@@ -367,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
@@ -491,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;