[1/6] gdb/python: hoist common invalid object repr code into py-utils.c
Checks
Context |
Check |
Description |
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_build--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-arm |
success
|
Testing passed
|
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 |
success
|
Testing passed
|
Commit Message
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.
---
gdb/python/py-arch.c | 2 +-
gdb/python/py-block.c | 2 +-
gdb/python/py-breakpoint.c | 4 ++--
gdb/python/py-connection.c | 2 +-
gdb/python/py-inferior.c | 2 +-
gdb/python/py-objfile.c | 2 +-
gdb/python/py-symbol.c | 2 +-
gdb/python/py-type.c | 3 +--
gdb/python/py-unwind.c | 2 +-
gdb/python/py-utils.c | 8 ++++++++
gdb/python/python-internal.h | 9 +++++++++
11 files changed, 27 insertions(+), 11 deletions(-)
Comments
>>>>> "Andrew" == Andrew Burgess <aburgess@redhat.com> writes:
Andrew> The only place where I haven't made use of the new function is in
Andrew> unwind_infopy_repr, where we currently return a different string.
Andrew> This case is a little different as the UnwindInfo is invalid because
Andrew> it references a frame, and it is the frame itself which is invalid.
Andrew> That said, I think it would be fine to switch to using the standard
Andrew> format; if the UnwindInfo references an invalid frame, then the
Andrew> UnwindInfo is itself invalid. But changing this would be an actual
Andrew> change in behaviour, while all the other changes in this commit are
Andrew> just refactoring.
I think this patch is fine as-is, but FWIW I don't think we need to
worry about code that relies on the precise content of the repr of an
invalid object. IOW, I think it's fine to change unwind_infopy_repr as
well.
Tom
@@ -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>",
@@ -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>";
@@ -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";
@@ -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,
@@ -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);
@@ -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));
@@ -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 ());
@@ -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;
@@ -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;
@@ -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);
+}
@@ -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