o
    HXîh¡:  ã                   @   sB  d Z ddlZddlZddlZddlZzddlmZ W n ey'   dd„ ZY nw zddlmZ W n ey=   dd„ ZY nw dd	l	m
Z
 G d
d„ dƒZG dd„ deƒZeG dd„ deƒƒZeG dd„ deƒƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ deejƒZG dd„ dƒZG dd„ deeƒZG dd„ deeƒZG d d!„ d!eeƒZG d"d#„ d#eejƒZG d$d%„ d%ƒZG d&d'„ d'eeƒZG d(d)„ d)eeƒZG d*d+„ d+eeƒZG d,d-„ d-eejƒZG d.d/„ d/eƒZeG d0d1„ d1eƒƒZeG d2d3„ d3eƒƒZ eG d4d5„ d5eeƒƒZ!e
j"G d6d7„ d7eejƒƒZ#e$d8kre %¡  dS dS )9zB
Tests for object finalization semantics, as outlined in PEP 442.
é    N)Úwith_tp_delc                 C   s   G dd„ dt ƒ}|S )Nc                   @   ó   e Zd Zdd„ ZdS )zwith_tp_del.<locals>.Cc                 _   ó   t dƒ‚)Nzrequires _testcapi.with_tp_del©Ú	TypeError©ÚclsÚargsÚkwargs© r   ú@/opt/python-3.10.19/usr/lib/python3.10/test/test_finalization.pyÚ__new__   ó   zwith_tp_del.<locals>.C.__new__N©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   ÚC   ó    r   )Úobject©r   r   r   r   r   r      s   r   )Ú
without_gcc                 C   s   G dd„ dƒ}|S )Nc                   @   r   )zwithout_gc.<locals>.Cc                 _   r   )Nzrequires _testcapi.without_gcr   r   r   r   r   r      r   zwithout_gc.<locals>.C.__new__Nr   r   r   r   r   r      r   r   r   r   r   r   r   r      s   r   )Úsupportc                   @   s^   e Zd ZdZg Zg Zg Zg ZdZdZ	e
dd„ ƒZe
ejdd„ ƒƒZdd	„ Zd
d„ Zdd„ ZdS )ÚNonGCSimpleBasezd
    The base class for all the objects under test, equipped with various
    testing features.
    Fr   c                 C   s>   | j  ¡  | j ¡  tj ¡  t ¡  | j ¡  | j ¡  d S ©N)Ú	survivorsÚclearÚerrorsÚgcÚgarbageÚcollectÚ	del_callsÚtp_del_calls©r   r   r   r   Ú_cleanup.   s   



zNonGCSimpleBase._cleanupc              	   c   s„    t  ¡ 3 | j ¡  | j ¡  dt_zdV  | jr| jd ‚W dt_|  ¡  ndt_|  ¡  w W d  ƒ dS 1 s;w   Y  dS )zI
        A context manager to use around all finalization tests.
        FNr   T)	r   Z
disable_gcr!   r   r"   r   Ú	_cleaningr   r$   r#   r   r   r   Útest7   s   €



ÿ
ÿ"özNonGCSimpleBase.testc                 C   ó   dS )z8
        Check the object is sane (non-broken).
        Nr   ©Úselfr   r   r   Úcheck_sanityI   ó    zNonGCSimpleBase.check_sanityc              
   C   óf   z| j s| j t| ƒ¡ |  ¡  |  ¡  W dS W dS  ty2 } z| j |¡ W Y d}~dS d}~ww )z‰
        PEP 442 finalizer.  Record that this was called, check the
        object is in a sane state, and invoke a side effect.
        N)r%   r!   ÚappendÚidr*   Úside_effectÚ	Exceptionr   ©r)   Úer   r   r   Ú__del__N   s   ý€ÿzNonGCSimpleBase.__del__c                 C   r'   )z6
        A side effect called on destruction.
        Nr   r(   r   r   r   r/   [   r+   zNonGCSimpleBase.side_effectN)r   r   r   Ú__doc__r   r!   r"   r   r%   Ú	__slots__Úclassmethodr$   Ú
contextlibÚcontextmanagerr&   r*   r3   r/   r   r   r   r   r      s     
r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú
SimpleBasec                 C   s   t | ƒ| _d S r   )r.   Zid_r(   r   r   r   Ú__init__c   ó   zSimpleBase.__init__c                 C   s   d S r   r   r(   r   r   r   r*   f   r+   zSimpleBase.check_sanityN)r   r   r   r;   r*   r   r   r   r   r:   a   s    r:   c                   @   s   e Zd ZdZdS )ÚNonGCr   N)r   r   r   r5   r   r   r   r   r=   j   s    r=   c                   @   s   e Zd ZdZdd„ ZdS )ÚNonGCResurrectorr   c                 C   ó   | j  | ¡ dS ©zF
        Resurrect self by storing self in a class-wide list.
        N©r   r-   r(   r   r   r   r/   r   ó   zNonGCResurrector.side_effectN)r   r   r   r5   r/   r   r   r   r   r>   n   s    r>   c                   @   ó   e Zd ZdS )ÚSimpleN©r   r   r   r   r   r   r   rD   x   ó    rD   c                   @   r   )ÚSimpleResurrectorc                 C   r?   r@   rA   r(   r   r   r   r/   ~   rB   zSimpleResurrector.side_effectN©r   r   r   r/   r   r   r   r   rG   |   ó    rG   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚTestBasec                 C   s"   t jd d … | _g t jd d …< d S r   )r   r   Úold_garbager(   r   r   r   ÚsetUp‡   s   zTestBase.setUpc                 C   s0   z|   tjg ¡ W | `t ¡  d S | `t ¡  w r   )ÚassertEqualr   r   rK   r    r(   r   r   r   ÚtearDown‹   s   ÿ
zTestBase.tearDownc                 C   ó   |   ttjƒt|ƒ¡ d S r   )rM   Úsortedr:   r!   ©r)   Úidsr   r   r   Úassert_del_calls“   ó   zTestBase.assert_del_callsc                 C   rO   r   )rM   rP   r:   r"   rQ   r   r   r   Úassert_tp_del_calls–   rT   zTestBase.assert_tp_del_callsc                 C   ó$   |   tdd„ tjD ƒƒt|ƒ¡ d S )Nc                 s   ó    | ]}t |ƒV  qd S r   ©r.   ©Ú.0Úxr   r   r   Ú	<genexpr>š   ó   € z,TestBase.assert_survivors.<locals>.<genexpr>)rM   rP   r:   r   rQ   r   r   r   Úassert_survivors™   ó   $zTestBase.assert_survivorsc                 C   rV   )Nc                 s   rW   r   rX   rY   r   r   r   r\      r]   z*TestBase.assert_garbage.<locals>.<genexpr>)rM   rP   r   r   rQ   r   r   r   Úassert_garbageœ   r_   zTestBase.assert_garbagec                 C   s   t j ¡  d S r   )r:   r   r   r(   r   r   r   Úclear_survivorsŸ   r<   zTestBase.clear_survivorsN)
r   r   r   rL   rN   rS   rU   r^   r`   ra   r   r   r   r   rJ   …   s    rJ   c                   @   s<   e Zd ZdZdd„ Zdd„ Zejdd„ ƒZejdd	„ ƒZ	d
S )ÚSimpleFinalizationTestz.
    Test finalization without refcycles.
    c                 C   ó   t  ¡ : tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	g ¡ |  
|ƒ d ¡ t ¡  |  |¡ |  	g ¡ W d   ƒ d S 1 sAw   Y  d S r   )r:   r&   rD   r.   ÚweakrefÚrefr   r    rS   r^   ÚassertIs©r)   ÚsrR   Úwrr   r   r   Útest_simple¨   ó   





"õz"SimpleFinalizationTest.test_simplec                 C   s¤   t  ¡ = tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	|¡ |  
|ƒ d ¡ |  ¡  t ¡  |  |¡ |  	g ¡ W d   ƒ n1 sDw   Y  |  |ƒ d ¡ d S r   )r:   r&   rG   r.   rd   re   r   r    rS   r^   ÚassertIsNotra   rf   rg   r   r   r   Útest_simple_resurrect¶   s   





ôz,SimpleFinalizationTest.test_simple_resurrectc                 C   sˆ   t  ¡ 6 tƒ }|  t |¡¡ t|ƒg}~t ¡  |  |¡ |  	g ¡ t ¡  |  |¡ |  	g ¡ W d   ƒ d S 1 s=w   Y  d S r   )
r:   r&   r=   ÚassertFalser   Ú
is_trackedr.   r    rS   r^   ©r)   rh   rR   r   r   r   Útest_non_gcÆ   s   




"öz"SimpleFinalizationTest.test_non_gcc                 C   s”   t  ¡ < tƒ }|  t |¡¡ t|ƒg}~t ¡  |  |¡ |  	|¡ |  
¡  t ¡  |  |d ¡ |  	|¡ W d   ƒ d S 1 sCw   Y  d S ©Né   )r:   r&   r>   rn   r   ro   r.   r    rS   r^   ra   rp   r   r   r   Útest_non_gc_resurrectÔ   s   



"õz,SimpleFinalizationTest.test_non_gc_resurrectN)
r   r   r   r4   rj   rm   r   Úcpython_onlyrq   rt   r   r   r   r   rb   £   s    
rb   c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚSelfCycleBasec                    s   t ƒ  ¡  | | _d S r   )Úsuperr;   re   r(   ©Ú	__class__r   r   r;   æ   s   

zSelfCycleBase.__init__c                    s   t ƒ  ¡  d S r   )rw   r*   r(   rx   r   r   r*   ê   r<   zSelfCycleBase.check_sanity)r   r   r   r;   r*   Ú__classcell__r   r   rx   r   rv   ä   s    rv   c                   @   rC   )ÚSimpleSelfCycleNrE   r   r   r   r   r{   î   rF   r{   c                   @   rC   )ÚSelfCycleResurrectorNrE   r   r   r   r   r|   ñ   rF   r|   c                   @   r   )ÚSuicidalSelfCyclec                 C   s
   d| _ dS )ú7
        Explicitly break the reference cycle.
        N)re   r(   r   r   r   r/   ö   s   
zSuicidalSelfCycle.side_effectNrH   r   r   r   r   r}   ô   rI   r}   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSelfCycleFinalizationTestzX
    Test finalization of an object having a single cyclic reference to
    itself.
    c                 C   rc   r   )r:   r&   r{   r.   rd   re   r   r    rS   r^   rf   rg   r   r   r   rj     rk   z%SelfCycleFinalizationTest.test_simplec                 C   s¦   t  ¡ E tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	|¡ |  
|ƒ d ¡ |  ¡  t ¡  |  |¡ |  	g ¡ |  
|ƒ d ¡ W d   ƒ d S 1 sLw   Y  d S r   )r:   r&   r|   r.   rd   re   r   r    rS   r^   rf   ra   rg   r   r   r   rm     s   






"ðz/SelfCycleFinalizationTest.test_simple_resurrectc                 C   sž   t  ¡ A tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	g ¡ |  
|ƒ d ¡ t ¡  |  |¡ |  	g ¡ |  
|ƒ d ¡ W d   ƒ d S 1 sHw   Y  d S r   )r:   r&   r}   r.   rd   re   r   r    rS   r^   rf   rg   r   r   r   Útest_simple_suicide%  s   






"ôz-SelfCycleFinalizationTest.test_simple_suicideN)r   r   r   r4   rj   rm   r€   r   r   r   r   r   ý   s
    r   c                       s$   e Zd Zdd„ Z‡ fdd„Z‡  ZS )ÚChainedBasec                 C   s   d| _ || _| |_d S )NF©ÚsuicidedÚleftÚright)r)   r„   r   r   r   Úchain9  s   
zChainedBase.chainc                    s4   t ƒ  ¡  | jr
d S | j}|jr| j}|jrd S d S r   )rw   r*   rƒ   r„   r…   )r)   r„   r…   rx   r   r   r*   >  s   

zChainedBase.check_sanity)r   r   r   r†   r*   rz   r   r   rx   r   r   7  s    r   c                   @   rC   )ÚSimpleChainedNrE   r   r   r   r   r‡   O  rF   r‡   c                   @   rC   )ÚChainedResurrectorNrE   r   r   r   r   rˆ   R  rF   rˆ   c                   @   r   )ÚSuicidalChainedc                 C   s   d| _ d| _d| _dS )r~   TNr‚   r(   r   r   r   r/   W  s   
zSuicidalChained.side_effectNrH   r   r   r   r   r‰   U  rI   r‰   c                   @   sh   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚCycleChainFinalizationTestz°
    Test finalization of a cyclic chain.  These tests are similar in
    spirit to the self-cycle tests above, but the collectable object
    graph isn't trivial anymore.
    c                 C   s:   dd„ |D ƒ}t t|ƒƒD ]}||  ||d  ¡ q|S )Nc                 S   ó   g | ]}|ƒ ‘qS r   r   )rZ   r   r   r   r   Ú
<listcomp>h  ó    z:CycleChainFinalizationTest.build_chain.<locals>.<listcomp>é   )ÚrangeÚlenr†   )r)   ÚclassesÚnodesÚir   r   r   Úbuild_chaing  s   z&CycleChainFinalizationTest.build_chainc                 C   s¨   t |ƒ}t ¡ B |  |¡}dd„ |D ƒ}dd„ |D ƒ}~t ¡  |  |¡ |  g ¡ |  dd„ |D ƒd g| ¡ t ¡  |  |¡ W d   ƒ d S 1 sMw   Y  d S )Nc                 S   ó   g | ]}t |ƒ‘qS r   rX   ©rZ   rh   r   r   r   rŒ   q  ó    zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>c                 S   ó   g | ]}t  |¡‘qS r   ©rd   re   r–   r   r   r   rŒ   r  ó    c                 S   r‹   r   r   ©rZ   ri   r   r   r   rŒ   w  r   )	r   r:   r&   r”   r   r    rS   r^   rM   )r)   r‘   ÚNr’   rR   Úwrsr   r   r   Úcheck_non_resurrecting_chainm  s   



"öz7CycleChainFinalizationTest.check_non_resurrecting_chainc                 C   sÐ   t |ƒ}t ¡ V |  |¡}t |ƒ}dd„ |D ƒ}dd„ |D ƒ}dd„ |D ƒ}~t ¡  |  |¡ |  |¡ |  dd„ |D ƒd g| ¡ |  	¡  t ¡  |  |¡ |  g ¡ W d   ƒ d S 1 saw   Y  d S )Nc                 S   r•   r   rX   r–   r   r   r   rŒ   €  r—   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |tƒrt|ƒ‘qS r   )Ú
isinstancerG   r.   r–   r   r   r   rŒ     s    c                 S   r˜   r   r™   r–   r   r   r   rŒ   ‚  rš   c                 S   r‹   r   r   r›   r   r   r   rŒ   ˆ  r   )
r   r:   r&   r”   r   r    rS   r^   rM   ra   )r)   r‘   rœ   r’   rR   Zsurvivor_idsr   r   r   r   Úcheck_resurrecting_chain{  s"   




"ñz3CycleChainFinalizationTest.check_resurrecting_chainc                 C   ó   |   tgd ¡ d S ©Né   )rž   r‡   r(   r   r   r   Útest_homogenousŽ  ó   z*CycleChainFinalizationTest.test_homogenousc                 C   r¡   r¢   )r    rˆ   r(   r   r   r   Útest_homogenous_resurrect‘  r¥   z4CycleChainFinalizationTest.test_homogenous_resurrectc                 C   r¡   r¢   )rž   r‰   r(   r   r   r   Útest_homogenous_suicidal”  r¥   z3CycleChainFinalizationTest.test_homogenous_suicidalc                 C   ó   |   ttgd ¡ d S rr   ©rž   r‰   r‡   r(   r   r   r   Útest_heterogenous_suicidal_one—  ó   z9CycleChainFinalizationTest.test_heterogenous_suicidal_onec                 C   s   |   tgd tgd  ¡ d S rr   r©   r(   r   r   r   Útest_heterogenous_suicidal_twoš  s   ÿz9CycleChainFinalizationTest.test_heterogenous_suicidal_twoc                 C   r¨   rr   )r    rˆ   r‡   r(   r   r   r   Útest_heterogenous_resurrect_onež  r«   z:CycleChainFinalizationTest.test_heterogenous_resurrect_onec                 C   s   |   tttgd ¡ d S rr   ©r    rˆ   r‡   r‰   r(   r   r   r   Útest_heterogenous_resurrect_two¡  s   ÿz:CycleChainFinalizationTest.test_heterogenous_resurrect_twoc                 C   s(   |   tgd tgd  tgd  ¡ d S rr   r®   r(   r   r   r   Ú!test_heterogenous_resurrect_three¥  s   ÿz<CycleChainFinalizationTest.test_heterogenous_resurrect_threeN)r   r   r   r4   r”   rž   r    r¤   r¦   r§   rª   r¬   r­   r¯   r°   r   r   r   r   rŠ   `  s    rŠ   c                   @   r9   )Ú
LegacyBasec              
   C   s^   z| j s| j t| ƒ¡ |  ¡  W d S W d S  ty. } z| j |¡ W Y d }~d S d }~ww r   )r%   r!   r-   r.   r*   r0   r   r1   r   r   r   r3   ¯  s   þ€ÿzLegacyBase.__del__c              
   C   r,   )zJ
        Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
        N)r%   r"   r-   r.   r*   r/   r0   r   r1   r   r   r   Ú
__tp_del__¹  s   ý€ÿzLegacyBase.__tp_del__N)r   r   r   r3   r²   r   r   r   r   r±   ­  s    
r±   c                   @   rC   )ÚLegacyNrE   r   r   r   r   r³   Å  ó    r³   c                   @   r   )ÚLegacyResurrectorc                 C   r?   r@   rA   r(   r   r   r   r/   Ì  rB   zLegacyResurrector.side_effectNrH   r   r   r   r   rµ   É  s    rµ   c                   @   rC   )ÚLegacySelfCycleNrE   r   r   r   r   r¶   Ò  r´   r¶   c                       s8   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚLegacyFinalizationTestz5
    Test finalization of objects with a tp_del.
    c                    s    t j ¡  t  ¡  tƒ  ¡  d S r   )r   r   r   r    rw   rN   r(   rx   r   r   rN   Ý  s   
zLegacyFinalizationTest.tearDownc                 C   sš   t  ¡ ? tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	|¡ |  
g ¡ |  |ƒ d ¡ t ¡  |  |¡ |  	|¡ W d   ƒ d S 1 sFw   Y  d S r   )r:   r&   r³   r.   rd   re   r   r    rS   rU   r^   rf   rg   r   r   r   Útest_legacyä  s   






"ôz"LegacyFinalizationTest.test_legacyc                 C   s¼   t  ¡ I tƒ }t|ƒg}t |¡}~t ¡  |  |¡ |  	|¡ |  
|¡ |  |ƒ d ¡ |  ¡  t ¡  |  |¡ |  	|d ¡ |  
|¡ W d   ƒ n1 sPw   Y  |  |ƒ d ¡ d S rr   )r:   r&   rµ   r.   rd   re   r   r    rS   rU   r^   rf   ra   rg   r   r   r   Útest_legacy_resurrectó  s"   






ñz,LegacyFinalizationTest.test_legacy_resurrectc                 C   sª   t  ¡ ; tƒ }t|ƒg}t |¡}~t ¡  |  g ¡ |  	g ¡ |  
g ¡ |  |¡ |  |ƒ d ¡ d tjd _W d   ƒ n1 sBw   Y  |  g ¡ |  |ƒ d ¡ d S )Nr   )r:   r&   r¶   r.   rd   re   r   r    rS   rU   r^   r`   rl   r   rf   rg   r   r   r   Útest_legacy_self_cycle  s   






ô
z-LegacyFinalizationTest.test_legacy_self_cycle)	r   r   r   r4   rN   r¸   r¹   rº   rz   r   r   rx   r   r·   ×  s    r·   Ú__main__)&r4   r7   r   Zunittestrd   Z	_testcapir   ÚImportErrorr   r&   r   r   r:   r=   r>   rD   rG   rJ   ZTestCaserb   rv   r{   r|   r}   r   r   r‡   rˆ   r‰   rŠ   r±   r³   rµ   r¶   ru   r·   r   Úmainr   r   r   r   Ú<module>   s`    ÿÿB			A
	:M
Aÿ