This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 5/5] Avoid questionable casts in py-symtab.c
- From: Tom Tromey <tom at tromey dot com>
- To: gdb-patches at sourceware dot org
- Cc: Tom Tromey <tom at tromey dot com>
- Date: Thu, 27 Dec 2018 12:26:37 -0700
- Subject: [PATCH 5/5] Avoid questionable casts in py-symtab.c
- References: <20181227192637.17862-1-tom@tromey.com>
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.
2018-12-27 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 | 7 +++++++
gdb/python/py-symtab.c | 39 +++++++++++++++++++++++----------------
2 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c
index d1326e3e67..1b7aa2b02a 100644
--- a/gdb/python/py-symtab.c
+++ b/gdb/python/py-symtab.c
@@ -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;
--
2.17.2