X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpython%2Fpy-symtab.c;h=49c6a0ac544d62b9f61b3cac30fb5ccd483b3042;hb=aa36950904393728b2d5e75fb5bca7a25418c00f;hp=53b160e5d2c9a3792774af4a1114635006e0ed0a;hpb=0d1f4ceb3904c4c82231adf98f0e84f37bc8d4ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 53b160e5d2..49c6a0ac54 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -1,6 +1,6 @@ /* Python interface to symbol tables. - Copyright (C) 2008-2017 Free Software Foundation, Inc. + Copyright (C) 2008-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,6 @@ #include "python-internal.h" #include "objfiles.h" #include "block.h" -#include "py-ref.h" typedef struct stpy_symtab_object { PyObject_HEAD @@ -58,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 @@ -109,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; } @@ -117,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. */ @@ -140,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; @@ -156,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. @@ -180,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); @@ -196,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); @@ -223,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) - ? "" : 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 = ""; + 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 @@ -259,6 +253,7 @@ stpy_dealloc (PyObject *obj) if (symtab->next) symtab->next->prev = symtab->prev; symtab->symtab = NULL; + Py_TYPE (obj)->tp_free (obj); } @@ -333,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; @@ -353,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) @@ -365,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); } @@ -377,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 @@ -501,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;