From d1cab9876d72d867b2de82688f5f5a2a4b655edb Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 15 Sep 2020 11:08:56 -0600 Subject: [PATCH] Don't use gdb_py_long_from_ulongest Remove the gdb_py_long_from_ulongest defines and change the Python layer to prefer gdb_py_object_from_ulongest. While writing this I noticed that the error handling in archpy_disassemble was incorrect -- it could call PyDict_SetItemString with a NULL value. This patch also fixes this bug. gdb/ChangeLog 2020-09-15 Tom Tromey * python/python-internal.h (gdb_py_long_from_ulongest): Remove defines. * python/py-value.c (valpy_long): Use gdb_py_object_from_ulongest. * python/py-symtab.c (salpy_get_pc): Use gdb_py_object_from_ulongest. (salpy_get_last): Likewise. * python/py-record-btrace.c (recpy_bt_insn_pc): Use gdb_py_object_from_ulongest. * python/py-lazy-string.c (stpy_get_address): Use gdb_py_object_from_ulongest. * python/py-frame.c (frapy_pc): Use gdb_py_object_from_ulongest. * python/py-arch.c (archpy_disassemble): Use gdb_py_object_from_ulongest and gdb_py_object_from_longest. Fix error handling. --- gdb/ChangeLog | 18 ++++++++++++++++++ gdb/python/py-arch.c | 25 +++++++++++++++++-------- gdb/python/py-frame.c | 2 +- gdb/python/py-lazy-string.c | 2 +- gdb/python/py-record-btrace.c | 2 +- gdb/python/py-symtab.c | 4 ++-- gdb/python/py-value.c | 2 +- gdb/python/python-internal.h | 2 -- 8 files changed, 41 insertions(+), 16 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6df6633b00..504a916314 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,21 @@ +2020-09-15 Tom Tromey + + * python/python-internal.h (gdb_py_long_from_ulongest): Remove + defines. + * python/py-value.c (valpy_long): Use + gdb_py_object_from_ulongest. + * python/py-symtab.c (salpy_get_pc): Use + gdb_py_object_from_ulongest. + (salpy_get_last): Likewise. + * python/py-record-btrace.c (recpy_bt_insn_pc): Use + gdb_py_object_from_ulongest. + * python/py-lazy-string.c (stpy_get_address): Use + gdb_py_object_from_ulongest. + * python/py-frame.c (frapy_pc): Use gdb_py_object_from_ulongest. + * python/py-arch.c (archpy_disassemble): Use + gdb_py_object_from_ulongest and gdb_py_object_from_longest. Fix + error handling. + 2020-09-15 Tom Tromey * python/python-internal.h (gdb_py_long_from_longest): Remove diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index d9eaf81a30..3f8e769ff5 100644 --- a/gdb/python/py-arch.c +++ b/gdb/python/py-arch.c @@ -209,14 +209,23 @@ archpy_disassemble (PyObject *self, PyObject *args, PyObject *kw) return NULL; } - if (PyDict_SetItemString (insn_dict.get (), "addr", - gdb_py_long_from_ulongest (pc)) - || PyDict_SetItemString (insn_dict.get (), "asm", - PyString_FromString (!stb.empty () - ? stb.c_str () - : "")) - || PyDict_SetItemString (insn_dict.get (), "length", - PyInt_FromLong (insn_len))) + gdbpy_ref<> pc_obj = gdb_py_object_from_ulongest (pc); + if (pc_obj == nullptr) + return nullptr; + + gdbpy_ref<> asm_obj (PyString_FromString (!stb.empty () + ? stb.c_str () + : "")); + if (asm_obj == nullptr) + return nullptr; + + gdbpy_ref<> len_obj = gdb_py_object_from_longest (insn_len); + if (len_obj == nullptr) + return nullptr; + + if (PyDict_SetItemString (insn_dict.get (), "addr", pc_obj.get ()) + || PyDict_SetItemString (insn_dict.get (), "asm", asm_obj.get ()) + || PyDict_SetItemString (insn_dict.get (), "length", len_obj.get ())) return NULL; pc += insn_len; diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index e121afb222..090705507e 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -232,7 +232,7 @@ frapy_pc (PyObject *self, PyObject *args) GDB_PY_HANDLE_EXCEPTION (except); } - return gdb_py_long_from_ulongest (pc); + return gdb_py_object_from_ulongest (pc).release (); } /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value. diff --git a/gdb/python/py-lazy-string.c b/gdb/python/py-lazy-string.c index f71bb1d613..401c0a6fdf 100644 --- a/gdb/python/py-lazy-string.c +++ b/gdb/python/py-lazy-string.c @@ -61,7 +61,7 @@ stpy_get_address (PyObject *self, void *closure) { lazy_string_object *self_string = (lazy_string_object *) self; - return gdb_py_long_from_ulongest (self_string->address); + return gdb_py_object_from_ulongest (self_string->address).release (); } static PyObject * diff --git a/gdb/python/py-record-btrace.c b/gdb/python/py-record-btrace.c index 84a3d9eae7..762c0bcbcc 100644 --- a/gdb/python/py-record-btrace.c +++ b/gdb/python/py-record-btrace.c @@ -232,7 +232,7 @@ recpy_bt_insn_pc (PyObject *self, void *closure) if (insn == NULL) return NULL; - return gdb_py_long_from_ulongest (insn->pc); + return gdb_py_object_from_ulongest (insn->pc).release (); } /* Implementation of RecordInstruction.size [int] for btrace. diff --git a/gdb/python/py-symtab.c b/gdb/python/py-symtab.c index 6229bc5123..b0e7618af7 100644 --- a/gdb/python/py-symtab.c +++ b/gdb/python/py-symtab.c @@ -264,7 +264,7 @@ salpy_get_pc (PyObject *self, void *closure) SALPY_REQUIRE_VALID (self, sal); - return gdb_py_long_from_ulongest (sal->pc); + return gdb_py_object_from_ulongest (sal->pc).release (); } /* Implementation of the get method for the 'last' attribute of @@ -278,7 +278,7 @@ salpy_get_last (PyObject *self, void *closure) SALPY_REQUIRE_VALID (self, sal); if (sal->end > 0) - return gdb_py_long_from_ulongest (sal->end - 1); + return gdb_py_object_from_ulongest (sal->end - 1).release (); else Py_RETURN_NONE; } diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 504a9de9ce..bb88bf3589 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1731,7 +1731,7 @@ valpy_long (PyObject *self) } if (type->is_unsigned ()) - return gdb_py_long_from_ulongest (l); + return gdb_py_object_from_ulongest (l).release (); else return gdb_py_object_from_longest (l).release (); } diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index b93c78fd6e..2c4195f3d0 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -126,7 +126,6 @@ #define GDB_PY_LLU_ARG "K" typedef PY_LONG_LONG gdb_py_longest; typedef unsigned PY_LONG_LONG gdb_py_ulongest; -#define gdb_py_long_from_ulongest PyLong_FromUnsignedLongLong #define gdb_py_long_as_ulongest PyLong_AsUnsignedLongLong #else /* HAVE_LONG_LONG */ @@ -135,7 +134,6 @@ typedef unsigned PY_LONG_LONG gdb_py_ulongest; #define GDB_PY_LLU_ARG "K" typedef long gdb_py_longest; typedef unsigned long gdb_py_ulongest; -#define gdb_py_long_from_ulongest PyLong_FromUnsignedLong #define gdb_py_long_as_ulongest PyLong_AsUnsignedLong #endif /* HAVE_LONG_LONG */ -- 2.34.1