aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/NEWS7
-rw-r--r--gdb/doc/python.texi12
-rw-r--r--gdb/python/py-frame.c25
-rw-r--r--gdb/python/python.c12
-rw-r--r--gdb/testsuite/gdb.python/py-frame.exp6
-rw-r--r--gdb/testsuite/gdb.python/py-parameter.exp14
-rw-r--r--gdb/testsuite/gdb.rust/pp.exp2
7 files changed, 78 insertions, 0 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index dac6dab..960f90b 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 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"