Skip to content

Commit 64a263a

Browse files
Issue #20041: Fixed TypeError when frame.f_trace is set to None.
Patch by Xavier de Gaye.
1 parent 89beb27 commit 64a263a

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

Lib/test/test_sys_settrace.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,15 @@ def test_16_blank_lines(self):
388388
(257, 'line'),
389389
(257, 'return')])
390390

391+
def test_17_none_f_trace(self):
392+
# Issue 20041: fix TypeError when f_trace is set to None.
393+
def func():
394+
sys._getframe().f_trace = None
395+
lineno = 2
396+
self.run_and_compare(func,
397+
[(0, 'call'),
398+
(1, 'line')])
399+
391400

392401
class RaisingTraceFuncTestCase(unittest.TestCase):
393402
def setUp(self):

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Release date: tba
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #20041: Fixed TypeError when frame.f_trace is set to None.
14+
Patch by Xavier de Gaye.
15+
1316
- Issue #26168: Fixed possible refleaks in failing Py_BuildValue() with the "N"
1417
format unit.
1518

Objects/frameobject.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,15 +349,13 @@ frame_gettrace(PyFrameObject *f, void *closure)
349349
static int
350350
frame_settrace(PyFrameObject *f, PyObject* v, void *closure)
351351
{
352-
PyObject* old_value;
353-
354352
/* We rely on f_lineno being accurate when f_trace is set. */
355353
f->f_lineno = PyFrame_GetLineNumber(f);
356354

357-
old_value = f->f_trace;
355+
if (v == Py_None)
356+
v = NULL;
358357
Py_XINCREF(v);
359-
f->f_trace = v;
360-
Py_XDECREF(old_value);
358+
Py_XSETREF(f->f_trace, v);
361359

362360
return 0;
363361
}

0 commit comments

Comments
 (0)