diff --git a/gdb/python/py-arch.c b/gdb/python/py-arch.c index ac519331f18..b7d861d27ad 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 dd6d6d278a0..34be4664144 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 () : ""; diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c index 5155d41e675..9b5e023cb09 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 3df12b435bb..d288a74cb2b 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 ed153d668ac..929d8bd17b5 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 (""); + return gdb_py_invalid_object_repr (obj); return PyUnicode_FromFormat ("", inf->num, inf->pid); diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index bb5d0d92aba..4f5e5cda5e6 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 (""); + return gdb_py_invalid_object_repr (self_); return PyUnicode_FromFormat ("", objfile_name (obj)); diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c index 99724cfc95b..014442bf147 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 bfaa6d24d94..27c7b78096b 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 f12485c22b7..70c33724cbc 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 f1ca9ea0a5d..c29291004d2 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 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 14e15574685..8ff9af650c2 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 + "", 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 py_varobj_get_iterator