Commit 3583761b authored by R David Murray's avatar R David Murray

#17413: make sure settrace funcs get passed exception instances for 'value'.

Patch by Ingrid Cheung and Brendan McLoughlin.
parent 0aa685a3
......@@ -458,6 +458,29 @@ class RaisingTraceFuncTestCase(unittest.TestCase):
self.fail("exception not propagated")
def test_exception_arguments(self):
def f():
x = 0
# this should raise an error
x.no_such_attr
def g(frame, event, arg):
if (event == 'exception'):
type, exception, trace = arg
self.assertIsInstance(exception, Exception)
return g
existing = sys.gettrace()
try:
sys.settrace(g)
try:
f()
except AttributeError:
# this is expected
pass
finally:
sys.settrace(existing)
# 'Jump' tests: assigning to frame.f_lineno within a trace function
# moves the execution position - it's how debuggers implement a Jump
# command (aka. "Set next statement").
......
......@@ -208,6 +208,7 @@ David Chaum
Nicolas Chauvat
Jerry Chen
Michael Chermside
Ingrid Cheung
Albert Chin-A-Young
Adal Chiriliuc
Matt Chisholm
......@@ -786,6 +787,7 @@ Chris McDonough
Greg McFarlane
Alan McIntyre
Michael McLay
Brendan McLoughlin
Mark Mc Mahon
Gordon McMillan
Andrew McNamara
......
......@@ -12,6 +12,10 @@ What's New in Python 3.3.2?
Core and Builtins
-----------------
- Issue #17413: sys.settrace callbacks were being passed a string instead of an
exception instance for the 'value' element of the arg tuple if the exception
originated from C code; now an exception instance is always provided.
- Issue #17782: Fix undefined behaviour on platforms where
``struct timespec``'s "tv_nsec" member is not a C long.
......
......@@ -3712,6 +3712,7 @@ call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f)
value = Py_None;
Py_INCREF(value);
}
PyErr_NormalizeException(&type, &value, &traceback);
arg = PyTuple_Pack(3, type, value, traceback);
if (arg == NULL) {
PyErr_Restore(type, value, traceback);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment