U
    iâËdü<  ã                   @   sª  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ eƒ Zd
e_ eƒ Z!d
e!_"eƒ Z#G dd„ de$ƒZ%G dd„ de%ƒZ&G dd„ de$ƒZ'dd„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-G dd„ de.ƒZ/dd „ Z0d!d"„ Z1d#d$„ Z2d%d&„ Z3d'd(„ Z4d)d*„ Z5G d+d,„ d,eƒZ6G d-d.„ d.eeƒZ7e8d/k�r¦e 9¡  dS )0é    N)Ú	takewhile)ÚnjitÚjit)ÚCFGraphÚLoop)Úcompile_extraÚcompile_isolatedÚFlagsÚCompilerBaseÚDefaultPassBuilder)Ú
PreserveIR)ÚIRLegalization)ÚtypesÚir)ÚTestCaseÚoverride_configÚSerialMixinTc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_Dummyc                 C   s   || _ || _| | ¡ d S ©N)ÚrecorderÚnameÚ
_add_dummy)Úselfr   r   © r   úV/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_obj_lifetime.pyÚ__init__   s    z_Dummy.__init__c                 C   s&   t |tƒst‚t| jd| j|jf ƒS )Nz%s + %s)Ú
isinstancer   ÚAssertionErrorr   r   )r   Úotherr   r   r   Ú__add__"   s    z_Dummy.__add__c                 C   s   t | jd| j ƒS )Nziter(%s))Ú_DummyIteratorr   r   ©r   r   r   r   Ú__iter__&   s    z_Dummy.__iter__N)Ú__name__Ú
__module__Ú__qualname__r   r   r"   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd„ ZeZdS )r    r   c                 C   s4   | j dkrt‚|  j d7  _ t| jd| j| j f ƒS )Né   é   z%s#%s)ÚcountÚStopIterationr   r   r   r!   r   r   r   Ú__next__.   s    
z_DummyIterator.__next__N)r#   r$   r%   r(   r*   Únextr   r   r   r   r    *   s   r    c                   @   sT   e Zd ZdZdd„ Zdd„ Zdd„ ZeZdd	„ Zd
d„ Z	e
dd„ ƒZe
dd„ ƒZdS )ÚRefRecorderz˜
    An object which records events when instances created through it
    are deleted.  Custom events can also be recorded to aid in
    diagnosis.
    c                 C   s   t  t¡| _g | _i | _d S r   )ÚcollectionsÚdefaultdictÚintÚ_countsÚ_eventsÚ_wrsr!   r   r   r   r   >   s    zRefRecorder.__init__c                 C   s
   t | |ƒS )zK
        Make an object whose deletion will be recorded as *name*.
        )r   )r   r   r   r   r   Ú
make_dummyC   s    zRefRecorder.make_dummyc                 C   s   t  || j¡}|j| j|< d S r   )ÚweakrefÚrefÚ_on_disposalr   r2   )r   ÚdummyÚwrr   r   r   r   I   s    zRefRecorder._add_dummyc                 C   s0   | j | d }|| j |< | j |j|d�¡ dS )zr
        Manually append *event* to the recorded events.
        *event* can be formatted using format().
        r'   )r(   N)r0   r1   ÚappendÚformat)r   Úeventr(   r   r   r   ÚmarkO   s    
zRefRecorder.markc                 C   s   | j  |¡}| j |¡ d S r   )r2   Úpopr1   r9   )r   r8   r   r   r   r   r6   X   s    zRefRecorder._on_disposalc                 C   s   dd„ | j D ƒS )zC
        A list of objects which haven't been deleted yet.
        c                 S   s   g | ]
}|ƒ ‘qS r   r   )Ú.0r8   r   r   r   Ú
<listcomp>a   s     z%RefRecorder.alive.<locals>.<listcomp>)r2   r!   r   r   r   Úalive\   s    zRefRecorder.alivec                 C   s   | j S )z,
        A list of recorded events.
        )r1   r!   r   r   r   Úrecordedc   s    zRefRecorder.recordedN)r#   r$   r%   Ú__doc__r   r3   r   Ú__call__r<   r6   Úpropertyr@   rA   r   r   r   r   r,   7   s   	
r,   c                 C   s@   | dƒ}| dƒ}| dƒ}|| }|   d¡ || }|   d¡ |S )NÚaÚbÚcú--1--ú--2--©r<   )ÚrecrE   rF   rG   Údr   r   r   Úsimple_usecase1k   s    

rM   c                 C   s*   | dƒ}| dƒ}|   d¡ |}|}d }|S )NrE   rF   rH   rJ   )rK   rE   rF   ÚxÚyr   r   r   Úsimple_usecase2u   s    
rP   c                 C   sN   | dƒ}| dƒ}| dƒ}|}|D ]}|| }|   d¡ q |   d¡ || }|S )NrE   rF   rG   ú--loop bottom--ú--loop exit--rJ   )rK   rE   rF   rG   rN   rO   r   r   r   Úlooping_usecase1~   s    
rS   c                 C   sª   | dƒ}| dƒ}| dƒ}|D ]t}|   d¡ || }|| }|   d¡ |D ] }|   d¡ || }|   d¡ qH|   d¡ |r‚|| }n qœ|   d	¡ q|   d
¡ |   d¡ |S )NrE   rF   Úcumú--outer loop top--z--inner loop entry #{count}--z--inner loop top #{count}--z--inner loop bottom #{count}--z--inner loop exit #{count}--z--outer loop bottom #{count}--ú--outer loop else--ú--outer loop exit--rJ   )rK   rE   rF   rT   rN   ÚzrO   r   r   r   Úlooping_usecase2Š   s(    






rY   c                 c   s    | dƒ}| dƒ}|V  |V  d S ©NrE   rF   r   ©rK   rE   rF   r   r   r   Úgenerator_usecase1£   s    r\   c                 c   s*   | dƒ}| dƒ}|D ]
}|V  q|V  d S rZ   r   )rK   rE   rF   rN   r   r   r   Úgenerator_usecase2©   s
    r]   c                   @   s   e Zd ZdS )ÚMyErrorN)r#   r$   r%   r   r   r   r   r^   ±   s   r^   c                 C   s   t | ƒ‚d S r   ©r^   )rN   r   r   r   Údo_raise´   s    r`   c                 C   s@   | dƒ}| dƒ}| dƒ}|r4t dƒ | dƒ}||  ||  d S )NrE   rF   rL   ÚfoorG   ©r`   )rK   rE   rF   rL   rG   r   r   r   Úraising_usecase1·   s    rc   c                 C   s0   | dƒ}| dƒ}|r$| dƒ}t |ƒ ||  d S )NrE   rF   rG   rb   )rK   rE   rF   rG   r   r   r   Úraising_usecase2Á   s    rd   c                 C   s    | dƒ}| dƒ}|rt |ƒ‚d S rZ   r_   r[   r   r   r   Úraising_usecase3É   s    re   c                 C   s�   d}t |ƒD ]t}|  t|ƒ¡ d}t |ƒD ]
}  dS |dk rBqn*|dkrlt |ƒD ]}|    S |  d¡ |  d¡ |  d¡ q|  d¡ dS )zN
    This test reveal a bug that there is a del on uninitialized variable
    é   r   é   ZFAILEDÚOKéÿÿÿÿ)Úranger<   Ústr)rK   ÚnÚiÚjr   r   r   Údel_before_definitionÐ   s     


ro   c                 c   s,   |   d¡ dV  | dƒ}|r |   d¡ q dS )z^
    test to reveal bug of invalid liveness when infinite loop has multiple
    backedge.
    ÚyieldNÚpÚbrarJ   )rK   rq   r   r   r   Úinf_loop_multiple_back_edgeç   s    

rs   c                   @   sŠ   e Zd ZdZdd„ Zd!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d„ Zdd„ Zdd „ ZdS )"ÚTestObjLifetimezH
    Test lifetime of Python objects inside jit-compiled functions.
    c                 C   s   t tjfddd�|ƒ}|S )NTF)ZforceobjZlooplift)r   r   Zpyobject)r   ÚpyfuncÚcfuncr   r   r   Úcompileú   s    zTestObjLifetime.compileNc              	   C   sD   t ƒ }|  |¡}|d k	r8|  |¡� ||ƒ W 5 Q R X n||ƒ |S r   )r,   rw   ÚassertRaises)r   ru   ÚraisesrK   rv   r   r   r   Úcompile_and_record   s    
z"TestObjLifetime.compile_and_recordc                 C   sP   g }|j }t|ƒ}|D ] }||kr| |¡ | |¡ q|  ||d|f ¡ dS )zk
        Check that the *expected* markers occur in that order in *rec*'s
        recorded events.
        z'the full list of recorded events is: %rN)rA   Úlistr9   ÚremoveÚassertEqual)r   rK   ÚexpectedÚactualrA   Ú	remainingrL   r   r   r   ÚassertRecordOrder
  s    
ÿz!TestObjLifetime.assertRecordOrderc                 C   sP   |   t¡}|  |j¡ |  |dddg¡ |  |dddg¡ |  |dddg¡ d S )NrE   rF   rH   rG   zb + crI   )rz   rM   ÚassertFalser@   r�   ©r   rK   r   r   r   Útest_simple1  s
    
zTestObjLifetime.test_simple1c                 C   s,   |   t¡}|  |j¡ |  |dddg¡ d S )NrF   rH   rE   )rz   rP   r‚   r@   r�   rƒ   r   r   r   Útest_simple2"  s    
zTestObjLifetime.test_simple2c                 C   sJ   |   t¡}|  |j¡ |  |ddddg¡ |  |ddddddd	dg¡ d S )
NrE   rF   rR   rG   ú	iter(a)#1rQ   ú	iter(a)#2ú	iter(a)#3úiter(a))rz   rS   r‚   r@   r�   rƒ   r   r   r   Útest_looping1'  s    

   ýzTestObjLifetime.test_looping1c              	   C   s|   |   t¡}|  |j¡ |  |ddg¡ |  |dddg¡ |  |dddddd	g¡ |  |d
dddddg¡ |  |ddg¡ d S )NrE   rU   r‰   rV   rW   ziter(b)z--inner loop exit #1--z--inner loop exit #2--z--inner loop exit #3--r†   z--inner loop entry #1--r‡   z--inner loop entry #2--rˆ   z--inner loop entry #3--ziter(a)#1 + iter(a)#1z--outer loop bottom #1--)rz   rY   r‚   r@   r�   rƒ   r   r   r   Útest_looping23  s*    

ÿ
  þ
  þÿzTestObjLifetime.test_looping2c              	   C   sâ   |   |¡}tƒ }|  |¡�6 ||ƒ}t|ƒ |  |j¡ t|ƒ |  |j¡ W 5 Q R X tƒ }|  |¡�$ ||ƒ}~t 	¡  |  |j¡ W 5 Q R X tƒ }|  |¡�8 ||ƒ}t|ƒ |  |j¡ ~t 	¡  |  |j¡ W 5 Q R X d S r   )
rw   r,   ÚassertRefCountr+   Ú
assertTruer@   r{   r‚   ÚgcZcollect)r   Zgenfuncrv   rK   Úgenr   r   r   Úexercise_generatorI  s,    
z"TestObjLifetime.exercise_generatorc                 C   s   |   t¡ d S r   )r�   r\   r!   r   r   r   Útest_generator1d  s    zTestObjLifetime.test_generator1c                 C   s   |   t¡ d S r   )r�   r]   r!   r   r   r   Útest_generator2g  s    zTestObjLifetime.test_generator2c                 C   s"   |   t¡}|  |jdddg¡ d S )NÚ0Ú1Ú2)rz   ro   r}   rA   rƒ   r   r   r   Útest_del_before_definitionj  s    
z*TestObjLifetime.test_del_before_definitionc              	   C   s4   |   t¡�  | jttd�}|  |j¡ W 5 Q R X d S ©N)ry   )rŒ   r`   rz   rc   r^   r‚   r@   rƒ   r   r   r   Útest_raising1n  s    zTestObjLifetime.test_raising1c              	   C   s4   |   t¡�  | jttd�}|  |j¡ W 5 Q R X d S r—   )rŒ   r`   rz   rd   r^   r‚   r@   rƒ   r   r   r   Útest_raising2s  s    zTestObjLifetime.test_raising2c              	   C   s4   |   t¡�  | jttd�}|  |j¡ W 5 Q R X d S r—   )rŒ   r^   rz   re   r‚   r@   rƒ   r   r   r   Útest_raising3x  s    zTestObjLifetime.test_raising3c              
   C   s~   |   t¡}tƒ }t||ƒƒ}t|ƒ |  |jg ¡ t|ƒ |  |jg ¡ t|ƒ |  |jg ¡ |  |jdddddddg¡ d S )Nrp   rq   rr   )rw   rs   r,   Úiterr+   r}   r@   rA   )r   rv   rK   Úiteratorr   r   r   Ú test_inf_loop_multiple_back_edge}  s    
ÿz0TestObjLifetime.test_inf_loop_multiple_back_edge)N)r#   r$   r%   rB   rw   rz   r�   r„   r…   rŠ   r‹   r�   r‘   r’   r–   r˜   r™   rš   r�   r   r   r   r   rt   õ   s    

rt   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestExtendingVariableLifetimesc                    sŒ   dd„ }‡ fdd„}|dƒ}t jfd t jt jt jt jt jt jt jf•}|||ƒ |dƒ}t jfd t jft jfd t jf•}|||ƒ d S )	Nc              	   S   s\   G dd„ dt ƒ}t|d�dd„ ƒ}td| ƒ�& |ƒ  |j|jd  }|jd }W 5 Q R X |S )	Nc                   @   s   e Zd Zdd„ ZdS )z`TestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.IRPreservingCompilerc                 S   s&   t  | j¡}| tt¡ | ¡  |gS r   ©r   Zdefine_nopython_pipelineÚstateZadd_pass_afterr   r   Úfinalize©r   Úpmr   r   r   Údefine_pipelines•  s    zqTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.IRPreservingCompiler.define_pipelinesN©r#   r$   r%   r¤   r   r   r   r   ÚIRPreservingCompiler“  s   r¦   )Úpipeline_classc                  S   s   d} d}| | }|| }|S ©Né
   é   r   ©rE   rF   rG   rL   r   r   r   ra   ›  s
    zOTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_ir.<locals>.fooZEXTEND_VARIABLE_LIFETIMESr   Úpreserved_ir)r
   r   r   Ú	overloadsÚ
signaturesÚmetadata)Zextend_lifetimesr¦   ra   ÚcresÚfunc_irr   r   r   Úget_ir’  s    
zBTestExtendingVariableLifetimes.test_lifetime_basic.<locals>.get_irc                    sJ   ˆ   t| jƒd¡ tt| j ¡ ƒƒ}t||jƒD ]\}}ˆ  ||¡ q0d S )Nr'   )	r}   ÚlenÚblocksr+   r›   ÚvaluesÚzipÚbodyZassertIsInstance)r±   ÚexpectÚblkZexpect_classZgot_stmtr!   r   r   Úcheck¬  s    zATestExtendingVariableLifetimes.test_lifetime_basic.<locals>.checkFr&   Té   )r   ÚAssignÚDelÚReturn)r   r²   rº   Zdel_after_use_irr¸   Zdel_at_block_end_irr   r!   r   Útest_lifetime_basic�  s    	  ÿ
$z2TestExtendingVariableLifetimes.test_lifetime_basicc                 C   s`   dd„ }|dd�}|ddd�}|ddd�}dd„ }|   ||ƒ¡ |   ||ƒ¡ |  ||ƒ¡ d S )	Nc                  [   sN   G dd„ dt ƒ}tf d|i| —Ždd„ ƒ}|ƒ  |j|jd  }|jd }|S )Nc                   @   s   e Zd Zdd„ ZdS )zfTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.IRPreservingCompilerc                 S   s&   t  | j¡}| tt¡ | ¡  |gS r   rŸ   r¢   r   r   r   r¤   Ç  s    zwTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.IRPreservingCompiler.define_pipelinesNr¥   r   r   r   r   r¦   Å  s   r¦   r§   c                  S   s   d} d}| | }|| }|S r¨   r   r«   r   r   r   ra   Í  s
    zUTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_ir.<locals>.foor   r¬   )r
   r   r­   r®   r¯   )Úoptionsr¦   ra   r°   r±   r   r   r   r²   Ä  s    

zHTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.get_irT)Údebug)rÁ   Z_dbg_extend_lifetimesFc                 S   sh   | j  ¡ \}dd„ |jD ƒ}tttj|ƒƒ}t|ƒ}tttj||d … ƒƒ}|t|ƒ }|t|ƒd kS )Nc                 S   s   g | ]}t |tjƒ‘qS r   )r   r   r½   )r>   Ústmtr   r   r   r?   æ  s     zoTestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.is_del_grouped_at_the_end.<locals>.<listcomp>r'   )	r´   rµ   r·   r{   r   ÚoperatorÚnot_r³   Útruth)Zfirr¹   Zinst_is_delZnot_delsÚbeginZall_delsÚendr   r   r   Úis_del_grouped_at_the_endã  s    z[TestExtendingVariableLifetimes.test_dbg_extend_lifetimes.<locals>.is_del_grouped_at_the_end)r�   r‚   )r   r²   Zir_debugZir_debug_extZir_debug_no_extrÈ   r   r   r   Útest_dbg_extend_lifetimesÂ  s    
z8TestExtendingVariableLifetimes.test_dbg_extend_lifetimesN)r#   r$   r%   r¿   rÉ   r   r   r   r   rž   ‹  s   2rž   Ú__main__):r-   Úsysr4   rŽ   rÃ   Ú	itertoolsr   ZunittestZnumbar   r   Znumba.core.controlflowr   r   Znumba.core.compilerr   r   r	   r
   r   Znumba.core.untyped_passesr   Znumba.core.typed_passesr   Z
numba.corer   r   Znumba.tests.supportr   r   r   Zenable_pyobj_flagsZenable_pyobjectZforceobj_flagsZforce_pyobjectZno_pyobj_flagsÚobjectr   r    r,   rM   rP   rS   rY   r\   r]   ÚRuntimeErrorr^   r`   rc   rd   re   ro   rs   rt   rž   r#   Úmainr   r   r   r   Ú<module>   sN   4
	
 m
