diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 224b3c8d66b..614e65de12d 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1086,8 +1086,8 @@ PyErr_PrintEx(int set_sys_last_vars) void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) { int err = 0; - PyObject *v = value; PyObject *f = PySys_GetObject("stderr"); + Py_INCREF(value); if (f == NULL) fprintf(stderr, "lost sys.stderr\n"); else { @@ -1097,12 +1097,12 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) if (tb && tb != Py_None) err = PyTraceBack_Print(tb, f); if (err == 0 && - PyObject_HasAttrString(v, "print_file_and_line")) + PyObject_HasAttrString(value, "print_file_and_line")) { PyObject *message; const char *filename, *text; int lineno, offset; - if (!parse_syntax_error(v, &message, &filename, + if (!parse_syntax_error(value, &message, &filename, &lineno, &offset, &text)) PyErr_Clear(); else { @@ -1118,7 +1118,8 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) PyFile_WriteString("\n", f); if (text != NULL) print_error_text(f, offset, text); - v = message; + Py_DECREF(value); + value = message; /* Can't be bothered to check all those PyFile_WriteString() calls */ if (PyErr_Occurred()) @@ -1155,8 +1156,8 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) else err = PyFile_WriteObject(exception, f, Py_PRINT_RAW); if (err == 0) { - if (v != NULL && v != Py_None) { - PyObject *s = PyObject_Str(v); + if (value != Py_None) { + PyObject *s = PyObject_Str(value); /* only print colon if the str() of the object is not the empty string */ @@ -1173,6 +1174,7 @@ void PyErr_Display(PyObject *exception, PyObject *value, PyObject *tb) if (err == 0) err = PyFile_WriteString("\n", f); } + Py_DECREF(value); /* If an error happened here, don't show it. XXX This is wrong, but too many callers rely on this behavior. */ if (err != 0)