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:
parent
2b4ad2fe43
commit
ae778caf09
6 changed files with 57 additions and 4 deletions
|
@ -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.
|
||||||
|
|
|
@ -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".
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue