XjonddlZddlZddlZddlZddlmZddlmZejsJGddeZ y)N)TestCase) fails_leakcheck_on_py314_or_lessc:eZdZdZdZdZedZdZdZ y)TestGCctjtjtjj }t j |$tdtj||j||jt jt jy)NzO IS NOT NONE.) weakrefrefgreenlet getcurrentswitchgccollectprintsys getrefcount assertIsNone assertFalsegarbage)selfos j/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/greenlet/tests/test_gc.pytest_dead_circular_refzTestGC.test_dead_circular_refsx KK))(*=*=>EEG H 3? "COOAC$8 9 !# RZZ0c,Gddtj}|}||_tj|}t j |j ||jtjtjy)NceZdZdZy)8TestGC.test_circular_greenlet..circular_greenletN)__name__ __module__ __qualname__rrrcircular_greenletrsDrr") r rr r rrrrr)rr"rs rtest_circular_greenletzTestGC.test_circular_greenletsa  1 1    KKN  !# RZZ0rcGddtj}|}tj|}tj|j ||j tjtjy)NceZdZdZdZy)3TestGC.test_inactive_ref..inactive_greenletcZtjj||jy)N)run)r __init__r(rs rr)z.inactive_greenlet.__init__#s!!**4TXX*>rcyNr!r*s rr(z7TestGC.test_inactive_ref..inactive_greenlet.run&rN)rrr r)r(r!rrinactive_greenletr&"s  ? rr.)r r r rrrrr)rr.rs rtest_inactive_refzTestGC.test_inactive_ref!s\  1 1    KKN  !# RZZ0rc,Gddtg}tjfd}tj|}||_|j ||j ~~tjt jy)NceZdZdZy):TestGC.test_finalizer_crash..object_with_finalizercyr,r!r*s r__del__zBTestGC.test_finalizer_crash..object_with_finalizer.__del__Br-rN)rrr r4r!rrobject_with_finalizerr2As rr5ctj_ jtj`y#tj$rt dY5wxYw#tj`wxYw)NzGot greenlet exit!)r r objectr GreenletExitr)r5parentsr greenlet_bodyz2TestGC.test_finalizer_crash..greenlet_bodyFsh+@+BH   ! ( 1 '')0(( ,*+ ,'')0s#AA'$A*&A''A**B)r7r r arrayappendr rr)rr;r:gr5r9s @@rtest_finalizer_crashzTestGC.test_finalizer_crash.sq& F $$& 1   m , Q    rctjdkr|jdddl}d}|j |t y)NTest is 3.15+ onlyrcy)z >>> import gc >>> from greenlet import getcurrent, greenlet, GreenletExit >>> def outer(): ... gc.collect() >>> outer_glet = greenlet(outer) >>> outer_glet.switch() Nr!r!rr with_doctestz:TestGC.test_crashing_deferred_object..with_doctest[rr version_infoskipTestdoctestrun_docstring_examplesdictrrJrEs rtest_crashing_deferred_objectz$TestGC.test_crashing_deferred_objectWs9   g % MM. /  &&|TV>> import gc >>> from greenlet import getcurrent, greenlet >>> class Cycle: ... def __del__(self): ... print("(Running finalizer)") >>> def collect_it(): ... print("Collecting garbage") ... gc.collect() >>> def inner(): ... cycle1 = Cycle() ... cycle2 = Cycle() ... cycle1.cycle = cycle2 ... cycle2.cycle = cycle1 ... getcurrent().parent.switch() >>> def outer(): ... glet = greenlet(inner) ... glet.switch() ... collect_it() >>> outer_glet = greenlet(outer) >>> outer_glet.switch() Collecting garbage >>> outer_glet.dead True >>> collect_it() Collecting garbage (Running finalizer) (Running finalizer) Nr!r!rrrEz:TestGC.test_cycle_in_suspended_frame..with_doctestjrFrrGrMs rtest_cycle_in_suspended_framez$TestGC.test_cycle_in_suspended_framefs9   g % MM. / > &&|TVrNrQr!rrrrs011 1&&&&P =#=rr) rr rr r leakcheckrGREENLET_USE_GCrr!rrrUs8  7{=X{=r