@@ -575,6 +575,8 @@ def generate_setup_for_class(
575575 emitter .emit_line (f"if ({ prefix } _free_instance != NULL) {{" )
576576 emitter .emit_line (f"self = { prefix } _free_instance;" )
577577 emitter .emit_line (f"{ prefix } _free_instance = NULL;" )
578+ emitter .emit_line ("Py_SET_REFCNT(self, 1);" )
579+ emitter .emit_line ("PyObject_GC_Track(self);" )
578580 emitter .emit_line ("return (PyObject *)self;" )
579581 emitter .emit_line ("}" )
580582
@@ -806,9 +808,9 @@ def generate_dealloc_for_class(
806808 emitter .emit_line ("if (!PyObject_GC_IsFinalized((PyObject *)self)) {" )
807809 emitter .emit_line ("Py_TYPE(self)->tp_finalize((PyObject *)self);" )
808810 emitter .emit_line ("}" )
811+ emitter .emit_line ("PyObject_GC_UnTrack(self);" )
809812 if cl .reuse_freed_instance :
810813 emit_reuse_dealloc (cl , emitter )
811- emitter .emit_line ("PyObject_GC_UnTrack(self);" )
812814 # The trashcan is needed to handle deep recursive deallocations
813815 emitter .emit_line (f"CPy_TRASHCAN_BEGIN(self, { dealloc_func_name } )" )
814816 emitter .emit_line (f"{ clear_func_name } (self);" )
@@ -821,7 +823,6 @@ def emit_reuse_dealloc(cl: ClassIR, emitter: Emitter) -> None:
821823 prefix = cl .name_prefix (emitter .names )
822824 emitter .emit_line (f"if ({ prefix } _free_instance == NULL) {{" )
823825 emitter .emit_line (f"{ prefix } _free_instance = self;" )
824- emitter .emit_line ("Py_INCREF(self);" )
825826
826827 # TODO: emit_clear_bitmaps(cl, emitter)
827828
0 commit comments