aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2024-01-04 10:07:48 +0000
committerAndrew Burgess <aburgess@redhat.com>2024-01-12 11:21:25 +0000
commitaef117b7374053099099600ded2f4eaa2c450327 (patch)
treec376f0ba3cff2ee35ce0e97a7fd32c898eab4ca4 /gdb
parent3b9ff5d9009d587aa76ec7bbaab4439e26a52c50 (diff)
downloadfsf-binutils-gdb-aef117b7374053099099600ded2f4eaa2c450327.zip
fsf-binutils-gdb-aef117b7374053099099600ded2f4eaa2c450327.tar.gz
fsf-binutils-gdb-aef117b7374053099099600ded2f4eaa2c450327.tar.bz2
gdb/python: hoist common invalid object repr code into py-utils.c
Many object types now have a __repr__() function implementation. A common pattern is that, if an object is invalid, we print its representation as: <TYPENAME (invalid)>. I thought it might be a good idea to move the formatting of this specific representation into a utility function, and then update all of our existing code to call the new function. The only place where I haven't made use of the new function is in unwind_infopy_repr, where we currently return a different string. This case is a little different as the UnwindInfo is invalid because it references a frame, and it is the frame itself which is invalid. That said, I think it would be fine to switch to using the standard format; if the UnwindInfo references an invalid frame, then the UnwindInfo is itself invalid. But changing this would be an actual change in behaviour, while all the other changes in this commit are just refactoring. Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r--gdb/python/py-arch.c2
-rw-r--r--gdb/python/py-block.c2
-rw-r--r--gdb/python/py-breakpoint.c4
-rw-r--r--gdb/python/py-connection.c2
-rw-r--r--gdb/python/py-inferior.c2
-rw-r--r--gdb/python/py-objfile.c2
-rw-r--r--gdb/python/py-symbol.c2
-rw-r--r--gdb/python/py-type.c3
-rw-r--r--gdb/python/py-unwind.c2
-rw-r--r--gdb/python/py-utils.c8
-rw-r--r--gdb/python/python-internal.h9
11 files changed, 27 insertions, 11 deletions
diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c
index ac51933..b7d861d 100644
--- a/gdb/python/py-arch.c
+++ b/gdb/python/py-arch.c
@@ -326,7 +326,7 @@ archpy_repr (PyObject *self)
{
const auto gdbarch = arch_object_to_gdbarch (self);
if (gdbarch == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+ return gdb_py_invalid_object_repr (self);
auto arch_info = gdbarch_bfd_arch_info (gdbarch);
return PyUnicode_FromFormat ("<%s arch_name=%s printable_name=%s>",
diff --git a/gdb/python/py-block.c b/gdb/python/py-block.c
index dd6d6d2..34be466 100644
--- a/gdb/python/py-block.c
+++ b/gdb/python/py-block.c
@@ -425,7 +425,7 @@ blpy_repr (PyObject *self)
{
const auto block = block_object_to_block (self);
if (block == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+ return gdb_py_invalid_object_repr (self);
const auto name = block->function () ?
block->function ()->print_name () : "<anonymous>";
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index 5155d41..9b5e023 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -1750,8 +1750,8 @@ bplocpy_repr (PyObject *py_self)
{
const auto self = (gdbpy_breakpoint_location_object *) py_self;
if (self->owner == nullptr || self->owner->bp == nullptr
- || self->owner->bp != self->bp_loc->owner)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+ || self->owner->bp != self->bp_loc->owner)
+ return gdb_py_invalid_object_repr (py_self);
const auto enabled = self->bp_loc->enabled ? "enabled" : "disabled";
diff --git a/gdb/python/py-connection.c b/gdb/python/py-connection.c
index 3df12b4..d288a74 100644
--- a/gdb/python/py-connection.c
+++ b/gdb/python/py-connection.c
@@ -204,7 +204,7 @@ connpy_repr (PyObject *obj)
process_stratum_target *target = self->target;
if (target == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (obj)->tp_name);
+ return gdb_py_invalid_object_repr (obj);
return PyUnicode_FromFormat ("<%s num=%d, what=\"%s\">",
Py_TYPE (obj)->tp_name,
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index ed153d6..929d8bd 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -800,7 +800,7 @@ infpy_repr (PyObject *obj)
inferior *inf = self->inferior;
if (inf == nullptr)
- return PyUnicode_FromString ("<gdb.Inferior (invalid)>");
+ return gdb_py_invalid_object_repr (obj);
return PyUnicode_FromFormat ("<gdb.Inferior num=%d, pid=%d>",
inf->num, inf->pid);
diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c
index bb5d0d9..4f5e5cd 100644
--- a/gdb/python/py-objfile.c
+++ b/gdb/python/py-objfile.c
@@ -537,7 +537,7 @@ objfpy_repr (PyObject *self_)
objfile *obj = self->objfile;
if (obj == nullptr)
- return PyUnicode_FromString ("<gdb.Objfile (invalid)>");
+ return gdb_py_invalid_object_repr (self_);
return PyUnicode_FromFormat ("<gdb.Objfile filename=%s>",
objfile_name (obj));
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
index 99724cf..014442b 100644
--- a/gdb/python/py-symbol.c
+++ b/gdb/python/py-symbol.c
@@ -385,7 +385,7 @@ sympy_repr (PyObject *self)
{
const auto symbol = symbol_object_to_symbol (self);
if (symbol == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+ return gdb_py_invalid_object_repr (self);
return PyUnicode_FromFormat ("<%s print_name=%s>", Py_TYPE (self)->tp_name,
symbol->print_name ());
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index bfaa6d2..27c7b78 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -1083,8 +1083,7 @@ typy_repr (PyObject *self)
{
const auto type = type_object_to_type (self);
if (type == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>",
- Py_TYPE (self)->tp_name);
+ return gdb_py_invalid_object_repr (self);
const char *code = pyty_codes[type->code ()].name;
string_file type_name;
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index f12485c..70c3372 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -425,7 +425,7 @@ pending_framepy_repr (PyObject *self)
frame_info_ptr frame = pending_frame->frame_info;
if (frame == nullptr)
- return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+ return gdb_py_invalid_object_repr (self);
const char *sp_str = nullptr;
const char *pc_str = nullptr;
diff --git a/gdb/python/py-utils.c b/gdb/python/py-utils.c
index f1ca9ea..c292910 100644
--- a/gdb/python/py-utils.c
+++ b/gdb/python/py-utils.c
@@ -597,3 +597,11 @@ gdbpy_fix_doc_string_indentation (gdb::unique_xmalloc_ptr<char> doc)
return doc;
}
+
+/* See python-internal.h. */
+
+PyObject *
+gdb_py_invalid_object_repr (PyObject *self)
+{
+ return PyUnicode_FromFormat ("<%s (invalid)>", Py_TYPE (self)->tp_name);
+}
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 14e1557..8ff9af6 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -897,6 +897,15 @@ int gdb_pymodule_addobject (PyObject *module, const char *name,
PyObject *object)
CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION;
+
+/* Return a Python string (str) object that represents SELF. SELF can be
+ any object type, but should be in an "invalid" state. What "invalid"
+ means is up to the caller. The returned string will take the form
+ "<TYPENAME (invalid)>", without the quotes, and with TYPENAME replaced
+ with the type of SELF. */
+
+PyObject *gdb_py_invalid_object_repr (PyObject *self);
+
struct varobj_iter;
struct varobj;
std::unique_ptr<varobj_iter> py_varobj_get_iterator