ó
    ÷Þ jMÐ  ã                   ó¦  • S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SKrS SKJr	  SSK
Jr  SSK
Jr  SSK
Jr  SS	K
Jr  SS
K
Jr  SSK
Jr  SSKJr  SSKJr  SSKJr  SSKJr   " S S\5      rS rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\ S :X  a  \RB                  " 5         gg)!é    N)ÚABCMeta)Úabstractmethod)Úgreenleté   )ÚTestCase)ÚRUNNING_ON_MANYLINUX)ÚPY313)ÚPY314)ÚWIN)ÚRUNNING_ON_FREETHREAD_BUILD)Úfails_leakcheck)Ú fails_leakcheck_on_py314_or_less)Úignores_leakcheck)Úignores_leakcheck_ifc                   ó   • \ rS rSrSrg)Ú	SomeErroré"   © N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    ÚV/var/www/html/gaurav/venv/lib/python3.13/site-packages/greenlet/tests/test_greenlet.pyr   r   "   s   † Úr   r   c                 óÄ   •  [         R                  " 5       R                  R                  5         [        e!   U R	                  [
        R                  " 5       S   5        e = f©Nr   )r   Ú
getcurrentÚparentÚswitchÚappendÚsysÚexc_infor   ©Úseens    r   Úfmainr'   &   sJ   € ðÜ×ÒÓ×$Ñ$×+Ñ+Ô-ô €OøðØ�‰”C—L’L“N 1Ñ%Ô&Øús	   ‚-5 µ*Ac                 ó>   • S n[        X S9nUR                  U5        g )Nc                 ó   • U e©Nr   )Úexcs    r   ÚcrasherÚsend_exception.<locals>.crasher2   s   € Øˆ	r   ©r    ©ÚRawGreenletr!   )Úgr+   r,   Úg1s       r   Úsend_exceptionr3   /   s   € òä	�WÑ	'€BØ‡I�Iˆc…Nr   c                   ó  • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 r\S 5       rS rS rS rS r\R(                  " \=(       a    \S5      S 5       rS rS rS rS rS rS rS rS rS r S r!S r"S r#\$S7S j5       r%\$\&" \'=(       a    \(RR                  SS  S!:H  S"5      S# 5       5       r*S$ r+\,S% 5       r-S& r.S' r/S( r0S) r1S* r2S+ r3\R(                  " \=(       a    \S,5      S- 5       r4S. r5S/ r6S0 r7S1 r8S2 r9S3 r:S4 r;S5 r<S6r=g)8ÚTestGreenleté8   c                 ó  ^• / mU4S jn[        U5      nTR                  S5        UR                  5         TR                  S5        UR                  5         TR                  S5        U R                  T[	        [        S5      5      5        g )Nc                  ó¤   >• T R                  S5        [        R                  " 5       R                  R	                  5         T R                  S5        g )Nr   é   ©r"   r   r   r    r!   ©Úlsts   €r   ÚfÚ'TestGreenlet._do_simple_test.<locals>.f=   s4   ø€ Ø�J‰J�qŒMÜ×ÒÓ!×(Ñ(×/Ñ/Ô1Ø�J‰J�q�Mr   r   é   é   é   )r0   r"   r!   ÚassertEqualÚlistÚrange)Úselfr=   r1   r<   s      @r   Ú_do_simple_testÚTestGreenlet._do_simple_test:   sc   ø€ Øˆõ	ô ˜‹NˆØ�
‰
�1ŒØ	�‰Œ
Ø�
‰
�1ŒØ	�‰Œ
Ø�
‰
�1ŒØ×Ñ˜œd¤5¨£8›nÕ-r   c                 ó$   • U R                  5         g r*   )rF   ©rE   s    r   Útest_simpleÚTestGreenlet.test_simpleI   s   € Ø×ÑÕr   c                 óà   • [        5       nU R                  [        5       nUR                  5         S S S 5        U R	                  S[        WR                  5      5        g ! , (       d  f       N4= f©NÚrun)r0   ÚassertRaisesÚAttributeErrorr!   ÚassertInÚstrÚ	exception©rE   r1   r+   s      r   Ú(test_switch_no_run_raises_AttributeErrorÚ5TestGreenlet.test_switch_no_run_raises_AttributeErrorL   sI   € Ü‹MˆØ×Ñœ~Ô.°#Ø�H‰HŒJ÷ /ð 	�‰�eœS §¡Ó/Õ0÷ /Õ.ús    AÁ
A-c                 óê   • [        5       nU R                  [        5       nUR                  [        5        S S S 5        U R                  S[        WR                  5      5        g ! , (       d  f       N4= frM   )r0   rO   rP   Úthrowr   rQ   rR   rS   rT   s      r   Ú'test_throw_no_run_raises_AttributeErrorÚ4TestGreenlet.test_throw_no_run_raises_AttributeErrorS   sL   € Ü‹MˆØ×Ñœ~Ô.°#Ø�G‰G”IÔ÷ /ð 	�‰�eœS §¡Ó/Õ0÷ /Õ.ús    A$Á$
A2c                 ó–   • [        S S9nU R                  U5        U R                  UR                  [        R
                  " 5       5        g )Nr.   )r0   ÚassertIsNotNoneÚassertIsr    r   r   ©rE   r1   s     r   Útest_parent_equals_NoneÚ$TestGreenlet.test_parent_equals_NoneZ   s5   € Ü˜tÑ$ˆØ×Ñ˜QÔØ�‰�a—h‘h¤× 3Ò 3Ó 5Õ6r   c                 ón   • [        S S9nU R                  U5        U R                  UR                  5        g )N)rN   )r0   r\   ÚassertIsNonerN   r^   s     r   Útest_run_equals_NoneÚ!TestGreenlet.test_run_equals_None_   s,   € Ü˜DÑ!ˆØ×Ñ˜QÔØ×Ñ˜!Ÿ%™%Õ r   c                 ó
  ^• / mU4S jn[        U5      n[        U5      nUR                  5         U R                  [        T5      S5        UR                  5         U R                  [        T5      S5        UR                  5         U R                  [        T5      S5        U R                  UR                  S5        UR                  5         U R                  [        T5      S5        U R                  UR                  S5        g )Nc                  ó¨   >• T R                  S5        [        R                  " 5       R                  R	                  5         T R                  SS/5        g )Nr   )r"   r   r   r    r!   Úextendr;   s   €r   r=   Ú)TestGreenlet.test_two_children.<locals>.fg   s9   ø€ Ø�J‰J�qŒMÜ×ÒÓ!×(Ñ(×/Ñ/Ô1Ø�J‰J˜˜1�vÕr   r   r?   r@   Té   )r0   r!   rB   ÚlenÚdead)rE   r=   r1   Úhr<   s       @r   Útest_two_childrenÚTestGreenlet.test_two_childrend   s½   ø€ Øˆõ	ô ˜‹NˆÜ˜‹NˆØ	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø×Ñ˜Ÿ™ Ô&Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø×Ñ˜Ÿ™ Õ&r   c                 óÀ  ^^• / mU4S jmUU4S jnU R                  [        R                  " U5      [        (       d  SOS5        [	        U5      nU R                  [        R                  " U5      [        (       d  SOS5        UR                  5         U R                  T/ SQ5        U R                  [        R                  " U5      [        (       d  S5        g S5        g )Nc                  ó‚   >• T R                  S5        [        R                  " 5       R                  R	                  5         g )NÚbr:   r;   s   €r   r=   Ú3TestGreenlet.test_two_recursive_children.<locals>.f{   s)   ø€ Ø�J‰J�sŒOÜ×ÒÓ!×(Ñ(×/Ñ/Õ1r   c                  ó€   >• TR                  S5        [        T5      n U R                  5         TR                  S5        g )NÚaÚc)r"   r0   r!   )r1   r=   r<   s    €€r   r1   Ú3TestGreenlet.test_two_recursive_children.<locals>.g   s+   ø€ Ø�J‰J�sŒOÜ˜A“ˆAØ�H‰HŒJØ�J‰J�s�Or   r?   r   )rt   rq   ru   )rB   r#   Úgetrefcountr
   r0   r!   )rE   r1   r=   r<   s     @@r   Útest_two_recursive_childrenÚ(TestGreenlet.test_two_recursive_childrenx   s˜   ù€ Øˆõ	2ö	ð
 	×ÑœŸš¨Ó+·e²e©QÀÔCÜ˜‹Nˆð 	×ÑœŸš¨Ó+·e²e©QÀÔCØ	�‰Œ
Ø×Ñ˜šoÔ.à×ÑœŸš¨Ó+·e²e¨QÕCÀÕCr   c                 ó*  ^ ^• / mU U4S jn[        S5       Vs/ sH  n[        R                  " US9PM     nnU H  nUR                  5         M     U H  nUR	                  S5        M     T R                  [        T5      [        U5      5        g s  snf )Nc                  óH   >• T R                  5         TR                  S5        g ©NT)rF   r"   )rE   Úsuccesss   €€r   r=   Ú$TestGreenlet.test_threads.<locals>.f‘   s   ø€ Ø× Ñ Ô"Ø�N‰N˜4Õ r   é
   ©Útarget)rD   Ú	threadingÚThreadÚstartÚjoinrB   rj   )rE   r=   ÚiÚthsÚthr}   s   `    @r   Útest_threadsÚTestGreenlet.test_threadsŽ   sw   ù€ Øˆö	!ô 49¸´9Ó=±9¨aŒy×Ò qÔ)±9ˆÐ=ÛˆBØ�H‰HŽJñ ãˆBØ�G‰G�BŽKñ à×Ñœ˜W›¤s¨3£xÕ0ùò >s   ™Bc                 ó‚   ^^• S mS mSUU4S jjn[        S5       H  nU" 5         [        R                  " 5         M!     g )Nc                 ó˜   • S n[         R                   " U5      nUR                  5         U R                  U5        UR                  5         g )Nc                  ób   •  [         R                  " 5       R                  R                  5         M/  r*   ©r   r   r    r!   r   r   r   ÚbodyÚPTestGreenlet.test_switching_many_threads.<locals>.creates_greenlet.<locals>.bodyŸ   s%   € ØÜ×'Ò'Ó)×0Ñ0×7Ñ7Ô9ñ r   )r   r!   r"   Úwait)Ú	greenletsÚwait_to_die_untilr�   r1   s       r   Úcreates_greenletÚBTestGreenlet.test_switching_many_threads.<locals>.creates_greenletž   s<   € ò:ô ×!Ò! $Ó'ˆAØ�H‰HŒJØ×Ñ˜QÔØ×"Ñ"Õ$r   c                 ó   • UR                  5         UR                  5       (       dN  [        U 5       H'  n UR                  (       d  UR	                  5         M'  M)     UR                  5       (       d  MM  g g ! [
        R                   a     M[  f = fr*   )r‘   Úis_setrC   rk   r!   r   Úerror)r’   Úwait_to_check_untilÚ
quit_afterr1   s       r   Úswitches_from_other_threadÚLTestGreenlet.test_switching_many_threads.<locals>.switches_from_other_thread§   sp   € Ø×$Ñ$Ô&Ø ×'Ñ'×)Ñ)Ü˜iž�AðØ ŸvŸvØŸH™HžJñ  &ñ )ð !×'Ñ'×)Õ)øô
 $Ÿ>™>ó ò ðús   µ!A5Á5BÂBc           	      óx  >• / n[         R                  " 5       n[         R                  " 5       n[        U 5       Vs/ sH  n[         R                  " TUU4S9PM     nn[        U 5       Vs/ sH  n[         R                  " T	XU4S9PM     nnXV-    H  nUR	                  5         M     [        U5      U :  a'  [        R                  " S5        [        U5      U :  a  M'  UR                  5         U H  nUR                  S5        M     UR                  5         U H  nUR                  S5        M     g s  snf s  snf )N©r�   Úargsg-Cëâ6?g      ð?)
r‚   ÚEventrD   rƒ   r„   rj   ÚtimeÚsleepÚsetr…   )
Úthread_countr’   Úgreenlets_all_createdÚall_threads_deadÚ_ÚcreatorsÚ	switchersÚtr”   r›   s
           €€r   Úrun_itÚ8TestGreenlet.test_switching_many_threads.<locals>.run_it³   s>  ø€ ØˆIÜ$-§O¢OÓ$5Ð!Ü(ŸšÓ0Ðô ˜Ô&ó	ñ 'ð ô × Ò Ð(8À	Ø@Uð@Wô Xñ 'ð	 ð ô ˜Ô&óñ
 'ð ô × Ò Ð(BØ'0Ø'7ð'9ô:ñ 'ð ð ð Ô*�Ø—‘–	ñ +ô �i“. <Ó/Ü—
’
˜6Ô"ô �i“. <Õ/à!×%Ñ%Ô'ã�Ø—‘�s–ñ à× Ñ Ô"Û�Ø—‘�s–ò ùò5ùòs   » D2Á* D7é   )é   )rD   ÚgcÚcollect)rE   r«   r§   r”   r›   s      @@r   Útest_switching_many_threadsÚ(TestGreenlet.test_switching_many_threads›   s6   ù€ ò	%ò
	÷ 	ð  	ôH �r–ˆAÙŒHÜ�JŠJŽLò r   c                 ó  • / n[        [        5      n[        [        5      nUR                  U5        UR                  U5        X#l        U R	                  U/ 5        U R                  [        UR                  5        U R	                  U[        /5        UR                  5       nU R	                  US5        U R	                  U[        /5        UR                  S5      nU R	                  US5        U R	                  U[        /5        g )Nr   é   )r0   r'   r!   r    rB   rO   r   )rE   r&   r2   Úg2Úvalues        r   Útest_exceptionÚTestGreenlet.test_exceptionÛ   sÊ   € ØˆÜœÓˆÜœÓˆØ
�	‰	�$ŒØ
�	‰	�$ŒØŒ	à×Ñ˜˜rÔ"ð 	×Ñœ) R§Y¡YÔ/Ø×Ñ˜¤	˜{Ô+à—	‘	“ˆØ×Ñ˜ Ô#Ø×Ñ˜¤	˜{Ô+à—	‘	˜"“ˆØ×Ñ˜ Ô#Ø×Ñ˜¤	˜{Õ+r   c                 ó¶   • / n[        [        5      nUR                  U5        U R                  [        [
        U[        5        U R                  U[        /5        g r*   )r0   r'   r!   rO   ÚKeyErrorr3   rB   )rE   r&   r2   s      r   Útest_send_exceptionÚ TestGreenlet.test_send_exception÷   sB   € ØˆÜœÓˆØ
�	‰	�$ŒØ×Ñœ(¤N°B¼ÔAØ×Ñ˜¤˜zÕ*r   c                 ó¦  • / n[        [        5      n[        [        5      nUR                  U5        UR                  U5        U R                  U/ 5        A[        R
                  " 5         U R                  U[        R                  /5        A[        R
                  " 5         U R                  U[        R                  [        R                  /5        g r*   )r0   r'   r!   rB   r¯   r°   r   ÚGreenletExit)rE   r&   r2   rµ   s       r   Útest_deallocÚTestGreenlet.test_deallocþ   s“   € ØˆÜœÓˆÜœÓˆØ
�	‰	�$ŒØ
�	‰	�$ŒØ×Ñ˜˜rÔ"ØÜ
�
Š
ŒØ×Ñ˜¤× 5Ñ 5Ð6Ô7ØÜ
�
Š
ŒØ×Ñ˜¤× 5Ñ 5´x×7LÑ7LÐMÕNr   c                 ó>  ^• S n[        U5      nUR                  5         / m[        R                  nU4S jnU[        l         AU[        l        U R	                  [        T5      S5        U R                  TS   R                  [        5        g ! U[        l        f = f)Nc                  óž   •  [         R                  " 5       R                  R                  5         g ! [         R                   a    [
        S ef = fr*   )r   r   r    r!   r¾   r   r   r   r   rN   ÚHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.run  s?   € ð*Ü×#Ò#Ó%×,Ñ,×3Ñ3Õ5øÜ×(Ñ(ó *Ü TÐ)ð*ús	   ‚-0 °Ac                 ó(   >• TR                  U 5        g r*   ©r"   )Ú
unraisableÚunraisable_eventss    €r   Ú_captureÚMTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>._capture  s   ø€ Ø×$Ñ$ ZÕ0r   r   r   )	r0   r!   r#   ÚunraisablehookrB   rj   ÚassertIsInstanceÚ	exc_valuer   )rE   rN   r1   Úold_hookrÈ   rÇ   s        @r   Ú.test_dealloc_catches_GreenletExit_throws_otherÚ;TestGreenlet.test_dealloc_catches_GreenletExit_throws_other  s‰   ø€ ò	*ô ˜ÓˆØ	�‰Œ
àÐÜ×%Ñ%ˆõ	1à%ŒÔð	*Øà!)ŒCÔà×ÑœÐ.Ó/°Ô3Ø×ÑÐ/°Ñ2×<Ñ<¼iÕHøð "*ŒCÕús   ÁB ÂBz=Sometimes flaky (getting one GreenletExit in the second list)c                 óD  ^^^^^^• / m/ m[         R                  " 5       m[         R                  " 5       m[         R                  " 5       m[         R                  " 5       mUUUUUU4S jn[         R                  " US9nUR                  5         TR	                  S5        U R                  T/ 5        U R                  [        T5      S5        TS S 2	 [        (       d  [        R                  " 5         U R                  T/ 5        TR                  5         TR	                  S5         U R                  T[        R                  /5        TR                  5         UR                  S5        TS S 2	 TS S 2	 g ! TR                  5         UR                  S5        TS S 2	 TS S 2	 f = f)Nc                  ó@  >• [        [        5      n U R                  T5        TR                  U 5        A [        R
                  " 5         TR                  5         TR                  S5        [        5         TR                  5         TR                  S5        [        5         g )Nr9   )r0   r'   r!   r"   r¯   r°   r£   r‘   )r2   Ú/bg_glet_created_running_and_no_longer_ref_in_bgÚbg_should_be_clearÚfg_ref_releasedÚok_to_exit_bg_threadr&   Úsomerefs    €€€€€€r   r=   Ú1TestGreenlet.test_dealloc_other_thread.<locals>.f4  sn   ø€ ÜœUÓ#ˆBØ�I‰I�dŒOØ�N‰N˜2ÔØÜ�JŠJŒLØ;×?Ñ?ÔAØ× Ñ  Ô#äŒMØ×"Ñ"Ô$Ø ×%Ñ% aÔ(Ü�Mr   r€   r   r   r9   )r‚   r    rƒ   r„   r‘   rB   rj   r   r¯   r°   r£   r   r¾   r…   )	rE   r=   rª   rÒ   rÓ   rÔ   rÕ   r&   rÖ   s	      @@@@@@r   Útest_dealloc_other_threadÚ&TestGreenlet.test_dealloc_other_thread$  sI  ý€ ð ˆØˆä:C¿/º/Ó:KÐ7Ü#Ÿ/š/Ó+ˆÜ&Ÿ_š_Ó.ÐÜ(ŸšÓ0Ð÷	ò 	ô ×Ò AÑ&ˆØ	�‰Œ	Ø7×<Ñ<¸RÔ@à×Ñ˜˜rÔ"Ø×Ñœ˜W› qÔ)Ø’AˆJß*Ò*ô �JŠJŒLð 	×Ñ˜˜rÔ"Ø×ÑÔØ×Ñ Ô"ð	Ø×Ñ˜T¤H×$9Ñ$9Ð#:Ô;à ×$Ñ$Ô&Ø�F‰F�2ŒJØ’Q�Øš‘
øð !×$Ñ$Ô&Ø�F‰F�2ŒJØ’Q�Øš‘
ús   Ä%!E2 Å2-Fc                 ó@  ^ • U 4S jn[        U5      nUR                  5       nT R                  X2R                  L 5        T R                  U5        UR                  5       nT R	                  U5        T R                  US5        T R                  UR                  S 5        g )Nc                  óÆ   >• [         R                  " S5      n TR                  U R                  S 5        [        R
                  " 5       R                  R                  U 5        g)Nr   úmeaning of life)r#   Ú	_getframerB   Úf_backr   r   r    r!   )r=   rE   s    €r   Úf1Ú#TestGreenlet.test_frame.<locals>.f1c  sE   ø€ Ü—’˜aÓ ˆAØ×Ñ˜QŸX™X tÔ,Ü×ÒÓ!×(Ñ(×/Ñ/°Ô2Ø$r   rÜ   )r0   r!   Ú
assertTrueÚgr_frameÚassertFalserB   )rE   rß   r1   ÚframeÚfrom_gs   `    r   Ú
test_frameÚTestGreenlet.test_frameb  s{   ø€ õ	%ô
 ˜‹OˆØ—‘“
ˆØ�‰˜§¡Ð+Ô,Ø�‰˜Ôà—‘“ˆØ×Ñ˜ÔØ×Ñ˜Ð!2Ô3Ø×Ñ˜Ÿ™ TÕ*r   c                 óâ   • S n[         R                  " USS9n[         R                  " USS9nUR                  5         UR                  5         UR                  S5        UR                  S5        g )Nc                 óD   ^ • [        U 4S j5      nUR                  5         g )Nc                  ó0   >• [         R                  " T 5      $ r*   )r¡   r¢   ©Úxs   €r   Ú<lambda>Ú>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>t  s   ø€ ¤D§J¢J¨q¤Mr   r/   )rì   r1   s   ` r   ÚrunnerÚ,TestGreenlet.test_thread_bug.<locals>.runners  s   ø€ ÜÔ1Ó2ˆAØ�H‰H�Jr   )gš™™™™™É?rž   )g333333Ó?r   )r‚   rƒ   r„   r…   )rE   rï   Út1Út2s       r   Útest_thread_bugÚTestGreenlet.test_thread_bugr  sU   € ò	ô ×Ò V°&Ñ9ˆÜ×Ò V°&Ñ9ˆØ
�‰Œ
Ø
�‰Œ
Ø
�‰�ŒØ
�‰��r   c                 óh   ^ • U 4S jn[        U5      R                  SSS9nT R                  US5        g )Nc                 óN   >• TR                  U S5        TR                  US5        g)Nr@   r?   é*   )rB   )rt   rq   rE   s     €r   rN   Ú,TestGreenlet.test_switch_kwargs.<locals>.run~  s&   ø€ Ø×Ñ˜Q Ô"Ø×Ñ˜Q Ô"Ør   r@   r?   )rt   rq   r÷   ©r0   r!   rB   )rE   rN   rì   s   `  r   Útest_switch_kwargsÚTestGreenlet.test_switch_kwargs}  s4   ø€ õ	ô ˜Ó×#Ñ# a¨1Ð#Ð-ˆØ×Ñ˜˜BÕr   c                 óî   • S n[        U5      nU R                  SS0UR                  S5      5        U R                  SSS04UR                  5       5        U R                  SUR                  5       5        g )Nc                 óÀ   • [         R                  " 5       R                  R                  U S9  [         R                  " 5       R                  R                  SSS9  X S-  4$ )Nrë   r?   r9   rŽ   rë   s    r   rN   Ú6TestGreenlet.test_switch_kwargs_to_parent.<locals>.run†  sP   € Ü×ÒÓ!×(Ñ(×/Ñ/°!Ð/Ñ4Ü×ÒÓ!×(Ñ(×/Ñ/°°QÐ/Ñ7Ø˜1‘f�9Ðr   rì   r9   )r?   )r9   é	   )r0   rB   r!   )rE   rN   r1   s      r   Útest_switch_kwargs_to_parentÚ)TestGreenlet.test_switch_kwargs_to_parent…  sd   € ò	ô ˜ÓˆØ×Ñ˜#˜q˜ 1§8¡8¨A£;Ô/Ø×Ñ˜$  a Ð)¨1¯8©8«:Ô6Ø×Ñ˜ §¡£Õ,r   c                 óÖ  ^^^• 0 m[         R                  " 5       m[         R                  " 5       mUUU4S jn[         R                  " US9nUR                  5         TR	                  S5        U R                  [        R                  5         TS   R                  5         S S S 5        TR                  5         UR                  S5        TR                  5         g ! , (       d  f       N@= f)Nc                  óf   >• [        S 5      TS'   T R                  5         TR                  S5        g )Nc                  ó   • g r*   r   r   r   r   rí   ÚITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>•  ó   € ¨Dr   r1   r   ©r0   r£   r‘   ©Úcreated_eventÚdataÚ
done_events   €€€r   rN   Ú7TestGreenlet.test_switch_to_another_thread.<locals>.run”  ó)   ø€ Ü#¡LÓ1ˆD�‰IØ×ÑÔØ�O‰O˜BÕr   r€   r   r1   )r‚   r    rƒ   r„   r‘   rO   r   r˜   r!   r£   r…   Úclear)rE   rN   Úthreadr	  r
  r  s      @@@r   Útest_switch_to_another_threadÚ*TestGreenlet.test_switch_to_another_thread�  sœ   ú€ ØˆÜ!ŸšÓ)ˆÜ—_’_Ó&ˆ
÷	 ô ×!Ò!¨Ñ-ˆØ�‰ŒØ×Ñ˜2ÔØ×ÑœxŸ~™~Õ.Ø�‰I×ÑÔ÷ /à�‰ÔØ�‰�BŒà�
‰
�÷ /Õ.ús   ÂCÃ
C(c                 óT   ^ ^• UU 4S jnU 4S jm[        U5      R                  5         g )Nc                  óÐ   >•  [        S5      e!   [        R                  " 5       n [        T5      R	                  5         TR                  U [        R                  " 5       5         g = f)NÚfun)Ú
ValueErrorr#   r$   r0   r!   rB   )r$   rl   rE   s    €€r   r=   Ú&TestGreenlet.test_exc_state.<locals>.f£  sK   ø€ ð;Ü  Ó'Ð'øð;ÜŸ<š<›>�Ü˜A“×%Ñ%Ô'Ø× Ñ  ¬3¯<ª<«>Ö:ús
   ƒ ŽAA%c                  óP   >• T R                  [        R                  " 5       S5        g )N)NNN)rB   r#   r$   rI   s   €r   rl   Ú&TestGreenlet.test_exc_state.<locals>.h«  s   ø€ Ø×ÑœSŸ\š\›^Ð-?Õ@r   r/   )rE   r=   rl   s   ` @r   Útest_exc_stateÚTestGreenlet.test_exc_state¢  s    ù€ ö	;õ	Aô 	�A‹×ÑÕr   c                 ó°  • S nS nS n[        U5      nU R                  UR                  0 5        UR                  5         U R                  UR                  S5        U R                  UR                  SS05        UR                  Ul        U R                  UR                  SS05        U R                  [        X$5        U R                  [        X4S5        g )Nc                  ó8   • S[         R                  " 5       l        g ©Nr÷   )r   r   Útestr   r   r   r=   Ú*TestGreenlet.test_instance_dict.<locals>.f±  s   € Ø)+ŒH×ÒÓ!Õ&r   c                 ó   • U ? g r*   ©Ú__dict__)r1   s    r   ÚdeldictÚ0TestGreenlet.test_instance_dict.<locals>.deldict³  s   € Ø‘
r   c                 ó   • Xl         g r*   r!  )r1   r¶   s     r   ÚsetdictÚ0TestGreenlet.test_instance_dict.<locals>.setdictµ  s   € Ø�Jr   r÷   r  )r0   rB   r"  r!   r  rO   Ú	TypeError)rE   r=   r#  r&  r1   s        r   Útest_instance_dictÚTestGreenlet.test_instance_dict°  s¨   € ò	,ò	ò	ä˜‹NˆØ×Ñ˜Ÿ™ RÔ(Ø	�‰Œ
Ø×Ñ˜Ÿ™ Ô$Ø×Ñ˜Ÿ™ f¨b \Ô2Ø—Z‘ZˆŒ
Ø×Ñ˜Ÿ™ f¨b \Ô2Ø×Ñœ) WÔ0Ø×Ñœ) W°Õ4r   c                 ór   ^• / mU4S jn[        U5      nUR                  5         U R                  TS/5        g )Nc                  ób   >• T R                  [        [        R                  " 5       S5      5        g rM   )r"   Úhasattrr   r   )Úhas_runs   €r   ÚfuncÚ;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcÃ  s"   ø€ Ø�N‰NÜœ×+Ò+Ó-¨uÓ5õr   Frù   )rE   r/  r1   r.  s      @r   Ú test_running_greenlet_has_no_runÚ-TestGreenlet.test_running_greenlet_has_no_runÁ  s4   ø€ Øˆõ	ô
 ˜ÓˆØ	�‰Œ
Ø×Ñ˜ 5 'Õ*r   c                 ó°   • SS K nU R                  [        UR                   [        5       5        U R                  [        UR                  [        5       5        g r   )ÚcopyrO   r(  r0   Údeepcopy)rE   r4  s     r   Útest_deepcopyÚTestGreenlet.test_deepcopyÌ  s5   € ÛØ×Ñœ) T§Y¡Y´³Ô>Ø×Ñœ) T§]¡]´K³MÕBr   c                 ó2  ^^^• [        S 5      m[        R                  " 5       m/ mUUU4S jn[        UTS9nUR                  5         AU R	                  T5        U R                  TS   T5        U R                  TS   R                  T5        TS S 2	 S mS mg )Nc                  ó   • g r*   r   r   r   r   rí   Ú;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>Ò  s   €  $r   c                  ó   >•  TR                  5         g ! [        R                   ae    TR                  [        R                  " 5       R
                  5        TR                  [        R                  " 5       5        T R                  5          g f = fr*   )r!   r   r¾   r"   r   r    )ÚhubÚmainÚresults   €€€r   ÚworkerÚ9TestGreenlet.test_parent_restored_on_kill.<locals>.workerÕ  s_   ø€ ðà—‘•øÜ×(Ñ(ó à—‘œh×1Ò1Ó3×:Ñ:Ô;Ø—‘œh×1Ò1Ó3Ô4Ø—
‘
–ð	ús   ƒ ”A6BÂBr.   r   r   )r0   r   r   r!   rá   r]   r    )rE   r?  r1   r<  r=  r>  s      @@@r   Útest_parent_restored_on_killÚ)TestGreenlet.test_parent_restored_on_killÑ  sˆ   ú€ Ü™,Ó'ˆÜ×"Ò"Ó$ˆØˆ÷	ô ˜ sÑ+ˆØ	�‰Œ
àØ�‰˜ÔØ�‰�f˜Q‘i Ô&Ø�‰�f˜Q‘i×&Ñ&¨Ô,ð ’1ˆIØˆØ‰r   c                 ó¬   • [        5       n[        S US9nU R                  [        5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nc                  ó   • g r*   r   r   r   r   rí   Ú9TestGreenlet.test_parent_return_failure.<locals>.<lambda>ð  ó   €  r   r.   )r0   rO   rP   r!   )rE   r2   rµ   s      r   Útest_parent_return_failureÚ'TestGreenlet.test_parent_return_failureì  s8   € ä‹]ˆä™¨bÑ1ˆà×Ñœ~Õ.Ø�I‰IŒK÷ /×.Ö.ús   «AÁ
Ac                 ó†   •  " S S[         5      nU" S 5      nU R                  [        UR                  [        5       5        g )Nc                   ó   • \ rS rSrS rSrg)Ú>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletiö  c                 óJ   •  [         e!    O= f[        R                  " X5      $ r*   )Ú	Exceptionr0   Ú__getattribute__©rE   Únames     r   rN  ÚOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__÷  s'   € ðÜ#�OøðÙúÜ"×3Ò3°DÓ?Ð?s   ‚ ˆr   N©r   r   r   r   rN  r   r   r   r   Ú
mygreenletrK  ö  s   † õ@r   rS  c                  ó   • g r*   r   r   r   r   rí   Ú<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>ý  ó   € ˜tr   )r0   rO   r   rX   )rE   rS  r1   s      r   Útest_throw_exception_not_lostÚ*TestGreenlet.test_throw_exception_not_lostõ  s4   € ô	@œô 	@ñ ‘|Ó$ˆØ×Ñœ) Q§W¡W¬i«kÕ:r   c                 ó  ^^^• / mS mUUU4S jn[         R                  " US9nUR                  5         UR                  S5        AT(       a  U R	                  5         U R                  [        R                  5       nTS   R                  [        5        S S S 5        T(       d6  [        WR                  5      nU R                  US:H  =(       d    SU;   5        O%U R                  [        WR                  5      S5        [        TS   R                  S5      (       a;  U R                  [         5         TS   R                  R#                  5         S S S 5        T(       dP  [        TS   R                  R$                  S5      (       a'  TS   R                  R$                  R#                  5         OU R'                  TS   R                  5        AS mTS S 2	 S	U l        g ! , (       d  f       GNO= f! , (       d  f       N¥= f)
Nc                  ó^   • [         R                  " 5       R                  R                  5         g r*   rŽ   r   r   r   r?  ÚGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.worker  ó   € Ü×ÒÓ!×(Ñ(×/Ñ/Õ1r   c                  ó¸   >• [        T5      n U R                  5         TR                  U 5        T(       a&  U R                  5         [        R                  " 5         g g r*   )r0   r!   r"   r   r   )r1   r>  Úwait_for_cleanupr?  s    €€€r   ÚcreatorÚHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creator  s?   ø€ Ü˜FÓ#ˆAØ�H‰HŒJØ�M‰M˜!ÔÞà—‘”
Ü×#Ò#Õ%ð  r   r€   r   r   úBcannot switch to a different thread (which happens to have exited)zCannot switchr  T)r‚   rƒ   r„   r…   Úwait_for_pending_cleanupsrO   r   r˜   rX   r   rR   rS   rá   rB   r-  râ   ÚRuntimeErrorr  Úf_localsrb   Úexpect_greenlet_leak)rE   r^  r_  rª   r+   Úsr>  r?  s    `    @@r   Ú*_do_test_throw_to_dead_thread_doesnt_crashÚ7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crash   sŽ  ú€ àˆò	2÷	&ô ×Ò GÑ,ˆØ	�‰Œ	Ø	�‰ˆrŒ
Øö Ø×*Ñ*Ô,Ø×ÑœxŸ~™~Ô.°#Ø�1‰I�O‰OœIÔ&÷ /ö  Ü�C—M‘MÓ"ˆAØ�O‰OØÐYÑY÷ (Ø" aÑ'õð
 ×ÑÜ�C—M‘MÓ"ØTôô
 �6˜!‘9×%Ñ% w×/Ñ/à×"Ñ"¤<Õ0Ø�q‘	×"Ñ"×(Ñ(Ô*÷ 1ö  ä�v˜a‘y×)Ñ)×2Ñ2°G×<Ñ<Ø�q‘	×"Ñ"×+Ñ+×1Ñ1Ô3øà×Ñ˜f Q™i×0Ñ0Ô1àØˆØ’1ˆIð %)ˆÕ!÷C /Ö.ú÷" 1Õ0ús   Á=GÄ3G0Ç
G-Ç0
G>Nr?   )r9   r   z;does not leaks on Windows 3.10, but does on other platformsc                 ó$   • U R                  5         g r*   ©rg  rI   s    r   Ú&test_throw_to_dead_thread_doesnt_crashÚ3TestGreenlet.test_throw_to_dead_thread_doesnt_crash:  s   € ð 	×7Ñ7Õ9r   c                 ó&   • U R                  S5        g r|   rj  rI   s    r   Ú+test_throw_to_dead_thread_doesnt_crash_waitÚ8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitB  s   € Ø×7Ñ7¸Õ=r   c                 ó€   •  " S S[         5      nU" 5       nU R                  UR                  S5      S5        SU l        g )Nc                   ó&   • \ rS rSrS rS rS rSrg)Ú7TestGreenlet.test_recursive_startup.<locals>.convolutediG  c                 ó>   • [         R                  " U 5        SU l        g r   )r0   Ú__init__ÚcountrI   s    r   rt  Ú@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__H  s   € Ü×$Ò$ TÔ*Ø�•
r   c                 óŠ   • US:X  a(  U R                   S:X  a  SU l         U R                  S5        [        R                  " X5      $ )NrN   r   r   é+   )ru  r!   r0   rN  rO  s     r   rN  ÚHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__K  s6   € Ø˜5“= T§Z¡Z°1£_Ø!"�D”JØ—K‘K ”OÜ"×3Ò3°DÓ?Ð?r   c                 ó>   •  U R                   R                  U5        M  r*   ©r    r!   )rE   r¶   s     r   rN   Ú;TestGreenlet.test_recursive_startup.<locals>.convoluted.runP  s   € ØØ—K‘K×&Ñ& uÔ-ñ r   )ru  N)r   r   r   r   rt  rN  rN   r   r   r   r   Ú
convolutedrr  G  s   † òò@õ
.r   r}  r÷   rx  T)r0   rB   r!   re  )rE   r}  r1   s      r   Útest_recursive_startupÚ#TestGreenlet.test_recursive_startupE  s9   € ô	.œô 	.ñ ‹LˆØ×Ñ˜Ÿ™ "› rÔ*ð
 %)ˆÕ!r   c                 óT  ^^^• [         R                  " 5       mTR                  5         [         R                  " 5       mTR                  5          " UU4S jS[        5      nS nUUU4S jn[        R
                  " 5       n[        U5      /mU" 5       TS   l        TS   R                  5         [         R                  " US9nUR                  5         TR                  5         TR                  5         U R                  [        R
                  " 5       U5        UR                  S5        g )Nc                   ó$   >• \ rS rSrU U4S jrSrg)Ú;TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedib  c                 óF   >• TR                  5         TR                  5         g r*   ©ÚreleaseÚacquire)rE   Úlock1Úlock2s    €€r   Ú__del__ÚCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__c  s   ø€ ð —‘”Ø—‘•r   r   N©r   r   r   r   r‰  r   ©r‡  rˆ  s   €€r   Ú	finalizedr‚  b  s   ø† ÷ ñ  r   r�  c                  ó^   • [         R                  " 5       R                  R                  5         g r*   rŽ   r   r   r   ÚdeallocatorÚ=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorj  r\  r   c                  óà   >• TR                  5         [        R                  " 5         T S	 TR                  5         TR                  5         [        R                  " 5         TR                  5         g r   ©r†  r   r   r…  )r1   r‡  rˆ  s   €€€r   ÚfthreadÚ9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadl  sF   ø€ Ø�M‰MŒOÜ×ÒÔ!Ø�!�Ø�M‰MŒOØ�M‰MŒOÜ×ÒÔ!Ø�M‰M�Or   r   r€   r   )r‚   ÚLockr†  Úobjectr   r   r0   Úbombr!   rƒ   r„   r…  rB   r…   )	rE   r�  r�  r“  r=  rª   r1   r‡  rˆ  s	         @@@r   Útest_threaded_updatecurrentÚ(TestGreenlet.test_threaded_updatecurrent[  sÐ   ú€ ä—’Ó ˆØ�‰Œä—’Ó ˆØ�‰Œ÷	 ð 	 œô 	 ò	2÷	ô ×"Ò"Ó$ˆÜ˜Ó%Ð&ˆÙ“Kˆˆ!‰Œ	Ø	ˆ!‰�‰ŒÜ×Ò GÑ,ˆØ	�‰Œ	à�‰ŒØ�‰Œð 	×Ñœ×,Ò,Ó.°Ô5à	�‰ˆr�
r   c                 óæ   ^^^• / mUUU4S jmS m[        T5      /mTS   R                  5         [        TTS   5      mTR                  5       nU R                  T5        U R                  US5        g )Nc                  ó¦  >• [         R                  " 5       R                  R                  5       n TS	 [         R                  " 5       R                  Tl         [         R                  " 5       R                  R                  U 5        TR	                  [         R                  " 5       5        g ! TR	                  [         R                  " 5       5        f = fr   )r   r   r    r!   r"   )r¶   Ú	initiatorr&   r?  s    €€€r   r?  Ú>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.workerŒ  s‹   ø€ ä×'Ò'Ó)×0Ñ0×7Ñ7Ó9ˆEà�q�	Ü'×2Ò2Ó4×;Ñ;ˆIÔð3Ü×#Ò#Ó%×,Ñ,×3Ñ3°EÔ:à—‘œH×/Ò/Ó1Õ2ø�—‘œH×/Ò/Ó1Õ2ús   Á.B* Â*&Cc                  ó   • gr  r   r   r   r   rœ  ÚATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiator™  ó   € Ør   r   r÷   )r0   r!   rá   rB   )rE   r¶   rœ  r&   r?  s     @@@r   Ú!test_dealloc_switch_args_not_lostÚ.TestGreenlet.test_dealloc_switch_args_not_lostŠ  sk   ú€ Øˆ÷	3ò	ô ˜fÓ%Ð&ˆàˆq‰	×ÑÔÜ 	¨6°!©9Ó5ˆ	Ø× Ñ Ó"ˆØ�‰˜ÔØ×Ñ˜ Õ#r   c                 ó´   ^^^• S m " S S[         5      nU" 5       m[        SS9mUUU4S jn[        U5      nU R                  UR	                  5       T5        g )Nc                 ó   • U " U0 UD6  g r*   r   )r/  rt   Úks      r   Ú_applyÚ0TestGreenlet.test_tuple_subclass.<locals>._apply²  s   € Ù�!ˆM�q‹Mr   c                   ó   • \ rS rSrS rSrg)Ú1TestGreenlet.test_tuple_subclass.<locals>.mytupleiµ  c                 ór   • [         R                  " 5       R                  5         [        R	                  U 5      $ r*   )r   r   r!   ÚtupleÚ__len__rI   s    r   r¬  Ú9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__¶  s&   € Ü×#Ò#Ó%×,Ñ,Ô.Ü—}‘} TÓ*Ð*r   r   N)r   r   r   r   r¬  r   r   r   r   Úmytupler©  µ  s   † õ+r   r®  r÷   )rt   c                  óh   >• T " [         R                  " 5       R                  R                  TT5        g r*   rŽ   )r¦  rŸ   Úkwargss   €€€r   ÚswitchapplyÚ5TestGreenlet.test_tuple_subclass.<locals>.switchapply»  s$   ø€ Ù”8×&Ò&Ó(×/Ñ/×6Ñ6¸¸fÕEr   )r«  Údictr0   rB   r!   )rE   r®  r±  r1   r¦  rŸ   r°  s       @@@r   Útest_tuple_subclassÚ TestGreenlet.test_tuple_subclass¤  sL   ú€ ò	ô	+”eô 	+ñ ‹yˆÜ˜‘ˆ÷	Fä˜Ó$ˆØ×Ñ˜Ÿ™› VÕ,r   c                 ó¦   • [        S[        4S[        S 5      05      n " S SU5      n " S SU5      nU" 5         U R                  [        U5        g )NÚAbstractSubclassrN   c                 ó   • g r*   r   rI   s    r   rí   Ú7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>Ä  s   € °r   c                   ó   • \ rS rSrSrg)Ú:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassiÆ  r   Nr   r   r   r   ÚBadSubclassr»  Æ  ó   † Úr   r¼  c                   ó   • \ rS rSrS rSrg)Ú;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassiÉ  c                 ó   • g r*   r   rI   s    r   rN   Ú?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runÊ  s   € Ør   r   N)r   r   r   r   rN   r   r   r   r   ÚGoodSubclassr¿  É  s   † õr   rÂ  )r   r0   r   rO   r(  )rE   r·  r¼  rÂ  s       r   Útest_abstract_subclassesÚ%TestGreenlet.test_abstract_subclassesÀ  sT   € Ü"ØÜˆNØ”NÑ#4Ó5Ð6ó8Ðô
	Ð*ô 	ô	Ð+ô 	ñ 	ŒØ×Ñœ) [Õ1r   c                 óÊ   ^ ^• [         R                  " 5       (       d  g [         R                  " 5       S   mTS:  a  g UU 4S jn[        S5       H  nU" 5       (       d  M    g    g )Nr   é2   c                  ó$  >^	^
^^• [         R                  " 5       m
T
R                  5         [         R                  " 5       mTR                  5         S/mU
U4S jn [         R                  " U S9nUR	                  5          " U
UU4S jS[
        5      m	 " U	4S jS[
        5      n/ n[        TS-  5      n[        R                  " 5       nU" 5       nU HI  nS nTS	   (       a  UR                  S
5          g[        5       nTS	   (       a    OFUR                  U5        MK     [        R                  " 5         TS	   (       a  UR                  S
5        gTR                  UR                  U5        U H  nTR                  UR                  U5        M!     g)NFc                  óp   >• T R                  5         [        R                  " 5         TR                  5         g r*   r’  rŒ  s   €€r   Úanother_threadÚWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadÜ  s!   ø€ Ø—‘”Ü×#Ò#Ô%Ø—‘•r   r€   c                   ó&   >• \ rS rSrU UU4S jrSrg)ÚTTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackiâ  c                 óP   >• TR                  5         TR                  5         STS'   g )NTr   r„  )rE   r‡  rˆ  Úrecycleds    €€€r   r‰  Ú\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__ã  s   ø€ Ø—M‘M”OØ—M‘M”OØ"&�H˜Q’Kr   r   Nr‹  )r‡  rˆ  rÎ  s   €€€r   Úgc_callbackrÌ  â  s   ø† ÷'ò 'r   rÐ  c                   ó"   >• \ rS rSrU 4S jrSrg)ÚPTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbageiç  c                 ó*   >• X l         T" 5       U l        g r*   )ÚcycleÚcallback)rE   rÐ  s    €r   rt  ÚYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__è  s   ø€ Ø!%”JÙ$/£M�D•Mr   )rÕ  rÔ  N)r   r   r   r   rt  r   )rÐ  s   €r   ÚgarbagerÒ  ç  s   ø† ÷2ð 2r   r×  r?   r   r   T)r‚   r•  r†  rƒ   r„   r–  rD   r   r   r…   r0   r"   r¯   r°   rB   r    )rÉ  rª   r×  Úlrì   Úcurrentr1   r§   ÚlastrÐ  r‡  rˆ  rÎ  ÚNrE   s            @@@@€€r   ÚattemptÚ?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptÖ  s/  ü€ Ü—N’NÓ$ˆEØ�M‰MŒOÜ—N’NÓ$ˆEØ�M‰MŒOØ�wˆHö ô × Ò ¨Ñ7ˆAØ�G‰GŒI÷'ñ 'œfô '÷
2œ&ô 2ð ˆAÜ�a˜‘c“
ˆAÜ×)Ò)Ó+ˆGÙ“	ˆAÛ�Ø�Ø˜A—;à—F‘F˜2”JÙ Ü"“}�Ø˜A—;ÙØ—‘˜–ñ ô —
’
”Ø˜A—;Ø—F‘F˜2”JØØ×Ñ˜TŸ[™[¨'Ô2Û�Ø× Ñ  §¡¨7Ö3ñ àr   rA   )r¯   Ú	isenabledÚget_thresholdrD   )rE   rÜ  r§   rÛ  s   `  @r   Ú!test_implicit_parent_with_threadsÚ.TestGreenlet.test_implicit_parent_with_threadsÐ  sN   ù€ Ü�|Š|�~‰~ØÜ×ÒÓ˜qÑ!ˆØˆr‹6Øö,	ôZ �q–ˆAÙ�y‹yÙò r   c                 óŽ  ^ ^^• SSK Jm  SSK Jm   " S S[        5      n[        R
                  " U5      n/ T l        UUU 4S jn[        S5       H  nU" U5      R                  5         M     T ?[        (       a'  T R                  [        R
                  " U5      U5        g T R                  [        R
                  " U5      U5        g )Nr   ©r   )r¾   c                   ó   • \ rS rSrSrg)ÚTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.Greenleti  r   Nr   r   r   r   ÚGreenletrå    r½  r   ræ  c                  óž   >•  T" 5       R                   R                  5         g ! T  a#    TR                  R                  T" 5       5         g f = fr*   )r    r!   Úgletsr"   )r¾   r   rE   s   €€€r   Úgreenlet_mainÚYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_main  s?   ø€ ð0Ù“×#Ñ#×*Ñ*Õ,øØó 0Ø—
‘
×!Ñ!¡*£,Ö/ð0ús   ƒ# £&AÁAr   )r   r   r¾   r0   r#   rw   rè  rD   r!   r   ÚassertGreaterEqualrB   )rE   ræ  Úinitial_refsré  r§   r¾   r   s   `    @@r   Ú5test_issue_245_reference_counting_subclass_no_threadsÚBTestGreenlet.test_issue_245_reference_counting_subclass_no_threads  s—   ú€ õ 	(Ý)ô	”{ô 	ô —’ xÓ0ˆð ˆŒ
÷	0ô �r–ˆAÙ�]Ó#×*Ñ*Ö,ñ ð ˆJß&Ò&ð ×#Ñ#¤C§O¢O°HÓ$=¸|ÕLà×ÑœSŸ_š_¨XÓ6¸ÕEr   z;The manylinux images appear to hang on this test on 3.13rc2c                 ó"  ^^^^^• SSK Jn  SSK Jn  SSKJm   " S S[
        5      m/ mU" 5       mU4S jmUUUUU4S jn[        R                  " T5      n/ nUS	-   n[        (       a  S
n[        U5       H2  nU" 5       nU" X84S9n	UR                  U5        U	R                  5         M4     U H  n
U
R                  S5        M     TS S 2	 TR                  5         U R                  5         U R                  [        R                  " T5      U5        g )Nr   )rƒ   )r    rã  c                   ó   • \ rS rSrSrg)ÚSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenleti?  r   Nr   r   r   r   Ú
MyGreenletrñ  ?  r½  r   rò  c                  óD   >• T " 5       R                   R                  5         g r*   r{  rã  s   €r   ré  ÚVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainE  s   ø€ Ù‹L×Ñ×&Ñ&Õ(r   c                 óª   >• T" T5      nTR                  U5        UR                  5         AU R                  5         TR                  S5        T" 5         g )Nr   )r"   r!   r£   r‘   )Úgreenlet_running_eventÚminerò  r   rè  ré  Úref_cleareds     €€€€€r   Úthread_mainÚTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainH  sH   ø€ Ù˜mÓ,ˆDØ�L‰L˜Ôà�K‰KŒMàà"×&Ñ&Ô(ð ×Ñ˜RÔ ñ �Lr   é-   rÆ  rž   r   )r‚   rƒ   r    r   r   r0   r#   rw   r   rD   r"   r„   r‘   r£   rb  rB   )rE   rƒ   r    rù  rì  Úthread_ready_eventsr¤   r§   Úeventr  r  rò  r   rè  ré  rø  s              @@@@@r   Ú2test_issue_245_reference_counting_subclass_threadsÚ?TestGreenlet.test_issue_245_reference_counting_subclass_threads1  sï   ü€ õ 	%Ý#å'ô	œô 	ð ˆÙ“gˆõ	)÷	ñ 	ô8 —’ zÓ2ˆØ ÐØ# bÑ(ˆß&Ò&ð ˆLÜ�|Ö$ˆAÙ“GˆEÙ ;°XÑ>ˆFØ×&Ñ& uÔ-Ø�L‰LŽNñ	 %ó .ˆJØ�O‰O˜BÖñ .ð ’!ˆHØ�‰Ôð 	×&Ñ&Ô(Ø×ÑœŸš¨Ó4°lÕCr   c                 óº   • S n[        U5      nS n[        X25      nU R                  [        5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nc                  ó   • g)Né   r   r   r   r   Úno_argsÚ\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_args  r   r   c                  ó   • gr  r   r   r   r   ÚleafÚYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf„  r   r   )r0   rO   r(  r!   )rE   r  Úparent_never_startedr  Úchilds        r   Ú>test_falling_off_end_switches_to_unstarted_parent_raises_errorÚKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error~  sJ   € ò	ô  +¨7Ó3Ðò	ô ˜DÓ7ˆð ×ÑœyÕ)Ø�L‰LŒN÷ *×)Ö)ús   ²AÁ
Ac                 ó€   • S n[        U5      nS n[        X25      nUR                  5       nU R                  US5        g )Nc                 ó
   • U S4$ ©Né   r   rë   s    r   Úone_argÚUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_argŽ  s   € Ø�r�7ˆNr   c                  ó   • gr  r   r   r   r   r  ÚRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf“  r   r   )r÷   r  rù   )rE   r  r  r  r	  r>  s         r   Ú7test_falling_off_end_switches_to_unstarted_parent_worksÚDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works�  s@   € ò	ô  +¨7Ó3Ðò	ô ˜DÓ7ˆà—‘“ˆØ×Ñ˜ Õ*r   c                 óž  ^•  " S S[         5      nU" 5       n/ m[        U4S jU5      nU R                  [        5         UR                  5         S S S 5        U R	                  TS/5        U R                  [        5         UR                  5         S S S 5        U R	                  TS/5        g ! , (       d  f       Nc= f! , (       d  f       N3= f)Nc                   ó   • \ rS rSrS rSrg)ÚXTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentiœ  c                 ó   • US:X  a  [         eg rM   )r   rO  s     r   rN  ÚiTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__�  s   € Ø˜5“=Ü#�Oð !r   r   NrR  r   r   r   ÚParentr  œ  s   † õ$r   r  c                  ó&   >• T R                  S5      $ r  rÅ   r%   s   €r   rí   ÚZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>¤  ó   ø€  D§K¡K°¤Or   r÷   )r0   rO   r   r!   rB   )rE   r  r  r	  r&   s       @r   Ú;test_switch_to_dead_greenlet_with_unstarted_perverse_parentÚHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent›  sž   ø€ ô	$”[ô 	$ñ  &›xÐØˆÜÔ3Ð5IÓJˆð ×ÑœyÕ)Ø�L‰LŒN÷ *ð 	×Ñ˜ ˜tÔ$à×ÑœyÕ)Ø�L‰LŒN÷ *à×Ñ˜ ˜tÕ$÷ *Õ)ú÷
 *Õ)ús   ¿B-Â B>Â-
B;Â>
Cc                 ó  ^• / m[        U4S j5      n[        U4S j5      nUR                  5         U R                  TS/5        Xl        UR                  5       nU R	                  U5        U R                  TSS/5        g )Nc                  ó&   >• T R                  S5      $ r  rÅ   r%   s   €r   rí   ÚDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>²  s   ø€ °4·;±;¸r´?r   c                  ó&   >• T R                  S5      $ r  rÅ   r%   s   €r   rí   r#  ³  r  r   r÷   r  )r0   r!   rB   r    rb   )rE   r  r	  r>  r&   s       @r   Ú%test_switch_to_dead_greenlet_reparentÚ2TestGreenlet.test_switch_to_dead_greenlet_reparent°  sl   ø€ ØˆÜ*Ô+BÓCÐÜÔ3Ó4ˆà�‰ŒØ×Ñ˜ ˜tÔ$à+Œà—‘“ˆØ×Ñ˜&Ô!Ø×Ñ˜  B˜xÕ(r   c                 ój  ^^• [         R                  " 5       mU4S jnU4S jm[        U5      nUR                  5         [        S 5      nUR                  5         U R	                  UR
                  5        U R                  UR
                  R                  R                  S5        U R	                  UR
                  R                  5        U R                  UR
                  R                  R                  R                  S5        U R                  UR
                  R                  R                  5        g )Nc                  ó   >• T " 5         g r*   r   ©Úinners   €r   ÚouterÚHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.outerÄ  s   ø€ Ù�Gr   c                  óP   >• T R                  [        R                  " S5      5        g r   )r!   r#   rÝ   ©r=  s   €r   r*  ÚHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.innerÇ  s   ø€ Ø�K‰KœŸš aÓ(Õ)r   c                  ó   • g r*   r   r   r   r   rí   ÚKTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.<lambda>Ð  ó   € ¨r   r*  r+  )r   r   r0   r!   r\   râ   rB   Úf_codeÚco_namerÞ   rb   )rE   r+  r<  Ú	unrelatedr*  r=  s       @@r   Ú,test_can_access_f_back_of_suspended_greenletÚ9TestGreenlet.test_can_access_f_back_of_suspended_greenlet¾  sÚ   ù€ ô ×"Ò"Ó$ˆõ	õ	*ô ˜%Ó ˆà�
‰
Œô  ¡Ó-ˆ	Ø×ÑÔð 	×Ñ˜SŸ\™\Ô*Ø×Ñ˜Ÿ™×,Ñ,×4Ñ4°gÔ>Ø×Ñ˜SŸ\™\×0Ñ0Ô1Ø×Ñ˜Ÿ™×,Ñ,×3Ñ3×;Ñ;¸WÔEà×Ñ˜#Ÿ,™,×-Ñ-×4Ñ4Õ5r   c                 ó²  ^^^• SSK Jm  SSKJm  UUU4S jm[	        T5      nUR                  S5        UR                  n[        S5       H.  nU R                  UR                  S   U5        UR                  nM0     U R                  UR                  S   S5        U R                  UR                  5        U R                  UR                  S5      S	5        g )
Nr   )Úpartialr   )Ú_test_extension_cppc                 ó¦   >• U S:”  a  U TR                  T" TU S-
  5      5      -  $ [        R                  " 5       R                  R	                  5       $ )Nr   r   )Ú	test_callr   r   r    r!   )Úvr:  r9  Úrecurses    €€€r   r>  Ú@TestGreenlet.test_get_stack_with_nested_c_calls.<locals>.recurseß  sJ   ø€ Ø�1‹uØÐ.×8Ñ8¹ÀÈ!ÈaÉ%Ó9PÓQÑQÐQÜ×&Ò&Ó(×/Ñ/×6Ñ6Ó8Ð8r   rA   r=  r   i°  )Ú	functoolsr9  Ú r:  r0   r!   râ   rD   rB   rd  rÞ   rb   )rE   Úgrrä   r†   r:  r9  r>  s       @@@r   Ú"test_get_stack_with_nested_c_callsÚ/TestGreenlet.test_get_stack_with_nested_c_callsÛ  s£   ú€ Ý%Ý)÷	9ô
 ˜Ó!ˆØ
�	‰	�!ŒØ—‘ˆÜ�q–ˆAØ×Ñ˜UŸ^™^¨CÑ0°!Ô4Ø—L‘LŠEñ ð 	×Ñ˜Ÿ™¨Ñ,¨aÔ0Ø×Ñ˜%Ÿ,™,Ô'Ø×Ñ˜Ÿ™ 2›¨Õ-r   c                 ó:  ^^• [         R                  " 5       mU4S jnU4S jm[        U5      nUR                  5       n[        S 5      nUR                  5         U R	                  UR
                  R                  S5        U R                  UR                  5        g )Nc                  ó>   >• T " [         R                  " S5      5        g r   )r#   rÝ   r)  s   €r   r+  Ú6TestGreenlet.test_frames_always_exposed.<locals>.outerô  s   ø€ Ù”#—-’- Ó"Õ#r   c                 ó(   >• TR                  U 5        g r*   ©r!   )rä   r=  s    €r   r*  Ú6TestGreenlet.test_frames_always_exposed.<locals>.inner÷  s   ø€ Ø�K‰K˜Õr   c                  ó   • g r*   r   r   r   r   rí   Ú9TestGreenlet.test_frames_always_exposed.<locals>.<lambda>ÿ  r2  r   r+  )	r   r   r0   r!   rB   r3  r4  rb   rÞ   )rE   r+  rB  rä   r5  r*  r=  s        @@r   Útest_frames_always_exposedÚ'TestGreenlet.test_frames_always_exposedî  sx   ù€ ô ×"Ò"Ó$ˆõ	$õ	ô ˜ÓˆØ—	‘	“ˆô  ¡Ó-ˆ	Ø×ÑÔà×Ñ˜Ÿ™×-Ñ-¨wÔ7à×Ñ˜%Ÿ,™,Õ'r   c                 ó¶   ^^^^• U4S jmU4S jmUU4S jnU4S jn[         R                   " U5      m[         R                   " U5      mTR                  5         g )Nc                 ó(   >• TR                  5         U $ r*   rI  )rì   rµ   s    €r   Úk1ÚITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k1  ó   ø€ Ø�I‰IŒKØˆHr   c                 ó(   >• TR                  5         U $ r*   rI  )rì   r2   s    €r   Úk2ÚITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k2  rS  r   c                  ó<   >• [        S/TS9  T R                  5         g )Nr   ©Úkey)Úsortedr!   )rµ   rQ  s   €€r   Úg1_bodyÚNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g1_body  s   ø€ Ü�A�3˜BÒØ�I‰I�Kr   c                  óŽ   >• [        S/TS9  [        [        SSS9 n U R                  5         S S S 5        g ! , (       d  f       g = f)Nr   rX  Úrtzutf-8)Úencoding)rZ  ÚopenÚ__file__Úread)r=   rU  s    €r   Úg2_bodyÚNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g2_body"  s4   ø€ Ü�A�3˜BÒô ”h ¨wÒ7¸1Ø—‘”÷ 8×7Ö7ús	   œ6¶
A)r   r!   )rE   r[  rc  r2   rµ   rQ  rU  s      @@@@r   Ú0test_switching_holding_critical_section_no_crashÚ=TestGreenlet.test_switching_holding_critical_section_no_crash  sB   û€ õ	õ
	ö
	õ
	ô ×Ò˜wÓ'ˆÜ×Ò˜wÓ'ˆØ
�	‰	�r   )re  rè  )F)>r   r   r   r   rF   rJ   rU   rY   r_   rc   rm   rx   r‰   r   r±   r·   r»   r¿   rÎ   ÚunittestÚskipIfr	   r   rØ   ræ   ró   rú   r   r  r  r)  r1  r6  rA  rG  rW  r   rg  r   r   r#   Úversion_infork  rn  r   r~  r˜  r¡  r´  rÃ  rà  rí  rþ  r
  r  r  r%  r6  rC  rM  re  r   r   r   r   r5   r5   8   s¦  † ò.òò1ò1ò7ò
!ò
'ò(Dò,1ð ñ=ó ð=ò~,ò8+òOòIð0 ‡_‚_Ø×&Ð&ØGóñ5óð5òn+ò 	ò ò-òò& ò5ò"	+òCò
ò6ò	;ð &ó7)ó &ð7)ðr &ÙØ×/�× Ñ   !Ð$¨Ñ/ØEóñ:ó	ó &ð
:ò>ð ñ)ó ð)ò*-ò^$ò4-ò82ò 5òn(FðT ‡_‚_Ø×&Ð&ØEóñDDóðDDòLò+ò%ò*)ò6ò:.ò&(õ0&r   r5   c                   óP   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rSrg)ÚTestGreenletSetParentErrorsi/  c                 ó  ^^^• 0 m[         R                  " 5       m[         R                  " 5       mUUU4S jnS n[         R                  " US9nUR                  5         TR	                  S5        [        U5      nUR                  5         U R                  [        5       nTS   Ul	        S S S 5        TR                  5         UR                  S5        U R                  [        WR                  5      S5        g ! , (       d  f       NU= f)Nc                  óf   >• [        S 5      TS'   T R                  5         TR                  S5        g )Nc                  ó   • g r*   r   r   r   r   rí   ÚQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>6  r  r   r1   r   r  r  s   €€€r   rN   Ú?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.run5  r  r   c                  ó^   • [         R                  " 5       R                  R                  5         g r*   rŽ   r   r   r   ÚblankÚATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blank:  r\  r   r€   r   r1   z&parent cannot be on a different thread)r‚   r    rƒ   r„   r‘   r0   r!   rO   r  r    r£   r…   rB   rR   rS   )	rE   rN   rr  r  r1   r+   r	  r
  r  s	         @@@r   Útest_threaded_reparentÚ2TestGreenletSetParentErrors.test_threaded_reparent0  s¾   ú€ ØˆÜ!ŸšÓ)ˆÜ—_’_Ó&ˆ
÷	 ò
	2ô ×!Ò!¨Ñ-ˆØ�‰ŒØ×Ñ˜2ÔÜ˜ÓˆØ	�‰Œ
Ø×ÑœzÔ*¨cØ˜C‘yˆAŒH÷ +à�‰ÔØ�‰�BŒà×Ñœ˜SŸ]™]Ó+Ð-UÕV÷ +Õ*ús   Â C:Ã:
Dc                 óÔ  ^• / mU4S jn[         R                  " US9nUR                  5         UR                  S5        U R	                  U R
                  S-   S9   " U4S jS[        5      nU" S 5      nU R                  [        R                  5       nUR                  5         S S S 5        U R                  [        WR                  5      S	5        TS S 2	 g ! , (       d  f       N9= f)
Nc                  ó`   >• [        S 5      n TR                  U 5        U R                  5         g )Nc                  ó   • g r*   r   r   r   r   rí   ÚYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>L  ó   €  Dr   )r0   r"   r!   )r1   Úanothers    €r   r?  ÚGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerK  s"   ø€ Ü™LÓ)ˆAØ�N‰N˜1ÔØ�H‰H�Jr   r€   r   r   )Úinitial_main_greenletsc                   ó"   >• \ rS rSrU 4S jrSrg)ÚKTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedif  c                 óP   >• US:X  a
  TS   U l         [        R                  " X5      $ ©NrN   r   ©r    r0   rN  ©rE   rP  r{  s     €r   rN  Ú\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__g  ó&   ø€ Ø˜5“=Ø")¨!¡*�D”KÜ"×3Ò3°DÓ?Ð?r   r.   NrR  ©r{  s   €r   r}  r  f  ó   ø† ÷@ð @r   r}  c                  ó   • g r*   r   r   r   r   rí   ÚITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>k  rV  r   ra  )r‚   rƒ   r„   r…   rb  Úmain_greenlets_before_testr0   rO   r   r˜   r!   rB   rR   rS   )rE   r?  rª   r}  r1   r+   r{  s         @r   Útest_unexpected_reparentingÚ7TestGreenletSetParentErrors.test_unexpected_reparentingI  s»   ø€ Øˆõ	ô ×Ò FÑ+ˆØ	�‰Œ	Ø	�‰ˆrŒ
ð& 	×&Ñ&¸d×>]Ñ>]Ð`aÑ>aÐ&Ñb÷	@œô 	@ñ
 ‘|Ó$ˆØ×ÑœxŸ~™~Ô.°#Ø�H‰HŒJ÷ /à×Ñœ˜SŸ]™]Ó+Ø]ô	_à’A‰J÷	 /Õ.ús   ÂCÃ
C'c                 ó&  ^^^• / m[         R                  " 5       m[         R                  " 5       mUUU4S jn " U4S jS[        5      n[         R                  " US9nUR	                  5         TR                  S5         U" S 5      nU R                  [        R                  5       nUR                  5         S S S 5        U R                  S[        WR                  5      5        U R                  S[        UR                  5      5        U R                  S	[        UR                  5      5        TR                  5         UR                  S5        TS S 2	 g ! , (       d  f       N¤= f! TR                  5         UR                  S5        TS S 2	 f = f)
Nc                  ó¢   >• [        S 5      n TR                  U 5        U R                  5         TR                  5         TR	                  S5        g )Nc                  ó   • g r*   r   r   r   r   rí   ÚhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>y  rz  r   r   )r0   r"   r!   r£   r‘   )r1   r{  Úkeep_main_aliveÚswitched_to_greenlets    €€€r   r?  ÚVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerx  s<   ø€ Ü™LÓ)ˆAØ�N‰N˜1ÔØ�H‰HŒJØ ×$Ñ$Ô&Ø× Ñ  Õ$r   c                   ó"   >• \ rS rSrU 4S jrSrg)ÚZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedi~  c                 óP   >• US:X  a
  TS   U l         [        R                  " X5      $ r�  r‚  rƒ  s     €r   rN  ÚkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__  r…  r   r.   NrR  r†  s   €r   r}  r•  ~  r‡  r   r}  r€   r   c                  ó   • g r*   r   r   r   r   rí   ÚXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>‰  ó   €  4r   z#Cannot switch to a different threadÚExpectedÚCurrent)r‚   r    r0   rƒ   r„   r‘   rO   r   r˜   r!   rQ   rR   rS   r£   r…   )	rE   r?  r}  rª   r1   r+   r{  r‘  r’  s	         @@@r   Ú*test_unexpected_reparenting_thread_runningÚFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningr  s  ú€ ð ˆÜ(ŸšÓ0ÐÜ#Ÿ/š/Ó+ˆ÷	%÷	@œô 	@ô ×Ò FÑ+ˆØ	�‰Œ	à×!Ñ! "Ô%ð	Ù™<Ó(ˆAà×"Ñ"¤8§>¡>Ô2°cØ—‘”
÷ 3à�M‰MÐ?ÄÀSÇ]Á]ÓASÔTØ�M‰M˜*¤c¨#¯-©-Ó&8Ô9Ø�M‰M˜)¤S¨¯©Ó%7Ô8à×ÑÔ!Ø�F‰F�2ŒJàš‘
÷ 3Õ2ûð ×ÑÔ!Ø�F‰F�2ŒJàš‘
ús%   Â (E( Â(EÂ9A7E( Å
E%Å!E( Å((Fc                 ó&  • [        S 5      nU R                  UR                  [        R                  " 5       5        U R                  [        5       nU?S S S 5        U R                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nc                  ó   • g r*   r   r   r   r   rí   ÚGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>—  ó   €  Tr   úcan't delete attribute)
r0   r]   r    r   r   rO   rP   rB   rR   rS   )rE   r?  r+   s      r   Útest_cannot_delete_parentÚ5TestGreenletSetParentErrors.test_cannot_delete_parent–  sd   € Ü™\Ó*ˆØ�‰�f—m‘m¤X×%8Ò%8Ó%:Ô;à×Ñœ~Ô.°#Ø�÷ /à×Ñœ˜SŸ]™]Ó+Ð-EÕF÷ /Õ.ús   ÁBÂ
Bc                 óÖ   • U R                  [        5       n[        R                  " 5       ?S S S 5        U R                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nr£  ©rO   rP   r   r   r    rB   rR   rS   ©rE   r+   s     r   Ú!test_cannot_delete_parent_of_mainÚ=TestGreenletSetParentErrors.test_cannot_delete_parent_of_mainž  sI   € Ø×Ñœ~Ô.°#Ü×#Ò#Ó%Ð,÷ /à×Ñœ˜SŸ]™]Ó+Ð-EÕF÷ /Õ.ús   –AÁ
A(c                 ó`   • U R                  [        R                  " 5       R                  5        g r*   )rb   r   r   r    rI   s    r   Ú!test_main_greenlet_parent_is_noneÚ=TestGreenletSetParentErrors.test_main_greenlet_parent_is_none¤  s   € à×Ñœ(×-Ò-Ó/×6Ñ6Õ7r   c                 óÒ   ^ • S nU 4S jn[        U5      nT R                  U5        U" U5        UR                  5         T R                  U5        U" U5        UR                  5         g )Nc                  ó^   • [         R                  " 5       R                  R                  5         g r*   rŽ   r   r   r   ÚbgÚCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bg©  s   € ä×ÒÓ!×(Ñ(×/Ñ/Õ1r   c                 ó   >• S STS4 Hb  nTR                  [        5       nXl        S S S 5        TR                  [	        WR
                  5      S[        U5      R                  -   5        Md     g ! , (       d  f       NN= f)Nr   Ú42z4GreenletChecker: Expected any type of greenlet, not )rO   r(  r    rB   rR   rS   Útyper   )ÚgletÚpr+   rE   s      €r   ÚcheckÚFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check­  sg   ø€ Ø˜1˜d DÓ(�Ø×&Ñ&¤yÔ1°SØ"#”K÷ 2ð × Ñ Ü˜Ÿ™Ó&ØJÌTÐRSËW×M]ÑM]Ñ]ö_ò	 )ß1Õ1ús    A/Á/
A=	)r0   rã   r!   rá   )rE   r°  r·  r1   s   `   r   Útest_set_parent_wrong_typesÚ7TestGreenletSetParentErrors.test_set_parent_wrong_types¨  sW   ø€ ò	2õ	_ô ˜‹OˆØ×Ñ˜ÔÙˆaŒð 	
�‰Œ
Ø�‰˜ÔÙˆaŒð 	
�‰�
r   c                 óÐ   • [        S 5      nU R                  [        5       nXl        S S S 5        U R	                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nc                  ó   • g r*   r   r   r   r   rí   Ú@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>Å  rš  r   úcyclic parent chain)r0   rO   r  r    rB   rR   rS   )rE   rµ  r+   s      r   Útest_trivial_cycleÚ.TestGreenletSetParentErrors.test_trivial_cycleÄ  sI   € Ü™<Ó(ˆØ×ÑœzÔ*¨cØŒK÷ +à×Ñœ˜SŸ]™]Ó+Ð-BÕC÷ +Õ*ús   ¢AÁ
A%c                 ó  • U R                  [        5       n[        R                  " 5       [        R                  " 5       l        S S S 5        U R                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nz(cannot set the parent of a main greenletr§  r¨  s     r   Útest_trivial_cycle_mainÚ3TestGreenletSetParentErrors.test_trivial_cycle_mainÊ  sT   € à×Ñœ~Ô.°#Ü+3×+>Ò+>Ó+@ŒH×ÒÓ!Ô(÷ /à×Ñœ˜SŸ]™]Ó+Ð-WÕX÷ /Õ.ús   –.A2Á2
B c                 ó  • [        S 5      n[        S 5      n[        S 5      nX!l        X2l        U R                  [        5       nXl        S S S 5        U R	                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nc                  ó   • g r*   r   r   r   r   rí   Ú?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>Ñ  rF  r   c                  ó   • g r*   r   r   r   r   rí   rÆ  Ò  rF  r   c                  ó   • g r*   r   r   r   r   rí   rÆ  Ó  rF  r   r¾  )r0   r    rO   r  rB   rR   rS   )rE   r2   rµ   Úg3r+   s        r   Útest_deeper_cycleÚ-TestGreenletSetParentErrors.test_deeper_cycleÐ  sg   € Ü™Ó&ˆÜ™Ó&ˆÜ™Ó&ˆàŒ	ØŒ	Ø×ÑœzÔ*¨cØŒI÷ +à×Ñœ˜SŸ]™]Ó+Ð-BÕC÷ +Õ*ús   ÁA;Á;
B	r   N)r   r   r   r   rt  r‹  r�  r¤  r©  r¬  r¹  r¿  rÂ  rÊ  r   r   r   r   rk  rk  /  s<   † òWò2'òR"òHGòGò8òò8DòYõ	Dr   rk  c                   ó^   • \ rS rSr\" \S5      (       d  SS jrS rS rS r	S r
S	 rS
 rSrg)ÚTestRepriÜ  ÚassertEndsWithNc                 óJ   • U R                  UR                  U5      XU45        g r*   )rá   Úendswith)rE   rf  ÚsuffixÚmsgs       r   rÎ  ÚTestRepr.assertEndsWithß  s   € Ø�O‰O˜AŸJ™J vÓ.°¸CÐ0@ÕAr   c                 ód   • [        [        R                  " 5       5      nU R                  US5        g )Nú current active started main>)Úreprr   r   rÎ  ©rE   Úrs     r   Útest_main_while_runningÚ TestRepr.test_main_while_runningâ  s&   € Ü”×$Ò$Ó&Ó'ˆØ×Ñ˜AÐ>Õ?r   c                 ó–   ^• [         R                  " 5       mU4S jn[        U5      nUR                  5       nU R	                  US5        g )Nc                  ó   >• [        T 5      $ r*   )rÖ  r.  s   €r   rN   Ú-TestRepr.test_main_in_background.<locals>.runè  s   ø€ Ü˜“:Ðr   ú suspended active started main>)r   r   r0   r!   rÎ  )rE   rN   r1   rØ  r=  s       @r   Útest_main_in_backgroundÚ TestRepr.test_main_in_backgroundæ  s>   ø€ Ü×"Ò"Ó$ˆõ	ô ˜ÓˆØ�H‰H‹JˆØ×Ñ˜AÐ@ÕAr   c                 óN   • [        [        5       5      nU R                  US5        g )Nz	 pending>)rÖ  r0   rÎ  r×  s     r   Útest_initialÚTestRepr.test_initialï  s   € Ü”“ÓˆØ×Ñ˜A˜{Õ+r   c                 ó4  ^• [         R                  " 5       m " U4S jS[        R                  5      nU" 5       nUR	                  5         UR                  S5        U R                  UR                  S5        U R                  UR                  S5        [        S5       H  n[        R                  " S5        M     [        S5       HO  nU R                  UR                  R                  5        [        UR                  5      nU R                  US5        MQ     g )	Nc                   ó.   >• \ rS rSrS=rrSrU 4S jrSrg)Ú/TestRepr.test_main_from_other_thread.<locals>.Tiö  Nc                 óŽ   >• [        T5      U l        [        R                  " 5       U l        [        U R                  5      U l        g r*   )rÖ  Úoriginal_mainr   r   Ú	main_gletrù  )rE   r=  s    €r   rN   Ú3TestRepr.test_main_from_other_thread.<locals>.T.runù  s0   ø€ Ü%)¨$£Z�Ô"Ü!)×!4Ò!4Ó!6�”Ü#'¨¯©Ó#7�Õ r   )ré  rè  rù  )	r   r   r   r   rè  rù  ré  rN   r   r.  s   €r   ÚTræ  ö  s   ø† Ø*.Ð.ˆM˜KØˆI÷8ð 8r   rë  r   rÞ  rÕ  r9   gü©ñÒMbP?z (thread exited) dead>)r   r   r‚   rƒ   r„   r…   rÎ  rè  rù  rD   r¡   r¢   rá   ré  rk   rÖ  )rE   rë  rª   r§   rØ  r=  s        @r   Útest_main_from_other_threadÚ$TestRepr.test_main_from_other_threadó  sË   ø€ Ü×"Ò"Ó$ˆ÷	8”	× Ñ ô 	8ñ ‹CˆØ	�‰Œ	Ø	�‰ˆrŒ
à×Ñ˜AŸO™OÐ-NÔOØ×Ñ˜AŸM™MÐ+JÔKô �q–ˆAÜ�JŠJ�uÖñ ô �q–ˆAØ�O‰O˜AŸK™K×,Ñ,Ô-Ü�Q—[‘[Ó!ˆAØ×Ñ Ð#;Ö<ò r   c                 ó  • [        S 5      nUR                  5         U R                  [        U5      S5        U R	                  S[        U5      5        U R	                  S[        U5      5        U R	                  S[        U5      5        g )Nc                  ó   • g r*   r   r   r   r   rí   Ú$TestRepr.test_dead.<locals>.<lambda>  s   €  r   z dead>Ú	suspendedÚstartedÚactive)r0   r!   rÎ  rÖ  ÚassertNotInr^   s     r   Ú	test_deadÚTestRepr.test_dead  se   € Ü™Ó%ˆØ	�‰Œ
Ø×ÑœD ›G XÔ.Ø×Ñ˜¤d¨1£gÔ.Ø×Ñ˜¤D¨£GÔ,Ø×Ñ˜¤4¨£7Õ+r   c                 óÔ   • [        S 5      n[        S 5      n[        R                  " 5       nXU4 H3  nU R                  U< [        5        U R                  U< [        5        M5     g )Nc                  ó   • g r*   r   r   r   r   rí   Ú>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>"  r¢  r   c                  ó   • g r*   r   r   r   r   rí   rù  #  r  r   )r0   r   r   rË   rR   )rE   Úg_deadÚg_not_startedÚg_curr1   s        r   Ú#test_formatting_produces_native_strÚ,TestRepr.test_formatting_produces_native_str  s_   € ô ™\Ó*ˆÜ#¡LÓ1ˆÜ×#Ò#Ó%ˆà¨Ó-ˆAà×!Ñ!ÚÜôð ×!Ñ!ÚÜöò .r   r   r*   )r   r   r   r   r-  r   rÎ  rÙ  rß  râ  rì  rõ  rþ  r   r   r   r   rÍ  rÍ  Ü  s7   † á�8Ð-×.Ñ.ô	Bò@òBò,ò!=òF,õr   rÍ  c                   ó,   • \ rS rSrS rS rS rS rSrg)ÚTestMainGreenleti2  c                 ó¬   • S[        [        R                  " 5       5      ;   d   e[        [        R                  " 5       5      nS[        U5      ;  d   eU$ )Nr=  )rÖ  r   r   r´  )rE   rª   s     r   Ú_check_current_is_mainÚ'TestMainGreenlet._check_current_is_main6  sH   € àœœh×1Ò1Ó3Ó4Ó4Ð4Ð4ä”×$Ò$Ó&Ó'ˆØœT !›WÓ$Ð$Ð$Øˆr   c                 ób   • U R                  5       n[        SU40 5      nU R                  U5        g )NÚsubclass)r  r´  r\   )rE   Ú	main_typer  s      r   Ú)test_main_greenlet_type_can_be_subclassedÚ:TestMainGreenlet.test_main_greenlet_type_can_be_subclassed>  s.   € Ø×/Ñ/Ó1ˆ	Ü˜
 Y L°"Ó5ˆØ×Ñ˜XÕ&r   c                 óv   • U R                  5         U R                  [        R                  " 5       [        5        g r*   )r  rË   r   r   r0   rI   s    r   Útest_main_greenlet_is_greenletÚ/TestMainGreenlet.test_main_greenlet_is_greenletC  s'   € Ø×#Ñ#Ô%Ø×Ñœh×1Ò1Ó3´[ÕAr   c                 óØ   ^ ^• UU 4S jn[         R                   " U5      mTR                  5         T R                  [        5         [	        TS5        S S S 5        g ! , (       d  f       g = f)Nc                  ó|   >• TR                  [        5         [        T S5        S S S 5        g ! , (       d  f       g = frM   )rO   rP   Úgetattr)r1   rE   s   €€r   Údo_itÚ1TestMainGreenlet.test_greenlet_run.<locals>.do_itH  s'   ø€ Ø×"Ñ"¤>Õ2Ü˜˜5Ô!÷ 3×2Ö2ús   —-­
;rN   )r   r!   rO   rP   r  )rE   r  r1   s   ` @r   Útest_greenlet_runÚ"TestMainGreenlet.test_greenlet_runG  sG   ù€ ö	"ô ×Ò˜eÓ$ˆØ	�‰Œ
Ø×Ñœ~Õ.Ü�A�uÔ÷ /×.Ö.ús   ÁAÁ
A)r   N)	r   r   r   r   r  r  r  r  r   r   r   r   r  r  2  s   † òò'ò
Bõr   r  c                   óJ   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)ÚTestBrokenGreenletsiR  c                 óÖ   • S n[         R                  R                  U5      nSUl        U R	                  [
        S5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nc                  ó   • [        S5      e)NzNever get here)ÚAssertionErrorr   r   r   r/  Ú<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.funcW  s   € Ü Ð!1Ó2Ð2r   Tz;Failed to switch stacks into a greenlet for the first time.)r   Ú	_greenletÚUnswitchableGreenletÚforce_switch_errorÚassertRaisesRegexÚSystemErrorr!   )rE   r/  r1   s      r   Útest_failed_to_initialstubÚ.TestBrokenGreenlets.test_failed_to_initialstubV  sW   € ò	3ô ×Ñ×3Ñ3°DÓ9ˆØ#ˆÔà×#Ñ#¤KØ$aõcà�H‰HŒJ÷c÷ cö cús   Á AÁ
A(c                 óÆ  ^• / mU4S jn[         R                  R                  U5      nUR                  5         U R	                  TS/5        UR                  5         U R	                  TSS/5        SUl        U R                  [        S5         UR                  5         S S S 5        SUl        UR                  5         U R	                  T/ SQ5        g ! , (       d  f       N:= f)Nc                  ó   >• T R                  S5        [        R                  " 5       R                  R	                  5         T R                  S5        [        R                  " 5       R                  R	                  5         T R                  S5        g )Nr   r?   r9   r:   )Úrunss   €r   r/  ÚDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.funcd  sZ   ø€ Ø�K‰K˜ŒNÜ×ÒÓ!×(Ñ(×/Ñ/Ô1Ø�K‰K˜ŒNÜ×ÒÓ!×(Ñ(×/Ñ/Ô1Ø�K‰K˜�Nr   r   r?   Tz0Failed to switch stacks into a running greenlet.F)r   r?   r9   )r   r  r  r!   rB   r  r  r  )rE   r/  r1   r#  s      @r   Ú"test_failed_to_switch_into_runningÚ6TestBrokenGreenlets.test_failed_to_switch_into_runningb  s¸   ø€ Øˆõ	ô ×Ñ×3Ñ3°DÓ9ˆØ	�‰Œ
Ø×Ñ˜ ˜sÔ#Ø	�‰Œ
Ø×Ñ˜  1˜vÔ&Ø#ˆÔà×#Ñ#¤KØ$VõXà�H‰HŒJ÷Xð  %ˆÔØ	�‰Œ
Ø×Ñ˜šyÕ)÷Xõ Xús   ÂCÃ
C c                 ó²   • U R                  S5      nU R                  SUR                  5        U R                  UR                  U R	                  5       5        g )Nzfail_slp_switch.pyzfail_slp_switch is running)ÚassertScriptRaisesrQ   ÚoutputÚ
returncodeÚ,get_expected_returncodes_for_aborted_process©rE   Úexs     r   Ú&test_failed_to_slp_switch_into_runningÚ:TestBrokenGreenlets.test_failed_to_slp_switch_into_running~  sA   € Ø×$Ñ$Ð%9Ó:ˆà�‰Ð2°B·I±IÔ>Ø�‰�b—m‘m T×%VÑ%VÓ%XÕYr   c                 óþ   • U R                  S5      nU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        g )Nzfail_switch_two_greenlets.pyz	In g1_runÚTRACEzLEAVE TRACEzFalling off end of mainzFalling off end of g1_runzFalling off end of g2©Ú
run_scriptrQ   ©rE   r)  s     r   Ú#test_reentrant_switch_two_greenletsÚ7TestBrokenGreenlets.test_reentrant_switch_two_greenlets„  sh   € à—‘Ð!?Ó@ˆØ�‰�k 6Ô*Ø�‰�g˜vÔ&Ø�‰�m VÔ,Ø�‰Ð/°Ô8Ø�‰Ð1°6Ô:Ø�‰Ð-¨vÕ6r   c                 ó”   • U R                  SSS9nU R                  SUR                  5        U R                  SUR                  5        g )Nzfail_switch_three_greenlets.py)r   )Ú	exitcodesr(  zpositional arguments)r(  rQ   r)  r,  s     r   Ú%test_reentrant_switch_three_greenletsÚ9TestBrokenGreenlets.test_reentrant_switch_three_greenletsŽ  s@   € ð ×$Ñ$Ð%EÐQUÐ$ÐVˆà�‰�k 2§9¡9Ô-Ø�‰Ð,¨b¯i©iÕ8r   c                 óJ   • U R                  S5      nU R                  SU5        g )Nzfail_switch_three_greenlets2.pya­  RESULTS: [('trace', 'switch'), ('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), ('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), ('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), ('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), ('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), ('trace', 'switch'), ('main g2.2', 'g2 done')]r2  r4  s     r   Ú&test_reentrant_switch_three_greenlets2Ú:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2—  s)   € ð —‘Ð!BÓCˆØ�‰ð=ð õ		
r   c                 óJ   • U R                  S5      nU R                  SU5        g )Nz#fail_initialstub_already_started.pya!  RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', ('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), 'B.__getattribute__ back from main in C', ('Begin A', (None,)), ('A dead?', True, 'B dead?', True, 'C dead?', False), 'C done', ('main from c.2', None)]r2  r4  s     r   Ú4test_reentrant_switch_GreenletAlreadyStartedInPythonÚHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython©  s'   € Ø—‘Ð!FÓGˆà�‰ð1ð
 õ	
r   c                 óJ   • U R                  S5      nU R                  SU5        g )Nzfail_clearing_run_switches.pyz„RESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]r2  r4  s     r   Ú*test_reentrant_switch_run_callable_has_delÚ>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_delµ  s'   € Ø—‘Ð!@ÓAˆØ�‰ðð õ	
r   c                 ó‚   • [         (       d  U R                  S5        U R                  S5      nU R                  SU5        g )Nz0Only free-threaded builds take critical sectionszfail_switch_critical_section.pyzSWITCH CS OK)r   ÚskipTestr3  rQ   r4  s     r   Ú+test_switch_leaves_no_critical_section_heldÚ?TestBrokenGreenlets.test_switch_leaves_no_critical_section_held¿  s4   € ÷ +Ò*Ø�M‰MÐLÔMØ—‘Ð!BÓCˆØ�‰�n fÕ-r   r   N)r   r   r   r   r  r%  r.  r5  r9  r<  r?  rB  rF  r   r   r   r   r  r  R  s0   † ò
ò*ò8Zò7ò9ò
ò$

ò
õ.r   r  c                   óT   • \ rS rSr\R
                  " \" \S5      S5      S 5       rSr	g)Ú
TestModuleiÍ  Ú_is_gil_enabledz,Needs 3.13 and above for sys._is_gil_enabledc                 ó¬   • [         (       a%  U R                  [        R                  " 5       5        g U R	                  [        R                  " 5       5        g r*   )r   rã   r#   rJ  rá   rI   s    r   Útest_no_gil_on_free_threadedÚ'TestModule.test_no_gil_on_free_threadedÏ  s6   € ÷ 'Ò&Ø×ÑœS×0Ò0Ó2Õ3à�O‰OœC×/Ò/Ó1Õ2r   r   N)
r   r   r   r   rg  Ú
skipUnlessr-  r#   rL  r   r   r   r   rI  rI  Í  s.   † à×Ò™ Ð&7Ó8ØGóIñ3óIó3r   rI  Ú__main__)"r¯   r#   r¡   r‚   rg  Úabcr   r   r   r0   rA  r   r   r	   r
   r   r   Ú	leakcheckr   r   r   r   rM  r   r'   r3   r5   rk  rÍ  r  r  rI  r   r=  r   r   r   Ú<module>rR     sÃ   ðÛ 	Û 
Û Û Û å Ý ã Ý ,Ý Ý "Ý Ý Ý Ý )Ý &Ý 7Ý (Ý +ô	�	ô 	òòôt�8ô tônjD (ô jDôZSˆxô Sôl�xô ô@y.˜(ô y.ôv3�ô 3ð ˆzÓØ‡M‚M…Oð r   