diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2018-03-09 15:24:59 +0100 |
---|---|---|
committer | Philip Withnall <withnall@endlessm.com> | 2018-04-11 14:31:53 +0100 |
commit | d2c49106a459fe5887ba3e3907ed7fa5f57035d3 (patch) | |
tree | b6d4aa5141ae41bc02ebe116ffac51e9012e9cd7 /gobject | |
parent | 5741f203dcfee60a1d2b803d7f2174d328c0176a (diff) | |
download | glib-d2c49106a459fe5887ba3e3907ed7fa5f57035d3.tar.gz |
gobject_gdb.py: add pretty printer for GType and GTypeClass*
This is useful for printing GValues and the content of GObjects (not the
pointer).
https://bugzilla.gnome.org/show_bug.cgi?id=794895
Diffstat (limited to 'gobject')
-rw-r--r-- | gobject/gobject_gdb.py | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/gobject/gobject_gdb.py b/gobject/gobject_gdb.py index c86dbd1b7..1746576fd 100644 --- a/gobject/gobject_gdb.py +++ b/gobject/gobject_gdb.py @@ -21,7 +21,7 @@ except ImportError: def read_global_var (symname): return gdb.selected_frame().read_var(symname) -def g_type_to_name (gtype): +def g_type_to_typenode (gtype): def lookup_fundamental_type (typenode): if typenode == 0: return None @@ -36,6 +36,10 @@ def g_type_to_name (gtype): typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer()) else: typenode = lookup_fundamental_type (typenode) + return typenode + +def g_type_to_name (gtype): + typenode = g_type_to_typenode(gtype) if typenode != None: return glib_gdb.g_quark_to_string (typenode["qname"]) return None @@ -88,9 +92,42 @@ class GTypePrettyPrinter: return ("0x%x [%s]")% (long(self.val), name) return ("0x%x") % (long(self.val)) +def is_g_type_class_instance (val): + type = val.type + if type.code != gdb.TYPE_CODE_PTR: + return False + return str(type.target()) == "GTypeClass" + +class GTypeHandlePrettyPrinter: + "Prints a GType instance" + + def __init__ (self, val, hint = ""): + self.val = val + self.hint = hint + + def to_string (self): + typenode = g_type_to_typenode(self.val) + if typenode != None: + name = glib_gdb.g_quark_to_string (typenode["qname"]) + s = ("0x%x [%s%s")% (long(self.val), self.hint, name) + for i in range (1, int(typenode["n_supers"])): + node = g_type_to_typenode(typenode["supers"][i]) + if node: + name = glib_gdb.g_quark_to_string(node["qname"]) + else: + name = "???" + s += "/" + name + return s + "]" + else: + return ("0x%x") % (long(self.val)) + def pretty_printer_lookup (val): if is_g_type_instance (val): return GTypePrettyPrinter (val) + if str(val.type) == "GType": + return GTypeHandlePrettyPrinter (val) + if is_g_type_class_instance (val): + return GTypeHandlePrettyPrinter (val["g_type"], "g_type: ") return None |