diff options
author | Victor Stinner <vstinner@python.org> | 2020-04-28 23:28:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-28 23:28:13 (GMT) |
commit | 8852ad4208e34825f74e24945edb5bcf055d94fe (patch) | |
tree | 157f239ba46634301e136f4662b1646f7258357e /Python/traceback.c | |
parent | 5e8c691594d68925213d36296ce7c4b3e90bcb1d (diff) | |
download | cpython-8852ad4208e34825f74e24945edb5bcf055d94fe.zip cpython-8852ad4208e34825f74e24945edb5bcf055d94fe.tar.gz cpython-8852ad4208e34825f74e24945edb5bcf055d94fe.tar.bz2 |
bpo-40429: PyFrame_GetCode() now returns a strong reference (GH-19773)
Diffstat (limited to 'Python/traceback.c')
-rw-r--r-- | Python/traceback.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/Python/traceback.c b/Python/traceback.c index 1ea6cba..438a2c4 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -581,6 +581,7 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit) err = PyErr_CheckSignals(); } } + Py_DECREF(code); tb = tb->tb_next; } if (err == 0 && cnt > TB_RECURSIVE_CUTOFF) { @@ -752,12 +753,9 @@ _Py_DumpASCII(int fd, PyObject *text) static void dump_frame(int fd, PyFrameObject *frame) { - PyCodeObject *code; - int lineno; - - code = PyFrame_GetCode(frame); + PyCodeObject *code = PyFrame_GetCode(frame); PUTS(fd, " File "); - if (code != NULL && code->co_filename != NULL + if (code->co_filename != NULL && PyUnicode_Check(code->co_filename)) { PUTS(fd, "\""); @@ -768,7 +766,7 @@ dump_frame(int fd, PyFrameObject *frame) } /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */ - lineno = PyCode_Addr2Line(code, frame->f_lasti); + int lineno = PyCode_Addr2Line(code, frame->f_lasti); PUTS(fd, ", line "); if (lineno >= 0) { _Py_DumpDecimal(fd, (unsigned long)lineno); @@ -778,7 +776,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, " in "); - if (code != NULL && code->co_name != NULL + if (code->co_name != NULL && PyUnicode_Check(code->co_name)) { _Py_DumpASCII(fd, code->co_name); } @@ -787,6 +785,7 @@ dump_frame(int fd, PyFrameObject *frame) } PUTS(fd, "\n"); + Py_DECREF(code); } static void |