Browse Source

2011-03-21 Phil Muldoon <pmuldoon@redhat.com>

PR python/12183

	* python/py-function.c (fnpy_call): Treat GdbErrors differently to
	other error classes.  Do not print stack trace.

2011-03-21  Phil Muldoon  <pmuldoon@redhat.com>

        PR python/12183

	* gdb.python/py-function.exp: Add GdbError tests.
gdb_7_3-branch
Phil Muldoon 16 years ago
parent
commit
057758407c
  1. 7
      gdb/ChangeLog
  2. 51
      gdb/python/py-function.c
  3. 6
      gdb/testsuite/ChangeLog
  4. 26
      gdb/testsuite/gdb.python/py-function.exp

7
gdb/ChangeLog

@ -1,3 +1,10 @@
2011-03-22 Phil Muldoon <pmuldoon@redhat.com>
PR python/12183
* python/py-function.c (fnpy_call): Treat GdbErrors differently to
other error classes. Do not print stack trace.
2011-03-21 Jan Kratochvil <jan.kratochvil@redhat.com>
* dwarf2read.c (producer_is_gxx_lt_4_6): New function.

51
gdb/python/py-function.c

@ -79,8 +79,55 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
if (!result)
{
gdbpy_print_stack ();
error (_("Error while executing Python code."));
PyObject *ptype, *pvalue, *ptraceback;
char *msg;
PyErr_Fetch (&ptype, &pvalue, &ptraceback);
/* Try to fetch an error message contained within ptype, pvalue.
When fetching the error message we need to make our own copy,
we no longer own ptype, pvalue after the call to PyErr_Restore. */
msg = gdbpy_exception_to_string (ptype, pvalue);
make_cleanup (xfree, msg);
if (msg == NULL)
{
/* An error occurred computing the string representation of the
error message. This is rare, but we should inform the user. */
printf_filtered (_("An error occurred in a Python "
"convenience function\n"
"and then another occurred computing the "
"error message.\n"));
gdbpy_print_stack ();
}
/* Don't print the stack for gdb.GdbError exceptions.
It is generally used to flag user errors.
We also don't want to print "Error occurred in Python command"
for user errors. However, a missing message for gdb.GdbError
exceptions is arguably a bug, so we flag it as such. */
if (!PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
|| msg == NULL || *msg == '\0')
{
PyErr_Restore (ptype, pvalue, ptraceback);
gdbpy_print_stack ();
if (msg != NULL && *msg != '\0')
error (_("Error occurred in Python convenience function: %s"),
msg);
else
error (_("Error occurred in Python convenience function."));
}
else
{
Py_XDECREF (ptype);
Py_XDECREF (pvalue);
Py_XDECREF (ptraceback);
error ("%s", msg);
}
}
value = convert_value_from_python (result);

6
gdb/testsuite/ChangeLog

@ -1,3 +1,9 @@
2011-03-22 Phil Muldoon <pmuldoon@redhat.com>
PR python/12183
* gdb.python/py-function.exp: Add GdbError tests.
2011-03-18 Pedro Alves <pedro@codesourcery.com>
* gdb.trace/unavailable.cc (args_test_func, local_test_func)

26
gdb/testsuite/gdb.python/py-function.exp

@ -69,3 +69,29 @@ gdb_py_test_multiple "input int-returning function" \
gdb_test "print \$yes() && \$yes()" " = 1" "call yes with &&"
gdb_test "print \$yes() || \$yes()" " = 1" "call yes with ||"
gdb_py_test_multiple "Test GDBError" \
"python" "" \
"class GDBError(gdb.Function):" "" \
" def __init__(self):" "" \
" gdb.Function.__init__(self, 'gdberror')" "" \
" def invoke(self):" "" \
" raise gdb.GdbError(\"This is a GdbError\")" "" \
"GDBError ()" "" \
"end" ""
gdb_test "print \$gdberror()" "This is a GdbError.*" \
"Test GdbError. There should not be a stack trace"
gdb_py_test_multiple "Test Normal Error" \
"python" "" \
"class NormalError(gdb.Function):" "" \
" def __init__(self):" "" \
" gdb.Function.__init__(self, 'normalerror')" "" \
" def invoke(self):" "" \
" raise RuntimeError(\"This is a Normal Error\")" "" \
"NormalError ()" "" \
"end" ""
gdb_test "print \$normalerror()" "Traceback.*File.*line 5.*in invoke.*RuntimeError.*This is a Normal Error.*" \
"Test a Runtime error. There should be a stack trace."

Loading…
Cancel
Save