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

@ -1,3 +1,8 @@
2018-09-23 Tom Tromey <tom@tromey.com>
PR python/18852:
* python/py-param.c (get_set_value): Use gdbpy_handle_exception.
2018-09-23 Tom Tromey <tom@tromey.com> 2018-09-23 Tom Tromey <tom@tromey.com>
* python/py-function.c (fnpy_call): Use gdbpy_handle_exception. * python/py-function.c (fnpy_call): Use gdbpy_handle_exception.

View file

@ -1,3 +1,9 @@
2018-09-23 Tom Tromey <tom@tromey.com>
PR python/18852:
* python.texi (Parameters In Python): Document exception behavior
of get_set_string.
2018-09-18 John Baldwin <jhb@FreeBSD.org> 2018-09-18 John Baldwin <jhb@FreeBSD.org>
* gdb.texinfo (info proc): Remove "running". * gdb.texinfo (info proc): Remove "running".

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 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, method must return a string. If the returned string is not empty,
@value{GDBN} will present it to the user. @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 @end defun
@defun Parameter.get_show_string (self, svalue) @defun Parameter.get_show_string (self, svalue)

View file

@ -396,10 +396,7 @@ get_set_value (const char *args, int from_tty,
{ {
set_doc_string = call_doc_function (obj, set_doc_func.get (), NULL); set_doc_string = call_doc_function (obj, set_doc_func.get (), NULL);
if (! set_doc_string) if (! set_doc_string)
{ gdbpy_handle_exception ();
gdbpy_print_stack ();
return;
}
} }
const char *str = set_doc_string.get (); const char *str = set_doc_string.get ();

View file

@ -1,3 +1,9 @@
2018-09-23 Tom Tromey <tom@tromey.com>
PR python/18852:
* gdb.python/py-parameter.exp: Add test for parameter that throws
on "set".
2018-09-23 Tom Tromey <tom@tromey.com> 2018-09-23 Tom Tromey <tom@tromey.com>
PR python/17284: PR python/17284:

View file

@ -203,3 +203,18 @@ foreach kind {PARAM_ZUINTEGER PARAM_ZUINTEGER_UNLIMITED} {
"check that PARAM_ZUINTEGER value is -1 after setting" "check that PARAM_ZUINTEGER value is -1 after setting"
} }
} }
gdb_py_test_multiple "Throwing gdb parameter" \
"python" "" \
"class TestThrowParam (gdb.Parameter):" "" \
" def __init__ (self, name):" "" \
" super (TestThrowParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_STRING)" "" \
" self.value = True" "" \
" def get_set_string (self):" "" \
" raise gdb.GdbError('Ordinary gdb error')" "" \
"test_throw_param = TestThrowParam ('print test-throw-param')" ""\
"end"
gdb_test "set print test-throw-param whoops" \
"Ordinary gdb error" \
"gdb.GdbError does not show Python stack"