|
14 | 14 | #undef Yield /* undefine macro conflicting with <winbase.h> */ |
15 | 15 |
|
16 | 16 | #include "pycore_interp.h" // PyInterpreterState.importlib |
17 | | -#include "pycore_object.h" // _PyDebug_PrintTotalRefs() |
| 17 | +#include "pycore_object.h" // _PyDebug_PrintTotalRefs(), |
| 18 | + // _PyType_GetQualName() |
18 | 19 | #include "pycore_pyerrors.h" // _PyErr_Fetch |
19 | 20 | #include "pycore_pylifecycle.h" // _Py_UnhandledKeyboardInterrupt |
20 | 21 | #include "pycore_pystate.h" // _PyInterpreterState_GET() |
@@ -892,36 +893,37 @@ print_exception(PyObject *f, PyObject *value) |
892 | 893 | /* Don't do anything else */ |
893 | 894 | } |
894 | 895 | else { |
895 | | - PyObject* moduleName; |
896 | | - const char *className; |
| 896 | + PyObject* modulename; |
| 897 | + |
897 | 898 | _Py_IDENTIFIER(__module__); |
898 | 899 | assert(PyExceptionClass_Check(type)); |
899 | | - className = PyExceptionClass_Name(type); |
900 | | - if (className != NULL) { |
901 | | - const char *dot = strrchr(className, '.'); |
902 | | - if (dot != NULL) |
903 | | - className = dot+1; |
904 | | - } |
905 | 900 |
|
906 | | - moduleName = _PyObject_GetAttrId(type, &PyId___module__); |
907 | | - if (moduleName == NULL || !PyUnicode_Check(moduleName)) |
| 901 | + modulename = _PyObject_GetAttrId(type, &PyId___module__); |
| 902 | + if (modulename == NULL || !PyUnicode_Check(modulename)) |
908 | 903 | { |
909 | | - Py_XDECREF(moduleName); |
| 904 | + Py_XDECREF(modulename); |
| 905 | + PyErr_Clear(); |
910 | 906 | err = PyFile_WriteString("<unknown>", f); |
911 | 907 | } |
912 | 908 | else { |
913 | | - if (!_PyUnicode_EqualToASCIIId(moduleName, &PyId_builtins)) |
| 909 | + if (!_PyUnicode_EqualToASCIIId(modulename, &PyId_builtins)) |
914 | 910 | { |
915 | | - err = PyFile_WriteObject(moduleName, f, Py_PRINT_RAW); |
| 911 | + err = PyFile_WriteObject(modulename, f, Py_PRINT_RAW); |
916 | 912 | err += PyFile_WriteString(".", f); |
917 | 913 | } |
918 | | - Py_DECREF(moduleName); |
| 914 | + Py_DECREF(modulename); |
919 | 915 | } |
920 | 916 | if (err == 0) { |
921 | | - if (className == NULL) |
922 | | - err = PyFile_WriteString("<unknown>", f); |
923 | | - else |
924 | | - err = PyFile_WriteString(className, f); |
| 917 | + PyObject* qualname = _PyType_GetQualName((PyTypeObject *)type); |
| 918 | + if (qualname == NULL || !PyUnicode_Check(qualname)) { |
| 919 | + Py_XDECREF(qualname); |
| 920 | + PyErr_Clear(); |
| 921 | + err = PyFile_WriteString("<unknown>", f); |
| 922 | + } |
| 923 | + else { |
| 924 | + err = PyFile_WriteObject(qualname, f, Py_PRINT_RAW); |
| 925 | + Py_DECREF(qualname); |
| 926 | + } |
925 | 927 | } |
926 | 928 | } |
927 | 929 | if (err == 0 && (value != Py_None)) { |
|
0 commit comments