Allow setting a parameter to raise gdb.GdbError

A convention in the Python layer is that raising a gdb.GdbError will
not print the Python stack -- instead the exception is treated as any
other gdb exception.

PR python/18852 asks that this treatment be extended the the
get_set_value method of gdb.Parameter.  This makes sense, because it
lets Python-created parameters act like gdb parameters.

2018-09-23  Tom Tromey  <tom@tromey.com>

	PR python/18852:
	* python/py-param.c (get_set_value): Use gdbpy_handle_exception.

gdb/doc/ChangeLog
2018-09-23  Tom Tromey  <tom@tromey.com>

	PR python/18852:
	* python.texi (Parameters In Python): Document exception behavior
	of get_set_string.

gdb/testsuite/ChangeLog
2018-09-23  Tom Tromey  <tom@tromey.com>

	PR python/18852:
	* gdb.python/py-parameter.exp: Add test for parameter that throws
	on "set".
This commit is contained in:
Tom Tromey
2018-09-15 01:09:22 -06:00
parent 2b4ad2fe43
commit ae778caf09
6 changed files with 57 additions and 4 deletions

View File

@@ -3828,6 +3828,30 @@ example, @kbd{set foo off}). The @code{value} attribute has already
been populated with the new value and may be used in output. This
method must return a string. If the returned string is not empty,
@value{GDBN} will present it to the user.
If this method raises the @code{gdb.GdbError} exception
(@pxref{Exception Handling}), then @value{GDBN} will print the
exception's string and the @code{set} command will fail. Note,
however, that the @code{value} attribute will not be reset in this
case. So, if your parameter must validate values, it should store the
old value internally and reset the exposed value, like so:
@smallexample
class ExampleParam (gdb.Parameter):
def __init__ (self, name):
super (ExampleParam, self).__init__ (name,
gdb.COMMAND_DATA,
gdb.PARAM_BOOLEAN)
self.value = True
self.saved_value = True
def validate(self):
return False
def get_set_string (self):
if not self.validate():
self.value = self.saved_value
raise gdb.GdbError('Failed to validate')
self.saved_value = self.value
@end smallexample
@end defun
@defun Parameter.get_show_string (self, svalue)