diff options
-rw-r--r-- | gdb/NEWS | 7 | ||||
-rw-r--r-- | gdb/doc/python.texi | 12 | ||||
-rw-r--r-- | gdb/python/py-frame.c | 25 | ||||
-rw-r--r-- | gdb/python/python.c | 12 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-frame.exp | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.python/py-parameter.exp | 14 | ||||
-rw-r--r-- | gdb/testsuite/gdb.rust/pp.exp | 2 |
7 files changed, 78 insertions, 0 deletions
@@ -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 f933c7d..ba5a9b3 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 769e28c..9a28c36 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 11aaa7a..9bef225 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 (); +} + /* 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 b91ffe6..4991e8a 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 199d3bc..db158dd 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 7c7c78b..e3e226c 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" |