Browse Source

Issue #20041: Fixed TypeError when frame.f_trace is set to None.

Patch by Xavier de Gaye.
pull/9921/head
Serhiy Storchaka 10 years ago
parent
commit
64a263a1ce
  1. 9
      Lib/test/test_sys_settrace.py
  2. 3
      Misc/NEWS
  3. 8
      Objects/frameobject.c

9
Lib/test/test_sys_settrace.py

@ -388,6 +388,15 @@ class TraceTestCase(unittest.TestCase):
(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 setUp(self):

3
Misc/NEWS

@ -10,6 +10,9 @@ Release date: tba
Core and Builtins
-----------------
- Issue #20041: Fixed TypeError when frame.f_trace is set to None.
Patch by Xavier de Gaye.
- Issue #26168: Fixed possible refleaks in failing Py_BuildValue() with the "N"
format unit.

8
Objects/frameobject.c

@ -349,15 +349,13 @@ frame_gettrace(PyFrameObject *f, void *closure)
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;
}

Loading…
Cancel
Save