public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Tom Tromey <tromey@adacore.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH] Add gdb.current_language function
Date: Tue, 31 May 2022 17:25:50 +0100	[thread overview]
Message-ID: <20220531162550.GB6045@redhat.com> (raw)
In-Reply-To: <87ilpl6btv.fsf@tromey.com>

* Tom Tromey via Gdb-patches <gdb-patches@sourceware.org> [2022-05-31 08:01:00 -0600]:

> Andrew> I think you should also add Frame.current_lanaguage, and the docs for
> Andrew> gdb.current_lanaguage should make it clear that the Frame method should
> Andrew> be used in preference where a Frame is available.
> 
> Here's v2 with this addition.
> 
> Tom
> 
> commit dba44c7ff83db6ac80377b5a42ce75cf5557347f
> Author: Tom Tromey <tromey@adacore.com>
> Date:   Tue May 24 10:15:17 2022 -0600
> 
>     Add gdb.current_language and gdb.Frame.language
>     
>     This adds the gdb.current_language function, which can be used to find
>     the current language without (1) ever having the value "auto" or (2)
>     having to parse the output of "show language".
>     
>     It also adds the gdb.Frame.language, which can be used to find the
>     language of a given frame.  This is normally preferable if one has a
>     Frame object handy.

Thanks, this LGTM.

Andrew


> 
> diff --git a/gdb/NEWS b/gdb/NEWS
> index dac6dabfa42..960f90b4387 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -58,6 +58,13 @@ maintenance info line-table
>       This is the same format that GDB uses when printing address, symbol,
>       and offset information from the disassembler.
>  
> +  ** New function gdb.current_language that returns the name of the
> +     current language.  Unlike gdb.parameter('language'), this will
> +     never return 'auto'.
> +
> +  ** New method gdb.Frame.language that returns the name of the
> +     frame's language.
> +
>  *** Changes in GDB 12
>  
>  * DBX mode is deprecated, and will be removed in GDB 13
> diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
> index f933c7d30c9..ba5a9b315e1 100644
> --- a/gdb/doc/python.texi
> +++ b/gdb/doc/python.texi
> @@ -668,6 +668,14 @@ Here are some examples of the possible string formats:
>  @end smallexample
>  @end defun
>  
> +@defun gdb.current_language ()
> +Return the name of the current language as a string.  Unlike
> +@code{gdb.parameter('language')}, this function will never return
> +@samp{auto}.  If a @code{gdb.Frame} object is available (@pxref{Frames
> +In Python}), the @code{language} method might be preferable in some
> +cases, as that is not affected by the user's language setting.
> +@end defun
> +
>  @node Exception Handling
>  @subsubsection Exception Handling
>  @cindex python exceptions
> @@ -5202,6 +5210,10 @@ Stack}.
>  Return an integer, the stack frame level for this frame.  @xref{Frames, ,Stack Frames}.
>  @end defun
>  
> +@defun Frame.language ()
> +Return a string, the source language for this frame.
> +@end defun
> +
>  @node Blocks In Python
>  @subsubsection Accessing blocks from Python
>  
> diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
> index 769e28c1a2c..9a28c36c1cc 100644
> --- a/gdb/python/py-frame.c
> +++ b/gdb/python/py-frame.c
> @@ -598,6 +598,29 @@ frapy_level (PyObject *self, PyObject *args)
>    Py_RETURN_NONE;
>  }
>  
> +/* The language for this frame.  */
> +
> +static PyObject *
> +frapy_language (PyObject *self, PyObject *args)
> +{
> +  try
> +    {
> +      struct frame_info *fi;
> +      FRAPY_REQUIRE_VALID (self, fi);
> +
> +      enum language lang = get_frame_language (fi);
> +      const language_defn *lang_def = language_def (lang);
> +
> +      return host_string_to_python_string (lang_def->name ()).release ();
> +    }
> +  catch (const gdb_exception &except)
> +    {
> +      GDB_PY_HANDLE_EXCEPTION (except);
> +    }
> +
> +  Py_RETURN_NONE;
> +}
> +
>  /* Implementation of gdb.newest_frame () -> gdb.Frame.
>     Returns the newest frame object.  */
>  
> @@ -771,6 +794,8 @@ Return the value of the variable in this frame." },
>      "Select this frame as the user's current frame." },
>    { "level", frapy_level, METH_NOARGS,
>      "The stack level of this frame." },
> +  { "language", frapy_language, METH_NOARGS,
> +    "The language of this frame." },
>    {NULL}  /* Sentinel */
>  };
>  
> diff --git a/gdb/python/python.c b/gdb/python/python.c
> index 11aaa7ae778..9bef2252e88 100644
> --- a/gdb/python/python.c
> +++ b/gdb/python/python.c
> @@ -1571,6 +1571,14 @@ gdbpy_progspaces (PyObject *unused1, PyObject *unused2)
>    return list.release ();
>  }
>  
> +/* Return the name of the current language.  */
> +
> +static PyObject *
> +gdbpy_current_language (PyObject *unused1, PyObject *unused2)
> +{
> +  return host_string_to_python_string (current_language->name ()).release ();
> +}
> +
>  \f
>  
>  /* The "current" objfile.  This is set when gdb detects that a new
> @@ -2534,6 +2542,10 @@ Format ADDRESS, an address within PROG_SPACE, a gdb.Progspace, using\n\
>  ARCH, a gdb.Architecture to determine the address size.  The format of\n\
>  the returned string is 'ADDRESS <SYMBOL+OFFSET>' without the quotes." },
>  
> +  { "current_language", gdbpy_current_language, METH_NOARGS,
> +    "current_language () -> string\n\
> +Return the name of the currently selected language." },
> +
>    {NULL, NULL, 0, NULL}
>  };
>  
> diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py-frame.exp
> index b91ffe62a83..4991e8a0c5d 100644
> --- a/gdb/testsuite/gdb.python/py-frame.exp
> +++ b/gdb/testsuite/gdb.python/py-frame.exp
> @@ -128,3 +128,9 @@ if { $pc != "" } {
>  	" = True" \
>  	"test Frame.read_register($pc)"
>  }
> +
> +# Test language.
> +gdb_test "python print(gdb.selected_frame().language())" "c"
> +gdb_test "set language ada"
> +gdb_test "python print(gdb.selected_frame().language())" "c" \
> +    "frame language is not affected by global language"
> diff --git a/gdb/testsuite/gdb.python/py-parameter.exp b/gdb/testsuite/gdb.python/py-parameter.exp
> index 199d3bc16ec..db158ddec26 100644
> --- a/gdb/testsuite/gdb.python/py-parameter.exp
> +++ b/gdb/testsuite/gdb.python/py-parameter.exp
> @@ -370,6 +370,19 @@ proc_with_prefix test_throwing_parameter { } {
>  	"gdb.GdbError does not show Python stack"
>  }
>  
> +proc_with_prefix test_language {} {
> +    gdb_test "python print(gdb.parameter('language'))" "auto" \
> +	"print language parameter"
> +    gdb_test "python print(gdb.current_language())" "c" \
> +	"print current language"
> +    gdb_test_no_output "set lang rust"
> +    gdb_test "python print(gdb.parameter('language'))" "rust" \
> +	"print language parameter for rust"
> +    gdb_test "python print(gdb.current_language())" "rust" \
> +	"print current language for rust"
> +    gdb_test_no_output "set lang auto"
> +}
> +
>  test_directories
>  test_data_directory
>  test_boolean_parameter
> @@ -380,6 +393,7 @@ test_really_undocumented_parameter
>  test_deprecated_api_parameter
>  test_integer_parameter
>  test_throwing_parameter
> +test_language
>  
>  # This caused a gdb crash.
>  gdb_test "python print(gdb.parameter('endian'))" "auto" \
> diff --git a/gdb/testsuite/gdb.rust/pp.exp b/gdb/testsuite/gdb.rust/pp.exp
> index 7c7c78b5847..e3e226c5db5 100644
> --- a/gdb/testsuite/gdb.rust/pp.exp
> +++ b/gdb/testsuite/gdb.rust/pp.exp
> @@ -40,3 +40,5 @@ if {![runto ${srcfile}:$line]} {
>  
>  gdb_test "print outer" " = pp::Outer \\(x\\(5\\)\\)"
>  gdb_test "print outer.0" " = x\\(5\\)"
> +
> +gdb_test "python print(gdb.selected_frame().language())" "rust"


      parent reply	other threads:[~2022-05-31 16:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-27 17:36 Tom Tromey
2022-05-27 17:48 ` Eli Zaretskii
2022-05-28 15:09 ` Enze Li
2022-05-31 13:53   ` Tom Tromey
2022-05-30  9:29 ` Andrew Burgess
2022-05-31 14:01   ` Tom Tromey
2022-05-31 15:50     ` Eli Zaretskii
2022-05-31 16:25     ` Andrew Burgess [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220531162550.GB6045@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@adacore.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).