Skip to content

Commit d6b6d79

Browse files
committed
Code review
1 parent 5b92c8b commit d6b6d79

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

mypyc/codegen/emitclass.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)