From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 2B3D63858030 for ; Tue, 25 Jan 2022 10:50:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2B3D63858030 Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-373-fa5DtTobOmGe_FNtvUOOOg-1; Tue, 25 Jan 2022 05:50:09 -0500 X-MC-Unique: fa5DtTobOmGe_FNtvUOOOg-1 Received: by mail-wm1-f70.google.com with SMTP id l20-20020a05600c1d1400b0034c29cad547so1055738wms.2 for ; Tue, 25 Jan 2022 02:50:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=0oqutg6JlnHZ5e0N5C+xvq7Vxb60RaGXudghaHpqDrA=; b=yEU2mASIQ/22rtOGAIp0Ew/KONjbYtdbdEFcL08tVFAPDqq3p5sXxKuvVMBvulwrrP dtrC3jrYUfMpqJYIF0ApAmlzZA2TQX7CWGohIqkQKWeTm357CCgQF3N+OkUA2ZQvnhbh xdZE7298O93qKic9RHz9E/FpE7ZjN1DMpwuQj7hFp9swTHoZzBspBTc3ndi6OrY2QDXs UppIpld/mjNV8hPOkDKx2lXkzzIb1tZWwQUPH9ts+8a24uAmdLgAybRdTqDIEGSnlVTQ Ze52ppdSqrCKM8rHMdBF81fzBmulD1eqzxxAZf3UJdBt8KD8jESsE3fJtY9fEhIOK38h f1xg== X-Gm-Message-State: AOAM533XsYfvcVQMMYC4tWjFRmXYgGq+TD0RkvtJxLaDuDw1Ba8DRFVL C6o/alqi+SDkxhxYWFR4hAWNna3JedQYuOeipG1yRAWuE+t4v9ketpRvqqp4iF4NjrrnYh/ocUf 2GA6OaSLSmLwuL4xobIyi/TRr31BxA9JijaUUt9VHHH4IwibZuDhwmf0mq/IXOM2FnK04XwH03w == X-Received: by 2002:a5d:47c2:: with SMTP id o2mr3443847wrc.81.1643107807887; Tue, 25 Jan 2022 02:50:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJzCX+FgEDVNT/xgeJ8C5qR2Y98p6JUt8/L5xboEj56WYCOPQLlU1wWd61fHsrlmc1nqKaP+aA== X-Received: by 2002:a5d:47c2:: with SMTP id o2mr3443832wrc.81.1643107807644; Tue, 25 Jan 2022 02:50:07 -0800 (PST) Received: from localhost (host86-188-49-82.range86-188.btcentralplus.com. [86.188.49.82]) by smtp.gmail.com with ESMTPSA id t5sm16995132wrw.92.2022.01.25.02.50.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jan 2022 02:50:07 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCH] gdb/python: allow Value.format_string to return styled output Date: Tue, 25 Jan 2022 10:50:05 +0000 Message-Id: <20220125105005.333575-1-aburgess@redhat.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Tue, 25 Jan 2022 10:50:14 -0000 Add a new argument to the gdb.Value.format_string method, 'styling'. This argument is False by default. When this argument is True, then the returned string can contain output styling escape sequences. When this argument is False, then the returned string will not contain any styling escape sequences. If the returned string is going to be printed to the user, then it is often nice to retain the GDB styling. For the testing, we need to adjust the TERM environment variable, as we do for all the styling tests. I'm now running all of the C tests in gdb.python/py-format-string.exp in an environment where styling could be generated, but only my new test should actually produce styled output, hopefully this will catch the case where a bug might cause format_string to always produce styled output. --- gdb/NEWS | 7 +++++++ gdb/doc/python.texi | 10 ++++++++++ gdb/python/py-value.c | 8 ++++++-- gdb/testsuite/gdb.python/py-format-string.exp | 20 ++++++++++++++++--- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 8c13cefb22f..5b71d6a1c08 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -146,6 +146,13 @@ show debug lin-lwp ** New function gdb.host_charset(), returns a string, which is the name of the current host charset. + ** The gdb.Value.format_string method now takes a 'styling' + argument, which is a boolean. When true, the returned string can + include escape sequences to apply styling. The styling will only + be present if styling is otherwise turned on in GDB (see 'help + set styling'). When false, which is the default if the argument + is not given, then no styling is applied to the returned string. + * New features in the GDB remote stub, GDBserver ** GDBserver is now supported on OpenRISC GNU/Linux. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index f02380a27f4..0b3235018bb 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -1048,6 +1048,16 @@ the returned string. For instance, @code{'x'} is equivalent to using the @value{GDBN} command @code{print} with the @code{/x} option and formats the value as a hexadecimal number. + +@item styling +@code{True} if @value{GDBN} should apply styling to the returned +string. When styling is applied, the returned string might contain +ANSI terminal escape sequences. Escape sequences will only be +included if styling is turned on, @xref{Output Styling}. +Additionally, @value{GDBN} only styles some value contents, so not +every output string will contain escape sequences. + +When @code{False}, which is the default, no output styling is applied. @end table @end defun diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 70b33d5a27b..07992acecb2 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -636,6 +636,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) "symbols", /* See set print symbol on|off. */ "unions", /* See set print union on|off. */ "address", /* See set print address on|off. */ + "styling", /* Should we apply styling. */ /* C++ options. */ "deref_refs", /* No corresponding setting. */ "actual_objects", /* See set print object on|off. */ @@ -680,13 +681,14 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) PyObject *symbols_obj = NULL; PyObject *unions_obj = NULL; PyObject *address_obj = NULL; + PyObject *styling_obj = NULL; PyObject *deref_refs_obj = NULL; PyObject *actual_objects_obj = NULL; PyObject *static_members_obj = NULL; char *format = NULL; if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, - "|O!O!O!O!O!O!O!O!O!O!IIIs", + "|O!O!O!O!O!O!O!O!O!O!O!IIIs", keywords, &PyBool_Type, &raw_obj, &PyBool_Type, &pretty_arrays_obj, @@ -695,6 +697,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) &PyBool_Type, &symbols_obj, &PyBool_Type, &unions_obj, &PyBool_Type, &address_obj, + &PyBool_Type, &styling_obj, &PyBool_Type, &deref_refs_obj, &PyBool_Type, &actual_objects_obj, &PyBool_Type, &static_members_obj, @@ -725,6 +728,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) return NULL; if (!copy_py_bool_obj (&opts.static_field_print, static_members_obj)) return NULL; + bool styling_p = (styling_obj != nullptr) && PyObject_IsTrue (styling_obj); /* Numeric arguments for which 0 means unlimited (which we represent as UINT_MAX). Note that the max-depth numeric argument uses -1 as @@ -749,7 +753,7 @@ valpy_format_string (PyObject *self, PyObject *args, PyObject *kw) } } - string_file stb; + string_file stb (styling_p); try { diff --git a/gdb/testsuite/gdb.python/py-format-string.exp b/gdb/testsuite/gdb.python/py-format-string.exp index 4c78bed1203..a93bd19b60c 100644 --- a/gdb/testsuite/gdb.python/py-format-string.exp +++ b/gdb/testsuite/gdb.python/py-format-string.exp @@ -991,6 +991,13 @@ proc_with_prefix test_invalid_args {} { "ValueError: a single character is required.*" } +# Check the styling argument to format_string. This function needs to +# be called with TERM set such that styling can be applied. +proc test_styling {} { + gdb_test "python print(gdb.parse_and_eval(\"a_point_t\").format_string(styling=True, raw=True))" \ + "{[style x variable] = 42, [style y variable] = 12}" +} + # Run all the tests in common for both C and C++. proc_with_prefix test_all_common {} { # No options. @@ -1023,9 +1030,16 @@ with_test_prefix "format_string" { # Perform C Tests. if { [build_inferior "${binfile}" "c"] == 0 } { with_test_prefix "lang_c" { - set current_lang "c" - prepare_gdb "${binfile}" - test_all_common + save_vars { env(TERM) } { + # We run all of these tests in an environment where styling + # could work, but we only expect the final call to + # test_styling to actuall produce any styled output. + setenv TERM ansi + set current_lang "c" + prepare_gdb "${binfile}" + test_all_common + test_styling + } } } -- 2.25.4