@@ -842,15 +842,16 @@ def generate_dealloc_for_class(
842842 emitter .emit_line ("static void" )
843843 emitter .emit_line (f"{ dealloc_func_name } ({ cl .struct_name (emitter .names )} *self)" )
844844 emitter .emit_line ("{" )
845- emitter .emit_line ("int finalize_error = 0;" )
846- emitter .emit_line ("PyObject *type, *value, *traceback;" )
847- emitter .emit_line ("PyErr_Fetch(&type, &value, &traceback);" )
848845 if has_tp_finalize :
849846 emitter .emit_line ("if (!PyObject_GC_IsFinalized((PyObject *)self)) {" )
847+ emitter .emit_line ("PyObject *type, *value, *traceback;" )
848+ emitter .emit_line ("PyErr_Fetch(&type, &value, &traceback);" )
850849 emitter .emit_line ("PyObject_CallFinalizerFromDealloc((PyObject *)self);" )
850+ emitter .emit_line ("if (PyErr_Occurred() != NULL) {" )
851+ emitter .emit_line ("PyErr_WriteUnraisable((PyObject *)self);" )
852+ emitter .emit_line ("}" )
853+ emitter .emit_line ("PyErr_Restore(type, value, traceback);" )
851854 emitter .emit_line ("}" )
852- emitter .emit_line ("if (PyErr_Occurred() != NULL) finalize_error = 1;" )
853- emitter .emit_line ("PyErr_Restore(type, value, traceback);" )
854855 emitter .emit_line ("PyObject_GC_UnTrack(self);" )
855856 if cl .reuse_freed_instance :
856857 emit_reuse_dealloc (cl , emitter )
@@ -863,9 +864,6 @@ def generate_dealloc_for_class(
863864 # # However, the message is slightly different due to the way mypyc compiles classes.
864865 # # CPython interpreter prints: Exception ignored in: <function F.__del__ at 0x100aed940>
865866 # # mypyc prints: Exception ignored in: <slot wrapper '__del__' of 'F' objects>
866- emitter .emit_line ("if (finalize_error == 1) {" )
867- emitter .emit_line ("PyErr_WriteUnraisable((PyObject *)self);" )
868- emitter .emit_line ("}" )
869867 emitter .emit_line ("}" )
870868
871869
0 commit comments