changeset: 101702:4d916be61d46 branch: 2.7 parent: 101695:7c20ea2bdb3f user: Serhiy Storchaka date: Sat Jun 04 20:30:43 2016 +0300 files: Lib/test/test_sys_settrace.py Misc/NEWS Objects/frameobject.c description: Issue #20041: Fixed TypeError when frame.f_trace is set to None. Patch by Xavier de Gaye. diff -r 7c20ea2bdb3f -r 4d916be61d46 Lib/test/test_sys_settrace.py --- a/Lib/test/test_sys_settrace.py Sat Jun 04 09:39:42 2016 -0700 +++ b/Lib/test/test_sys_settrace.py Sat Jun 04 20:30:43 2016 +0300 @@ -386,6 +386,15 @@ (257, 'line'), (257, 'return')]) + def test_17_none_f_trace(self): + # Issue 20041: fix TypeError when f_trace is set to None. + def func(): + sys._getframe().f_trace = None + lineno = 2 + self.run_and_compare(func, + [(0, 'call'), + (1, 'line')]) + class RaisingTraceFuncTestCase(unittest.TestCase): def trace(self, frame, event, arg): diff -r 7c20ea2bdb3f -r 4d916be61d46 Misc/NEWS --- a/Misc/NEWS Sat Jun 04 09:39:42 2016 -0700 +++ b/Misc/NEWS Sat Jun 04 20:30:43 2016 +0300 @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #20041: Fixed TypeError when frame.f_trace is set to None. + Patch by Xavier de Gaye. + - Issue #25702: A --with-lto configure option has been added that will enable link time optimizations at build time during a make profile-opt. Some compilers and toolchains are known to not produce stable code when diff -r 7c20ea2bdb3f -r 4d916be61d46 Objects/frameobject.c --- a/Objects/frameobject.c Sat Jun 04 09:39:42 2016 -0700 +++ b/Objects/frameobject.c Sat Jun 04 20:30:43 2016 +0300 @@ -364,15 +364,13 @@ static int frame_settrace(PyFrameObject *f, PyObject* v, void *closure) { - PyObject* old_value; - /* We rely on f_lineno being accurate when f_trace is set. */ f->f_lineno = PyFrame_GetLineNumber(f); - old_value = f->f_trace; + if (v == Py_None) + v = NULL; Py_XINCREF(v); - f->f_trace = v; - Py_XDECREF(old_value); + Py_XSETREF(f->f_trace, v); return 0; }