summaryrefslogtreecommitdiffstats
path: root/Python/pythonrun.c
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-10-02 14:56:34 (GMT)
committerGitHub <noreply@github.com>2023-10-02 14:56:34 (GMT)
commita8431123c23c248e36ecb5d2c01ba3f8b5197360 (patch)
treee8d5203fe8d3e9284d387d536d11af36e9ca9236 /Python/pythonrun.c
parent1d8c18c39df9ab2a66151041aedb41e450779d96 (diff)
downloadcpython-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.c24
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__), &notes);
- 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__), &notes) < 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;
}