From: Jan Vrany Date: Wed, 19 Mar 2025 21:12:53 +0000 (+0000) Subject: gdb/python: convert gdb.Symtab_and_line to use gdbpy_registry X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d1da7bb43ecab2425a1135f09d6f62c9a7f63ae7;p=thirdparty%2Fbinutils-gdb.git gdb/python: convert gdb.Symtab_and_line to use gdbpy_registry This commit converts gdb.Symtab_and_line to use gdbpy_registry for lifecycle management. Approved-By: Tom Tromey --- diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 80276cdf206..2381e4db9ef 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -65,30 +65,19 @@ struct sal_object { data. All access to obj->sal should be gated by SALPY_REQUIRE_VALID which will raise an exception on invalid symbol table and line objects. */ -struct salpy_deleter +struct salpy_invalidator { void operator() (sal_object *obj) { - gdbpy_enter enter_py; - - while (obj) - { - sal_object *next = obj->next; - - obj->next = nullptr; - obj->prev = nullptr; - xfree (obj->sal); - obj->sal = nullptr; - - obj = next; - } + xfree (obj->sal); + obj->sal = nullptr; } }; extern PyTypeObject sal_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("sal_object"); -static const registry::key - salpy_objfile_data_key; +static const gdbpy_registry> salpy_registry; /* Require a valid symbol table and line object. All access to sal_object->sal should be gated by this call. */ @@ -335,15 +324,9 @@ salpy_dealloc (PyObject *self) { sal_object *self_sal = (sal_object *) self; - if (self_sal->prev) - self_sal->prev->next = self_sal->next; - else if (self_sal->sal != nullptr && self_sal->sal->symtab != nullptr) - salpy_objfile_data_key.set - (self_sal->sal->symtab->compunit ()->objfile (), - self_sal->next); - - if (self_sal->next) - self_sal->next->prev = self_sal->prev; + if (self_sal->sal != nullptr && self_sal->sal->symtab != nullptr) + salpy_registry.remove (self_sal->sal->symtab->compunit ()->objfile (), + self_sal); xfree (self_sal->sal); Py_TYPE (self)->tp_free (self); @@ -360,22 +343,14 @@ set_sal (sal_object *sal_obj, struct symtab_and_line sal) sal_obj->sal = ((struct symtab_and_line *) xmemdup (&sal, sizeof (struct symtab_and_line), sizeof (struct symtab_and_line))); - sal_obj->prev = NULL; + sal_obj->prev = nullptr; + sal_obj->next = nullptr; /* If the SAL does not have a symtab, we do not add it to the objfile cleanup observer linked list. */ symtab *symtab = sal_obj->sal->symtab; if (symtab != nullptr) - { - sal_obj->next - = salpy_objfile_data_key.get (symtab->compunit ()->objfile ()); - if (sal_obj->next) - sal_obj->next->prev = sal_obj; - - salpy_objfile_data_key.set (symtab->compunit ()->objfile (), sal_obj); - } - else - sal_obj->next = NULL; + salpy_registry.add (symtab->compunit ()->objfile (), sal_obj); } /* Given a symtab, and a symtab_object that has previously been