From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from sonic303-20.consmr.mail.ir2.yahoo.com (sonic303-20.consmr.mail.ir2.yahoo.com [77.238.178.201]) by sourceware.org (Postfix) with ESMTPS id 2E3C93848019 for ; Fri, 4 Jun 2021 16:24:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2E3C93848019 X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1622823876; bh=FWM4mdPkoegvX/D/a6C2uczsBefUkZ/wApVHuhjqS30=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=hRPmK7z8SB5bWQmajqVcSrxdBM5p5SJDBIqb1VdXu6ayQSBnER+Jq0NYV/RgNQ/Vmr5bvrvTcCvq0fnv+EpdmtSEtJ0lVkLS9dw0WTHiyle+q6zR+XS6uLBgIwsikFvVd8KCGo2bluiwYc1B4ryyiEUMxI/GPTj0eBVZ0c8hqnQLKvP5Qvx3g+cnFI34ECKbI1MbO0kP7RLUYtFqzJhNHxcHBji4+AR4XnHpG/U18odGc/DfhzCNxXXINDuoh5qUELKUT+Uf4inyAt+WSyWWW1nBgAJXNUk/1ZaEImQ7pHMexBjUaKq71CI+VwuVeVBu4QsopWSxmMiOmobwUHVtqA== X-YMail-OSG: qvuCXxgVM1kQ_pGON.ygUqoB9euiprOKk5uYYTwFGkj0Z33uwUJu8RtFl2Pf8aI 7_Hr.NX0C1f8ZFG9wsSBDwsb0E5Lw8PYXOIx8lOnLH7JtYg.PRMCJ62MNwkyUjsm4yYTFTnaLpft _DT_PVYdblYCaIZwf0V3F_pBS_RCaI3jZa58Sp1F08Uoa4Xk.bXPK7d1ravBwGUntfOC5Ytw8e3v qneR9otqyIc08sLYBeRgna3g47O0.flWpdS4zI6bJcCaBg2sneF3lwsipTmKkKsLc1yQMYWYt1Aq hmJ...nCZbN2rwb_xPu9E2tc9340ZAc2ZYv8VAtr537eWJh4XYYjQDqUesfVj1k8_uMntBWLOXJA qZdtix_fx7PoYSgiLWhVporsbOdtzMBeMnqnbX3GKZ6u88wqyVUBtDf4B34nXbZNvYfJ4bxf.OWM FWNmwiHf1LUDnrvCCvhhcIJdLRLEqz00f1WAtitcuiDt32XHQbEJBn5B0KkR37bOXvsNcIoNM3ME FqHTrFPmDAByvdFyjXkr17nNRSLSoSNqkKVsBCqRvjIqK7jSyY3zA3zb0l_qvhHKIbSBopjs.e54 iRGBqw_CfVBTUw3WOXPItD71zie9rfy2lTp2JasWjjww5sOyY7hVLqHIaruyvCou381442FbJtLJ prIAc9Xh8ThV3B9DbutKFCquZ9n.kskhQzLGckrfkOUmT9FMoNG19E7psCgevbhQmOhKqPDSa_XA MX3ze8p.m2d20Ky4j03mL7YsxbPYorFzgJzCGWrBokTFcqHDw0fGUw.W7ZEvv_XKhnS0WPE6MQ5l 5u1oHKzdcm2k7Y.eh_MFyWaXrL79iRsbwCXYc6OEmrKghHdjtQAjM7RwcjaMR6uVBocWuxZJOEsY xhFi6vNkBlNrcaKVwIk.QG0vnF_oxmaW6u2dBCuk4YW92Kg758a71FSkvLbIX_7Bx7_X3FCAUfSg oAeNyqH35tVmg_2h9hvYeSSQQasebVVQcWrM5KpRvaqrEf8lDkfeFbkLyVo2zLlnx9Ly47t1Y_Vd ugkXI45p5lk5BGBsrpHU.QtvXO9KbIIEd.o5WWrKKWw8B4pnhzBa8b6_X7GkDI2Bhsd.wLBTKOmb f6QssYxNuKIZUG.kNpsPZEME0GD_eYaEz6xtMAcSJPA44ltPGT_rMmAda3K48SbTv02nt7xGDa89 2qJcN1BIWW7nUAB1whFihJ01ICyKDEY9XHTsw881ULKv91_SZHyHsQgOo84L0XmwwPyfAqwoZmWf MIA_dFHV5cH_oKSIKkB7pcHmUsmePmBbq39E39htVGlrVM7oujPRHc669Z2CaFK4mGTI.JcTbLjz QsVCLzUIaQnSRc7LafUfIQk0FB.kgaFK_PYSnVWRD4KHA2bfMuil3.2fOCyA9jYW1_n_ZXRjGAC2 OAK5uNEzQrCnpX_yyR4mRZupJtsqLhHF_zyc4OpI2HslbN0.3Oj11R22EXyQOx5IWXRMEieu.VNG LOhBvMZF3S9m1JBv80n2441CdAc98gQB03gr5s2XRBUuB7Wh04hQn.lNAcZ_HxItQZeuN7SCwzQG g5WW.gQNkU4WGgEFnMl3GMqGBIugsssrt3VO9bGPcRtI5tScm1fyfFdDn5sj_Ehlg0Gi695tbw9w C7Bzs8WxLuUGqF55OaGz4dkJ_NJ9ZU_8JKeXTpjIjHY6jYEIvgUeGI5tspTW9WoUZfkFAcBpBYK_ KCS.CUGBWRxgwwPNGgchX9P0Ig8vgT4_wwKi1dIPipOgUavSva27V.Q1jAaCq6_9sNKgM6Elh.Qo LRmSontH3EVBGpxvlr1WBya5KO3jV6Wka5LDGQy3Lix_seA.xV_vAgxb2Tn4iBe3HV8Ct0lRw2Qs JCM.TjF26xl7u3O79JpZFn_6aF6moLWf80foNPnbhIrGn_2ezsSUKCIMQR4k4VQs10v.4T37npaz qIAHLAPm1qyBQ8901JN7DlYntC21sjRddjMnqKk7LOcbfzUUq0A3EtL0dNp5v.ktU_8SWXgSLwfi ob7Dceh7xUuk5V_PigmYHZ2zSy0.WN3hSYLNNWj2pnrBHZq1x0w1m3Cq8TtvxNbAbGj7ExrO49j9 zM_Qtr3v28AErvwUjUL_56mrzWFPPAZypIcmyfxzDsTXg92LNT0Qgw59qmrlMusqzL0tM94vT_Oh cMPTqMftas8QERBR5gpaD.4xPy15fQ2DOClZzglS6vB36GpMVWcJOFon_4qwI6yqSK.DJ2acLNsa IC7iEYNuTl_PoGeAnoiKP1rf_bPRhdubciDsnuX_D1hVJrd05P3IaMGGmg4jL7YkhA0LpwSr1Wcx YJxPmrmRGoNXy5fm4ao6COcLp58YeZrfHYE1Lope5ZjoevTClLrEtIQiEPqA9IR4pwq4QiEZKDMb Eap3t3gScaSmRDc0_ePtBjZ5HEhgPw1D_TWovs5z4Hq5UzucP6J53Xl5GNUCmDQ22EmdLJoYlOK6 _F8xXbeugdV3v51lCuoFxu9bRXh5TbQTIOw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic303.consmr.mail.ir2.yahoo.com with HTTP; Fri, 4 Jun 2021 16:24:36 +0000 Received: by kubenode531.mail-prod1.omega.ir2.yahoo.com (VZM Hermes SMTP Server) with ESMTPA ID e5caa885f46198eb727e125960c67f2d; Fri, 04 Jun 2021 16:24:31 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCHv2 2/2] Use method children instead of to_string in pretty printers Date: Fri, 4 Jun 2021 18:24:00 +0200 Message-Id: <20210604162400.3255-2-ssbssa@yahoo.de> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210604162400.3255-1-ssbssa@yahoo.de> References: <20210604162400.3255-1-ssbssa@yahoo.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Antivirus: Avast (VPS 210604-0, 06/04/2021), Outbound message X-Antivirus-Status: Clean X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Jun 2021 16:24:47 -0000 With '-pretty on' the output is basically the same, but like this the pointer members can be expanded in the TUI variable windows. gdb/ChangeLog: 2021-06-04 Hannes Domani * gdb-gdb.py.in: Use method children in pretty printers. --- v2: - Added ChangeLog. - Reformatted with black. --- gdb/gdb-gdb.py.in | 175 ++++++++++++++++++++-------------------------- 1 file changed, 77 insertions(+), 98 deletions(-) diff --git a/gdb/gdb-gdb.py.in b/gdb/gdb-gdb.py.in index af9fcfedc2f..1432d7bbcf8 100644 --- a/gdb/gdb-gdb.py.in +++ b/gdb/gdb-gdb.py.in @@ -107,17 +107,13 @@ class StructTypePrettyPrinter: def __init__(self, val): self.val = val - def to_string(self): - fields = [] - fields.append("pointer_type = %s" % self.val["pointer_type"]) - fields.append("reference_type = %s" % self.val["reference_type"]) - fields.append("chain = %s" % self.val["reference_type"]) - fields.append( - "instance_flags = %s" % TypeFlagsPrinter(self.val["m_instance_flags"]) - ) - fields.append("length = %d" % self.val["length"]) - fields.append("main_type = %s" % self.val["main_type"]) - return "\n{" + ",\n ".join(fields) + "}" + def children(self): + for f in self.val.type.fields(): + name = f.name + val = self.val[f] + if name == "m_instance_flags": + val = str(TypeFlagsPrinter(val)) + yield name, val class StructMainTypePrettyPrinter: @@ -142,46 +138,6 @@ class StructMainTypePrettyPrinter: ] return "|".join(fields) - def owner_to_string(self): - """Return an image of component "owner".""" - if self.val["m_flag_objfile_owned"] != 0: - return "%s (objfile)" % self.val["m_owner"]["objfile"] - else: - return "%s (gdbarch)" % self.val["m_owner"]["gdbarch"] - - def struct_field_location_img(self, field_val): - """Return an image of the loc component inside the given field - gdb.Value. - """ - loc_val = field_val["loc"] - loc_kind = str(field_val["loc_kind"]) - if loc_kind == "FIELD_LOC_KIND_BITPOS": - return "bitpos = %d" % loc_val["bitpos"] - elif loc_kind == "FIELD_LOC_KIND_ENUMVAL": - return "enumval = %d" % loc_val["enumval"] - elif loc_kind == "FIELD_LOC_KIND_PHYSADDR": - return "physaddr = 0x%x" % loc_val["physaddr"] - elif loc_kind == "FIELD_LOC_KIND_PHYSNAME": - return "physname = %s" % loc_val["physname"] - elif loc_kind == "FIELD_LOC_KIND_DWARF_BLOCK": - return "dwarf_block = %s" % loc_val["dwarf_block"] - else: - return "loc = ??? (unsupported loc_kind value)" - - def struct_field_img(self, fieldno): - """Return an image of the main_type field number FIELDNO.""" - f = self.val["flds_bnds"]["fields"][fieldno] - label = "flds_bnds.fields[%d]:" % fieldno - if f["artificial"]: - label += " (artificial)" - fields = [] - fields.append("name = %s" % f["name"]) - fields.append("type = %s" % f["m_type"]) - fields.append("loc_kind = %s" % f["loc_kind"]) - fields.append("bitsize = %d" % f["bitsize"]) - fields.append(self.struct_field_location_img(f)) - return label + "\n" + " {" + ",\n ".join(fields) + "}" - def bound_img(self, bound_name): """Return an image of the given main_type's bound.""" bounds = self.val["flds_bnds"]["bounds"].dereference() @@ -197,17 +153,6 @@ class StructMainTypePrettyPrinter: info.append("upper_bound_is_count") return "{} ({})".format(str(b["m_data"]["baton"]), ",".join(info)) - def bounds_img(self): - """Return an image of the main_type bounds.""" - b = self.val["flds_bnds"]["bounds"].dereference() - low = self.bound_img("low") - high = self.bound_img("high") - - img = "flds_bnds.bounds = {%s, %s}" % (low, high) - if b["flag_bound_evaluated"]: - img += " [evaluated]" - return img - def type_specific_img(self): """Return a string image of the main_type type_specific union. Only the relevant component of that union is printed (based on @@ -216,54 +161,86 @@ class StructMainTypePrettyPrinter: type_specific_kind = str(self.val["type_specific_field"]) type_specific = self.val["type_specific"] if type_specific_kind == "TYPE_SPECIFIC_NONE": - img = "type_specific_field = %s" % type_specific_kind + return "type_specific_field", type_specific_kind elif type_specific_kind == "TYPE_SPECIFIC_CPLUS_STUFF": - img = "cplus_stuff = %s" % type_specific["cplus_stuff"] + return "cplus_stuff", type_specific["cplus_stuff"] elif type_specific_kind == "TYPE_SPECIFIC_GNAT_STUFF": - img = ( - "gnat_stuff = {descriptive_type = %s}" - % type_specific["gnat_stuff"]["descriptive_type"] + return ( + "gnat_stuff.descriptive_type", + type_specific["gnat_stuff"]["descriptive_type"], ) elif type_specific_kind == "TYPE_SPECIFIC_FLOATFORMAT": - img = "floatformat[0..1] = %s" % type_specific["floatformat"] + return "floatformat[0..1]", type_specific["floatformat"] elif type_specific_kind == "TYPE_SPECIFIC_FUNC": - img = ( - "calling_convention = %d" - % type_specific["func_stuff"]["calling_convention"] + return ( + "calling_convention", + type_specific["func_stuff"]["calling_convention"], ) # tail_call_list is not printed. elif type_specific_kind == "TYPE_SPECIFIC_SELF_TYPE": - img = "self_type = %s" % type_specific["self_type"] - elif type_specific_kind == "TYPE_SPECIFIC_FIXED_POINT": - # The scaling factor is an opaque structure, so we cannot - # decode its value from Python (not without insider knowledge). - img = ( - "scaling_factor: (call __gmpz_dump with " - " _mp_num and _mp_den fields if needed)" - ) - else: - img = ( - "type_specific = ??? (unknown type_secific_kind: %s)" - % type_specific_kind - ) - return img + return "self_type", type_specific["self_type"] + return ( + "type_specific", + "??? (unknown type_secific_kind: %s)" % type_specific_kind, + ) - def to_string(self): - """Return a pretty-printed image of our main_type.""" - fields = [] - fields.append("name = %s" % self.val["name"]) - fields.append("code = %s" % self.val["code"]) - fields.append("flags = [%s]" % self.flags_to_string()) - fields.append("owner = %s" % self.owner_to_string()) - fields.append("target_type = %s" % self.val["target_type"]) + def children(self): + yield "name", self.val["name"].format_string(symbols=False, address=False) + yield "code", self.val["code"] + yield "flags", "[%s]" % self.flags_to_string() + if self.val["m_flag_objfile_owned"] != 0: + yield "owner.objfile", self.val["m_owner"]["objfile"] + else: + yield "owner.gdbarch", self.val["m_owner"]["gdbarch"] + yield "target_type", self.val["target_type"] if self.val["nfields"] > 0: - for fieldno in range(self.val["nfields"]): - fields.append(self.struct_field_img(fieldno)) + fields = self.val["flds_bnds"]["fields"] + field_array_type = ( + fields.type.target().array(self.val["nfields"] - 1).pointer() + ) + yield "flds_bnds.fields", fields.cast(field_array_type).dereference() if self.val["code"] == gdb.TYPE_CODE_RANGE: - fields.append(self.bounds_img()) - fields.append(self.type_specific_img()) + b = self.val["flds_bnds"]["bounds"].dereference() + low = self.bound_img("low") + high = self.bound_img("high") + + img = "{%s, %s}" % (low, high) + if b["flag_bound_evaluated"]: + img += " [evaluated]" + yield "flds_bnds.bounds", img + yield self.type_specific_img() + + +class StructFieldPrettyPrinter: + """Pretty-print an objet of type field""" + + def __init__(self, val): + self.val = val + + def children(self): + if self.val["artificial"]: + yield "artificial", self.val["artificial"] + yield "name", self.val["name"].format_string(symbols=False, address=False) + yield "type", self.val["m_type"] + yield "loc_kind", self.val["loc_kind"] + yield "bitsize", self.val["bitsize"] - return "\n{" + ",\n ".join(fields) + "}" + loc_val = self.val["loc"] + loc_kind = str(self.val["loc_kind"]) + if loc_kind == "FIELD_LOC_KIND_BITPOS": + yield "bitpos", loc_val["bitpos"] + elif loc_kind == "FIELD_LOC_KIND_ENUMVAL": + yield "enumval", loc_val["enumval"] + elif loc_kind == "FIELD_LOC_KIND_PHYSADDR": + yield "physaddr", loc_val["physaddr"] + elif loc_kind == "FIELD_LOC_KIND_PHYSNAME": + yield "physname", loc_val["physname"].format_string( + symbols=False, address=False + ) + elif loc_kind == "FIELD_LOC_KIND_DWARF_BLOCK": + yield "dwarf_block", loc_val["dwarf_block"] + else: + yield "loc", "???" class CoreAddrPrettyPrinter: @@ -284,6 +261,8 @@ def type_lookup_function(val): return StructTypePrettyPrinter(val) elif val.type.tag == "main_type": return StructMainTypePrettyPrinter(val) + elif val.type.tag == "field": + return StructFieldPrettyPrinter(val) elif val.type.name == "CORE_ADDR": return CoreAddrPrettyPrinter(val) return None -- 2.31.1