diff options
author | Irit Katriel <1055913+iritkatriel@users.noreply.github.com> | 2023-10-02 14:56:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-02 14:56:34 (GMT) |
commit | a8431123c23c248e36ecb5d2c01ba3f8b5197360 (patch) | |
tree | e8d5203fe8d3e9284d387d536d11af36e9ca9236 /Python/pythonrun.c | |
parent | 1d8c18c39df9ab2a66151041aedb41e450779d96 (diff) | |
download | cpython-a8431123c23c248e36ecb5d2c01ba3f8b5197360.zip cpython-a8431123c23c248e36ecb5d2c01ba3f8b5197360.tar.gz cpython-a8431123c23c248e36ecb5d2c01ba3f8b5197360.tar.bz2 |
[3.12] gh-109179: Fix traceback display for SyntaxErrors with notes (#109197) (#109280)
(cherry picked from commit ecd21a629a2a30bcae89902f7cad5670e9441e2c)
Diffstat (limited to 'Python/pythonrun.c')
-rw-r--r-- | Python/pythonrun.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 99e2eec..f4c5d39 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1092,21 +1092,16 @@ error: } static int -print_exception_notes(struct exception_print_context *ctx, PyObject *value) +print_exception_notes(struct exception_print_context *ctx, PyObject *notes) { PyObject *f = ctx->file; - if (!PyExceptionInstance_Check(value)) { + if (notes == NULL) { return 0; } - PyObject *notes; - int res = _PyObject_LookupAttr(value, &_Py_ID(__notes__), ¬es); - if (res <= 0) { - return res; - } if (!PySequence_Check(notes) || PyUnicode_Check(notes) || PyBytes_Check(notes)) { - res = 0; + int res = 0; if (write_indented_margin(ctx, f) < 0) { res = -1; } @@ -1119,7 +1114,6 @@ print_exception_notes(struct exception_print_context *ctx, PyObject *value) res = PyFile_WriteObject(s, f, Py_PRINT_RAW); Py_DECREF(s); } - Py_DECREF(notes); if (PyFile_WriteString("\n", f) < 0) { res = -1; } @@ -1164,17 +1158,16 @@ print_exception_notes(struct exception_print_context *ctx, PyObject *value) } } - Py_DECREF(notes); return 0; error: Py_XDECREF(lines); - Py_DECREF(notes); return -1; } static int print_exception(struct exception_print_context *ctx, PyObject *value) { + PyObject *notes = NULL; PyObject *f = ctx->file; if (!PyExceptionInstance_Check(value)) { @@ -1188,8 +1181,11 @@ print_exception(struct exception_print_context *ctx, PyObject *value) goto error; } - /* grab the type now because value can change below */ + /* grab the type and notes now because value can change below */ PyObject *type = (PyObject *) Py_TYPE(value); + if (_PyObject_LookupAttr(value, &_Py_ID(__notes__), ¬es) < 0) { + goto error; + } if (print_exception_file_and_line(ctx, &value) < 0) { goto error; @@ -1203,14 +1199,16 @@ print_exception(struct exception_print_context *ctx, PyObject *value) if (PyFile_WriteString("\n", f) < 0) { goto error; } - if (print_exception_notes(ctx, value) < 0) { + if (print_exception_notes(ctx, notes) < 0) { goto error; } + Py_XDECREF(notes); Py_DECREF(value); assert(!PyErr_Occurred()); return 0; error: + Py_XDECREF(notes); Py_DECREF(value); return -1; } |