[PATCH 3/7] Don't use gdb_py_long_from_ulongest

Tom Tromey tromey@adacore.com
Fri Sep 11 14:33:05 GMT 2020


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.

2020-09-11  Tom Tromey  <tromey@adacore.com>

	* 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/python/py-arch.c b/gdb/python/py-arch.c
index d9eaf81a30a..3f8e769ff59 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 ()
-							: "<unknown>"))
-          || 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 ()
+						: "<unknown>"));
+      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 e121afb222d..090705507e6 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 f71bb1d613d..401c0a6fdf5 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 84a3d9eae73..762c0bcbcc0 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 6229bc5123b..b0e7618af7e 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 0e3b7025fae..a884d6b70b2 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -1731,7 +1731,7 @@ valpy_long (PyObject *self)
     }
 
   if (TYPE_UNSIGNED (type))
-    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 b93c78fd6e1..2c4195f3d03 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.26.2



More information about the Gdb-patches mailing list