@@ -843,10 +843,9 @@ def generate_dealloc_for_class(
843843 emitter .emit_line (f"{ dealloc_func_name } ({ cl .struct_name (emitter .names )} *self)" )
844844 emitter .emit_line ("{" )
845845 if has_tp_finalize :
846- emitter .emit_line ("if (!PyObject_GC_IsFinalized((PyObject *)self)) {" )
847846 emitter .emit_line ("PyObject *type, *value, *traceback;" )
848847 emitter .emit_line ("PyErr_Fetch(&type, &value, &traceback);" )
849- emitter .emit_line ("PyObject_CallFinalizerFromDealloc((PyObject *)self);" )
848+ emitter .emit_line ("int res = PyObject_CallFinalizerFromDealloc((PyObject *)self);" )
850849 # CPython interpreter uses PyErr_WriteUnraisable: https://docs.python.org/3/c-api/exceptions.html#c.PyErr_WriteUnraisable
851850 # However, the message is slightly different due to the way mypyc compiles classes.
852851 # CPython interpreter prints: Exception ignored in: <function F.__del__ at 0x100aed940>
@@ -855,6 +854,8 @@ def generate_dealloc_for_class(
855854 emitter .emit_line ("PyErr_WriteUnraisable((PyObject *)self);" )
856855 emitter .emit_line ("}" )
857856 emitter .emit_line ("PyErr_Restore(type, value, traceback);" )
857+ emitter .emit_line ("if (res < 0) {" )
858+ emitter .emit_line ("goto done;" )
858859 emitter .emit_line ("}" )
859860 emitter .emit_line ("PyObject_GC_UnTrack(self);" )
860861 if cl .reuse_freed_instance :
@@ -864,6 +865,7 @@ def generate_dealloc_for_class(
864865 emitter .emit_line (f"{ clear_func_name } (self);" )
865866 emitter .emit_line ("Py_TYPE(self)->tp_free((PyObject *)self);" )
866867 emitter .emit_line ("CPy_TRASHCAN_END(self)" )
868+ emitter .emit_line ("done: ;" )
867869 emitter .emit_line ("}" )
868870
869871
0 commit comments