U
    iâËdk«  ã                   @   s‚  d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZ eƒ Zde_eƒ Zde_eƒ Zde_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%d&„ Z&d'd(„ Z'd)d*„ Z(d+d,„ Z)d-d.„ Z*d/d0„ Z+d1d2„ Z,d3d4„ Z-G d5d6„ d6eƒZ.G d7d8„ d8eƒZ/G d9d:„ d:eƒZ0e1d;k�r~e 2¡  dS )<é    N)ÚCFGraphÚControlFlowAnalysis)Úcompile_isolatedÚFlags)Útypes)ÚFunctionIdentityÚByteCodeÚ_fix_LOAD_GLOBAL_arg)Ú	PYVERSION)ÚTestCaseTc                 C   s   d}t | ƒD ]}||7 }q|S ©Nr   ©Úrange©ÚxÚyÚresultÚi© r   úV/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_flow_control.pyÚfor_loop_usecase1   s    
r   c                 C   s.   d}t t| |dƒƒD ]\}}||| 7 }q|S )Nr   éÿÿÿÿ)Ú	enumerater   ©r   r   r   r   Újr   r   r   Úfor_loop_usecase2   s    r   c                 C   s"   d}| |g}|D ]}||7 }q|S r   r   )r   r   r   Úlstr   r   r   r   Úfor_loop_usecase3#   s
    
r   c                 C   s,   d}t dƒD ]}t dƒD ]}|d7 }qq|S )Nr   é
   é   r   r   r   r   r   Úfor_loop_usecase4+   s
    r    c                 C   s*   d}t | ƒD ]}|d7 }||kr q&q|S ©Nr   r   r   r   r   r   r   Úfor_loop_usecase53   s    r"   c                 C   s(   d}t | ƒD ]}||krq|d7 }q|S r!   r   r   r   r   r   Úfor_loop_usecase6<   s    
r#   c                 C   s*   t | ƒD ]}d} t | ƒD ]
}  dS qdS r!   r   )r   r   r   r   r   r   r   Úfor_loop_usecase7E   s    r$   c                 C   s*   d}t | |||  d ƒD ]}|d7 }q|S r!   r   r   r   r   r   Úfor_loop_usecase8O   s    
r%   c                 C   sH   d}t | ƒD ]6}d} t | ƒD ]}|| d kr||7 } qq||7 }q|S )Nr   é   r   )r   r   Úzr   r   r   r   r   Úfor_loop_usecase9V   s    
r(   c                 C   s*   t | ƒD ]}||kr|} q&q|d }|S )Nr&   r   )r   r   r   r'   r   r   r   Úfor_loop_usecase10d   s    r)   c                 C   s&   d}d}|| k r"||7 }|d7 }q|S r!   r   r   r   r   r   Úwhile_loop_usecase1n   s    
r*   c                 C   s   d}|| kr|d7 }q|S r!   r   ©r   r   r   r   r   r   Úwhile_loop_usecase2w   s    
r,   c                 C   s@   d}d}d}|| k r<||k r||| 7 }|d7 }|d7 }qq|S r!   r   r   r   r   r   Úwhile_loop_usecase3~   s    r-   c                 C   s   d}|d7 }|| krqq|S r!   r   r+   r   r   r   Úwhile_loop_usecase4Š   s
    r.   c                 C   s,   d}|| k r(||kr|d7 }q|d7 }q|S )Nr   r&   r   r   r+   r   r   r   Úwhile_loop_usecase5“   s    
r/   c                 C   s   | dkr
n
|dkrn dS )Nr   Tr   ©r   r   r   r   r   Úifelse_usecase1�   s
    r1   c                 C   s(   | |krdS | dks|dkr dS dS d S )Nr   r   r&   é   r   r0   r   r   r   Úifelse_usecase2§   s
    r3   c                 C   s:   | dkr&|dkrdS |dk r dS dS n| dk r2dS dS d S r!   r   r0   r   r   r   Úifelse_usecase3°   s    r4   c                 C   s   | |krdS d S ©Nr   r   r0   r   r   r   Úifelse_usecase4¾   s    r6   c                 C   s   | |krdS dS )NTFr   r0   r   r   r   Úternary_ifelse_usecase1Ã   s    r7   c                 C   s<   | }|}||d krq |d7 }q|d7 }||krq4q||fS r5   r   )r   r   ÚLr   r   r   r   Údouble_infinite_loopÇ   s    
r9   c                   C   s   zW n t k
r   Y nX d S ©N)Ú	Exceptionr   r   r   r   Útry_except_usecase×   s    r<   c                   @   s¼  e Zd Zefdd„Zefdd„Zdd„ Zefdd„Zd	d
„ Zefdd„Z	dd„ Z
efdd„Zdd„ Zefdd„Zdd„ Zefdd„Zdd„ Zefdd„Zdd„ Zefdd „Zd!d"„ Zefd#d$„Zd%d&„ Zefd'd(„Zd)d*„ Zefd+d,„Zd-d.„ Zefd/d0„Zd1d2„ Zefd3d4„Zd5d6„ Zefd7d8„Zd9d:„ Z efd;d<„Z!d=d>„ Z"efd?d@„Z#dAdB„ Z$efdCdD„Z%dEdF„ Z&efdGdH„Z'dIdJ„ Z(efdKdL„Z)dMdN„ Z*efdOdP„Z+dQdR„ Z,efdSdT„Z-dUdV„ Z.dWS )XÚTestFlowControlc                 C   sê   t |tjtjf|d�}|j}t ||¡D ]¼\}}d }	d }
z|||ƒ}W n& tk
rl } z|}	W 5 d }~X Y nX z|||ƒ}W nD tk
rÀ } z&|	d kr˜‚ |}
|  t|	ƒt|
ƒ¡ W 5 d }~X Y q(X |	d k	rØ|  	d|	 ¡ |  ||¡ q(d S )N©Úflagsz(Invalid for pure-python but numba works
)
r   r   ZintpÚentry_pointÚ	itertoolsÚproductr;   ÚassertEqualÚtypeZfail)ÚselfZpyfuncZ
x_operandsZ
y_operandsr?   ÚcrZcfuncr   r   ZpyerrZcerrZpyresÚeZcresr   r   r   Úrun_testà   s*    &ÿzTestFlowControl.run_testc                 C   s   | j tdddgdg|d� d S ©Niöÿÿÿr   r   r>   )rH   r   ©rE   r?   r   r   r   Útest_for_loop1ù   s    zTestFlowControl.test_for_loop1c                 C   s   | j td� d S ©Nr>   )rK   Úno_pyobj_flags©rE   r   r   r   Útest_for_loop1_npmü   s    z"TestFlowControl.test_for_loop1_npmc                 C   s"   | j tdddgdddg|d� d S rI   )rH   r   rJ   r   r   r   Útest_for_loop2ÿ   s    ÿzTestFlowControl.test_for_loop2c                 C   s   | j td� d S rL   )rP   rM   rN   r   r   r   Útest_for_loop2_npm  s    z"TestFlowControl.test_for_loop2_npmc                 C   s   | j tdgdg|d� dS )z(
        List requires pyobject
        r   r&   r>   N)rH   r   rJ   r   r   r   Útest_for_loop3  s    ÿzTestFlowControl.test_for_loop3c                 C   s   | j td� d S rL   )rR   rM   rN   r   r   r   Útest_for_loop3_npm  s    z"TestFlowControl.test_for_loop3_npmc                 C   s   | j tdgdg|d� d S ©Nr   r>   )rH   r    rJ   r   r   r   Útest_for_loop4  s    zTestFlowControl.test_for_loop4c                 C   s   | j td� d S rL   )rU   rM   rN   r   r   r   Útest_for_loop4_npm  s    z"TestFlowControl.test_for_loop4_npmc                 C   s   | j tdgdg|d� d S ©Néd   é2   r>   )rH   r"   rJ   r   r   r   Útest_for_loop5  s    zTestFlowControl.test_for_loop5c                 C   s   | j td� d S rL   )rZ   rM   rN   r   r   r   Útest_for_loop5_npm  s    z"TestFlowControl.test_for_loop5_npmc                 C   s   | j tdgdg|d� d S rW   )rH   r#   rJ   r   r   r   Útest_for_loop6  s    zTestFlowControl.test_for_loop6c                 C   s   | j td� d S rL   )r\   rM   rN   r   r   r   Útest_for_loop6_npm  s    z"TestFlowControl.test_for_loop6_npmc                 C   s   | j tdgdg|d� d S )Né   r   r>   )rH   r$   rJ   r   r   r   Útest_for_loop7"  s    zTestFlowControl.test_for_loop7c                 C   s   | j td� d S rL   )r_   rM   rN   r   r   r   Útest_for_loop7_npm%  s    z"TestFlowControl.test_for_loop7_npmc                 C   s    | j tddgdddg|d� d S ©Nr   r   r&   r   r>   )rH   r%   rJ   r   r   r   Útest_for_loop8(  s    zTestFlowControl.test_for_loop8c                 C   s   | j td� d S rL   )rb   rM   rN   r   r   r   Útest_for_loop8_npm+  s    z"TestFlowControl.test_for_loop8_npmc                 C   s    | j tddgdddg|d� d S ra   )rH   r(   rJ   r   r   r   Útest_for_loop9.  s    zTestFlowControl.test_for_loop9c                 C   s   | j td� d S rL   )rd   rM   rN   r   r   r   Útest_for_loop9_npm1  s    z"TestFlowControl.test_for_loop9_npmc                 C   s   | j tdgddg|d� d S )Nr^   r&   é   r>   )rH   r)   rJ   r   r   r   Útest_for_loop104  s    zTestFlowControl.test_for_loop10c                 C   s   | j td� d S rL   )rg   rM   rN   r   r   r   Útest_for_loop10_npm7  s    z#TestFlowControl.test_for_loop10_npmc                 C   s   | j tdgdg|d� d S ©Nr   r   r>   )rH   r*   rJ   r   r   r   Útest_while_loop1:  s    z TestFlowControl.test_while_loop1c                 C   s   | j td� d S rL   )rj   rM   rN   r   r   r   Útest_while_loop1_npm=  s    z$TestFlowControl.test_while_loop1_npmc                 C   s   | j tdgdg|d� d S ri   )rH   r,   rJ   r   r   r   Útest_while_loop2@  s    z TestFlowControl.test_while_loop2c                 C   s   | j td� d S rL   )rl   rM   rN   r   r   r   Útest_while_loop2_npmC  s    z$TestFlowControl.test_while_loop2_npmc                 C   s   | j tdgdg|d� d S rT   )rH   r-   rJ   r   r   r   Útest_while_loop3F  s    z TestFlowControl.test_while_loop3c                 C   s   | j td� d S rL   )rn   rM   rN   r   r   r   Útest_while_loop3_npmI  s    z$TestFlowControl.test_while_loop3_npmc                 C   s   | j tdgdg|d� d S ri   )rH   r.   rJ   r   r   r   Útest_while_loop4L  s    z TestFlowControl.test_while_loop4c                 C   s   | j td� d S rL   )rp   rM   rN   r   r   r   Útest_while_loop4_npmO  s    z$TestFlowControl.test_while_loop4_npmc                 C   s"   | j tdddgdddg|d� d S )Nr   r^   r   r>   )rH   r/   rJ   r   r   r   Útest_while_loop5R  s    z TestFlowControl.test_while_loop5c                 C   s   | j td� d S rL   )rr   rM   rN   r   r   r   Útest_while_loop5_npmU  s    z$TestFlowControl.test_while_loop5_npmc                 C   s"   | j tdddgdddg|d� d S ©Nr   r   r   r>   )rH   r1   rJ   r   r   r   Útest_ifelse1X  s    zTestFlowControl.test_ifelse1c                 C   s   | j td� d S rL   )ru   rM   rN   r   r   r   Útest_ifelse1_npm[  s    z TestFlowControl.test_ifelse1_npmc                 C   s"   | j tdddgdddg|d� d S rt   )rH   r3   rJ   r   r   r   Útest_ifelse2^  s    zTestFlowControl.test_ifelse2c                 C   s   | j td� d S rL   )rw   rM   rN   r   r   r   Útest_ifelse2_npma  s    z TestFlowControl.test_ifelse2_npmc                 C   s"   | j tdddgdddg|d� d S rt   )rH   r4   rJ   r   r   r   Útest_ifelse3d  s    zTestFlowControl.test_ifelse3c                 C   s   | j td� d S rL   )ry   rM   rN   r   r   r   Útest_ifelse3_npmg  s    z TestFlowControl.test_ifelse3_npmc                 C   s"   | j tdddgdddg|d� d S rt   )rH   r6   rJ   r   r   r   Útest_ifelse4j  s    zTestFlowControl.test_ifelse4c                 C   s   | j td� d S rL   )r{   rM   rN   r   r   r   Útest_ifelse4_npmm  s    z TestFlowControl.test_ifelse4_npmc                 C   s"   | j tdddgdddg|d� d S rt   )rH   r7   rJ   r   r   r   Útest_ternary_ifelse1p  s    ÿz$TestFlowControl.test_ternary_ifelse1c                 C   s   | j td� d S rL   )r}   rM   rN   r   r   r   Útest_ternary_ifelse1_npmt  s    z(TestFlowControl.test_ternary_ifelse1_npmc                 C   s   | j tdgdg|d� d S ri   )rH   r9   rJ   r   r   r   Útest_double_infinite_loopw  s    ÿz)TestFlowControl.test_double_infinite_loopc                 C   s   | j td� d S rL   )r   rM   rN   r   r   r   Útest_double_infinite_loop_npm{  s    z-TestFlowControl.test_double_infinite_loop_npmN)/Ú__name__Ú
__module__Ú__qualname__Úenable_pyobj_flagsrH   rK   rO   rP   rQ   rR   rS   rU   rV   rZ   r[   r\   r]   r_   r`   rb   rc   rd   re   rg   rh   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r€   r   r   r   r   r=   Þ   sX   ÿ
r=   c                   @   sò   e Zd Z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d „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;S )=ÚTestCFGraphz3
    Test the numba.controlflow.CFGraph class.
    r   c                 C   sF   t ƒ }|D ]}| |¡ q
| ¡ D ]\}}|D ]}| ||¡ q.q"|S )zG
        Build a CFGraph class from a dict of adjacency lists.
        )r   Úadd_nodeÚitemsZadd_edge)rE   Údr@   ÚgÚnodeZdestsÚdestr   r   r   Úfrom_adj_list„  s    zTestCFGraph.from_adj_listc                 C   s2   |   ddgdgdgg dœ¡}| d¡ | ¡  |S )z“
        A simple CFG corresponding to the following code structure:

            c = (... if ... else ...) + ...
            return b + c
        é   é   é   ©r   rŽ   r�   r�   r   ©rŒ   Úset_entry_pointÚprocess©rE   r‰   r   r   r   Ú	loopless1‘  s    
zTestCFGraph.loopless1c                 C   sD   |   ddgdgdgg ddgddgdgg dœ¡}| d¡ | ¡  |S )	zc
        Same as loopless1(), but with added dead blocks (some of them
        in a loop).
        r�   rŽ   r�   r   é[   é]   é\   )r   rŽ   r�   r�   r–   r˜   r—   é^   r‘   r”   r   r   r   Úloopless1_dead_nodes�  s    ùÿ

z TestCFGraph.loopless1_dead_nodesc              	   C   s:   |   ddgdgdgddgg g dœ¡}| d¡ | ¡  |S )aA  
        A loopless CFG corresponding to the following code structure:

            c = (... if ... else ...) + ...
            if c:
                return ...
            else:
                return ...

        Note there are two exit points, and the entry point has been
        changed to a non-zero value.
        r�   rŽ   r�   é*   é"   )éc   rŽ   r�   r�   rœ   r›   r�   r‘   r”   r   r   r   Ú	loopless2°  s    ÿ
zTestCFGraph.loopless2c                 C   sl   |   dgddgdgdgddgdd	gdgdgd
gdgdgdgddgddgg dgg dœ¡}| d¡ | ¡  |S )a^  
        A CFG with multiple nested loops:

            for y in b:
                for x in a:
                    # This loop has two back edges
                    if b:
                        continue
                    else:
                        continue
            for z in c:
                if z:
                    return ...
        rf   r   é<   é   é   é8   é   é    é,   é9   é=   éD   éW   éG   éP   éX   ©r   rf   r   r    r¡   r£   r¤   r¥   r¢   r¦   rŸ   r§   r¨   rª   r«   r©   r¬   r   r‘   r”   r   r   r   Úmultiple_loopsÃ  s*    ð
zTestCFGraph.multiple_loopsc                 C   sD   |   dgddgddgg ddgdgdgg dœ¡}| d	¡ | ¡  |S )
a  
        A CFG with three loop exits, one of which is also a function
        exit point, and another function exit point:

            for x in a:
                if a:
                    return b
                elif b:
                    break
            return c
        rf   r   é$   é   r£   é   é%   ©r   rf   r   r°   r£   r±   r¯   r²   r   r‘   r”   r   r   r   Úmultiple_exitsè  s    ùÿ

zTestCFGraph.multiple_exitsc              	   C   s<   |   ddgg dgddgdgdgdœ¡}| d¡ | ¡  |S )zç
        A CFG with a infinite loop and an alternate exit point:

            if c:
                return
            while True:
                if a:
                    ...
                else:
                    ...
        r   é   r    é   r°   ©r   rµ   r   r    r°   r¶   r   r‘   r”   r   r   r   Úinfinite_loop1  s    ÿ
zTestCFGraph.infinite_loop1c                 C   s4   |   dgddgdgdgdœ¡}| d¡ | ¡  |S )z§
        A CFG with no exit point at all:

            while True:
                if a:
                    ...
                else:
                    ...
        r2   é   é	   ©r   r2   rº   r¹   r   r‘   r”   r   r   r   Úinfinite_loop2  s    

zTestCFGraph.infinite_loop2c                 C   sl   |   ¡ }|  t| d¡ƒddg¡ |  t| d¡ƒg ¡ |  t| d¡ƒg ¡ |  t| d¡ƒddg¡ d S )Nr   )rŽ   N)r�   Nr�   )r•   rC   ÚsortedÚ
successorsZpredecessorsr”   r   r   r   Útest_simple_properties#  s
    z"TestCFGraph.test_simple_propertiesc                 C   sÚ   |   ¡ }|  t| ¡ ƒdg¡ |  ¡ }|  t| ¡ ƒdg¡ |  ¡ }|  t| ¡ ƒddg¡ |  ¡ }|  t| ¡ ƒddg¡ |  ¡ }|  t| ¡ ƒdg¡ |  ¡ }|  t| ¡ ƒg ¡ |  	¡ }|  t| ¡ ƒddg¡ d S )	Nr�   rœ   r›   r«   r¬   rµ   r°   r²   )
r•   rC   r½   Zexit_pointsrš   rž   r®   r¸   r¼   r´   r”   r   r   r   Útest_exit_points*  s    zTestCFGraph.test_exit_pointsc              	   C   s  |   ¡ }|  t| ¡ ƒd¡ |  t| ¡ ƒddddg¡ |  ¡ }|  t| ¡ ƒd¡ |  t| ¡ ƒddddddg¡ |  ¡ }|  t| ¡ ƒd¡ |  ¡ }|  t| ¡ ƒd¡ |  	¡ }|  t| ¡ ƒd¡ |  
¡ }|  t| ¡ ƒdd	d
dg¡ |  t| ¡ ƒddddg¡ d S )Nr   rŽ   r�   r�   rœ   r›   r�   r–   r˜   r—   r™   )r•   rC   ÚlenZ
dead_nodesr½   Únodesrž   r®   r¸   r´   rš   r”   r   r   r   Útest_dead_nodes:  s.    
ÿÿ
ÿ
ÿzTestCFGraph.test_dead_nodesc                 C   s:  |   ¡ }| d¡}|  t|ƒg ¡ | d¡}|  t|ƒg ¡ | d¡}|  t|ƒddg¡ | d¡}|  t|ƒdddddg¡ |  ¡ }| d¡}|  t|ƒg ¡ | d¡}|  t|ƒg ¡ | d	¡}|  t|ƒddg¡ | d
¡}|  t|ƒd	ddg¡ | d¡}|  t|ƒg ¡ | d¡}|  t|ƒdd
d	ddg¡ d S )Nrœ   r›   r�   r�   rŽ   r�   r¶   r°   r    r   rµ   r   )rž   ZdescendentsrC   r½   r¸   )rE   r‰   rˆ   r   r   r   Útest_descendentsP  s,    









zTestCFGraph.test_descendentsc                 C   sà   |   ¡ }|  | ¡ ddddgddddgf¡ |  ¡ }|  | ¡ ddddddgddddddgf¡ |  ¡ }|  | ¡ ddd	d
gddd
d	gf¡ |  ¡ }|  | ¡ ddddddgddddddgddddddgddddddgf¡ d S )Nr   rŽ   r�   r�   r�   rœ   r›   r2   rº   r¹   rµ   r   r    r°   r¶   )r•   ÚassertInZ
topo_orderrž   r¼   r¸   r”   r   r   r   Útest_topo_orderh  s&    
ÿ
ÿ
ÿ
 ÿÿzTestCFGraph.test_topo_orderc                    s”   ‡ ‡fdd„}ˆ  ¡ ‰ |ddddgddddgfƒ |ddddgddddgddddgfƒ ˆ ¡ ‰ |d	d
ddgdd
d	dgdd
dd	gddd
d	gfƒ d S )Nc              	      sÒ   ˆ  tˆ  | ¡ƒ|¡ ˆ  tˆ  | d d d… ¡ƒ|¡ ˆ  tˆ j| dd�ƒd d d… |¡ ˆ  tˆ j| d d d… dd�ƒd d d… |¡ ˆj | ¡ ˆ  tˆ  | ¡ƒ|¡ ˆ  tˆ j| dd�ƒd d d… |¡ d S )Nr   T)Úreverse)rÅ   ÚlistZ	topo_sortÚrandomÚshuffle)rÂ   Úexpected©r‰   rE   r   r   Úcheck_topo_sortx  s     ÿ(ÿÿz3TestCFGraph.test_topo_sort.<locals>.check_topo_sortr�   r�   rŽ   rœ   r�   r›   r°   r   rf   r¯   )rž   r´   )rE   rÍ   r   rÌ   r   Útest_topo_sortw  s    ÿ ÿzTestCFGraph.test_topo_sortc                 C   sJ   |   t|ƒt|ƒ¡ t|ƒD ](}|   t|| ƒt|| ƒd|f ¡ qd S )Nzmismatch for %r©rC   r½   )rE   ÚgotrË   rŠ   r   r   r   Úcheck_dominators�  s
    ÿzTestCFGraph.check_dominatorsc                    sÌ   ‡ ‡fdd„}ˆ  ¡ ˆ ¡ fD ]B}| ¡ ‰ |ddgƒ |dddgƒ |dddgƒ |dddgƒ qˆ ¡ }| ¡ ‰ |ddgƒ |dddgƒ |dddgƒ |dddgƒ |ddddgƒ |d	dd	dgƒ d S )
Nc                    s   ˆ  tˆ |  ƒ|¡ d S r:   rÏ   ©rˆ   Úl©ÚdomsrE   r   r   Úeq_”  s    z1TestCFGraph.test_dominators_loopless.<locals>.eq_r   rŽ   r�   r�   r�   rœ   r›   )r•   rš   Ú
dominatorsrž   ©rE   rÖ   r‰   r   rÔ   r   Útest_dominators_loopless“  s    z$TestCFGraph.test_dominators_looplessc                 C   sš  |   ¡ }| ¡ }|  |dgddgdddgddddgddddgdddddgdddgdddgd	œ¡ |  ¡ }| ¡ }|  |dgddgdddgddd
dgdddd
dgdddddd
gddddddd
gddddddd
gdddddd
gddddddd
gdddgddddgdddddgddddddgdddddddgddddddgdddddddgdœ¡ |  ¡ }| ¡ }|  |dgddgddgddd
gdddd
gddd
dgdœ¡ d S )Nr   rf   r   r°   r£   r±   r¯   r²   r³   r    r¡   r¤   r¥   r¢   r¦   rŸ   r§   r¨   rª   r«   r©   r¬   r­   rµ   r¶   r·   )r´   r×   rÑ   r®   r¸   ©rE   r‰   rÕ   r   r   r   Útest_dominators_loops¥  s\    

ùÿ


ðÿ

ûÿz!TestCFGraph.test_dominators_loopsc                    sÄ   ‡ ‡fdd„}ˆ  ¡ ˆ ¡ fD ]B}| ¡ ‰ |dddgƒ |dddgƒ |dddgƒ |ddgƒ qˆ ¡ }| ¡ ‰ |ddgƒ |ddgƒ |ddgƒ |dddgƒ |dddgƒ |d	dd	gƒ d S )
Nc                    s   ˆ  tˆ |  ƒ|¡ d S r:   rÏ   rÒ   rÔ   r   r   rÖ   Ó  s    z6TestCFGraph.test_post_dominators_loopless.<locals>.eq_r   r�   rŽ   r�   rœ   r›   r�   )r•   rš   Úpost_dominatorsrž   rØ   r   rÔ   r   Útest_post_dominators_looplessÒ  s    z)TestCFGraph.test_post_dominators_looplessc                 C   s&  |   ¡ }| ¡ }|  |ddgdgdgdgdgddgddgdgd	œ¡ |  ¡ }| ¡ }|  |dd
dddgd
dddgdddddddd
dg	ddddddd
dgdddddd
dgddddddd
dgddddddd
dgddddddd
dgddddd
dgdd
dddgd
ddgddgdgdgdgddgdgdœ¡ d S )Nr   rf   r   r°   r£   r±   r²   r¯   r³   rŸ   r¨   r§   r    r¡   r¢   r¦   r¤   r¥   rª   r«   r¬   r©   r­   )r´   rÜ   rÑ   r®   rÚ   r   r   r   Útest_post_dominators_loopsä  sF    ùÿ

ðÿz&TestCFGraph.test_post_dominators_loopsc              
   C   sl   |   ¡ }| ¡ }|  |dgdgddgdgdgdgdœ¡ |  ¡ }| ¡ }|  |ddgdgd	gd
gdœ¡ d S )Nr   rµ   r   r    r°   r¶   r·   r2   rº   r¹   r»   )r¸   rÜ   rÑ   r¼   rÚ   r   r   r   Ú#test_post_dominators_infinite_loops  s(    ûÿýÿz/TestCFGraph.test_post_dominators_infinite_loopsc                    sf  ‡ fdd„}|ˆ   ¡ dddhtƒ tƒ tƒ dœƒ |ˆ  ¡ tƒ tƒ ddhtƒ tƒ dddhd	œƒ |ˆ  ¡ dddhtƒ tƒ tƒ dœƒ |ˆ  ¡ d
hddhdhdhddhdhtƒ dhtƒ dhdhddhddhtƒ tƒ dhtƒ dœƒ |ˆ  ¡ d
hdddhtƒ ddhdhtƒ tƒ tƒ dœƒ |ˆ  ¡ dd htƒ dhd!dhtƒ tƒ d"œƒ |ˆ  ¡ d#hd$d%htƒ tƒ d&œƒ d S )'Nc                    s   |   ¡ }ˆ  ||¡ d S r:   )Zdominator_treerC   )ÚgraphrË   ZdomtreerN   r   r   Úcheck  s    z.TestCFGraph.test_dominator_tree.<locals>.checkrŽ   r�   r�   r�   rœ   r›   )rŽ   r�   r�   rœ   r›   r�   rf   r   rŸ   r§   r¨   rª   r©   r¬   r«   r    r¡   r¢   r£   r¤   r¥   r¦   )r   rf   rŸ   r§   r¨   r©   r¬   rª   r«   r   r    r¡   r£   r¥   r¤   r¢   r¦   r¯   r²   r°   r±   )r   rf   r¯   r   r£   r±   r²   r°   rµ   r¶   r·   r2   r¹   rº   r»   ©r•   Úsetrž   rš   r®   r´   r¸   r¼   ©rE   rá   r   rN   r   Útest_dominator_tree  sX    ÿÿÿÿ         ýÿ   ÿÿÿÿÿzTestCFGraph.test_dominator_treec                    sâ   ‡ fdd„}|ˆ   ¡ dddddœƒ |ˆ  ¡ dddddddœƒ |ˆ  ¡ dddddœƒ |ˆ  ¡ dddd	d
dddddddddddddœƒ |ˆ  ¡ dddd	d	ddddœƒ |ˆ  ¡ dddd	d
d
dœƒ |ˆ  ¡ dddddœƒ d S )Nc                    s   |   ¡ }ˆ  ||¡ d S r:   )Úimmediate_dominatorsrC   )rà   rË   ÚidomsrN   r   r   rá   8  s    z4TestCFGraph.test_immediate_dominators.<locals>.checkr   r�   r�   r�   ©r�   rŽ   r�   r›   rœ   r�   rf   r   r    r¡   r£   r¢   rŸ   r§   r¨   rª   r©   r­   r³   r·   r2   r»   )r•   rž   rš   r®   r´   r¸   r¼   rä   r   rN   r   Útest_immediate_dominators7  sD    ÿÿÿ         þÿÿÿÿz%TestCFGraph.test_immediate_dominatorsc                    sJ  ‡ fdd„}|ˆ   ¡ tƒ dhdhtƒ dœƒ |ˆ  ¡ dhdhtƒ tƒ tƒ tƒ dœƒ |ˆ  ¡ tƒ dhdhtƒ dœƒ |ˆ  ¡ tƒ dhdhdhddhdhdhdhdhdhtƒ tƒ dhdhtƒ tƒ tƒ d	œƒ |ˆ  ¡ tƒ dhd
dhtƒ d
dhd
hd
htƒ dœƒ |ˆ  ¡ tƒ tƒ tƒ dhdhdhdœƒ |ˆ  ¡ tƒ dhdhdhdœƒ d S )Nc                    s   |   ¡ }ˆ  ||¡ d S r:   )Údominance_frontierrC   )rà   rË   ZdfrN   r   r   rá   N  s    z2TestCFGraph.test_dominance_frontier.<locals>.checkr�   r�   rè   rf   r¡   r¨   r­   r²   r³   r    r·   r2   r»   râ   rä   r   rN   r   Útest_dominance_frontierM  sN    ÿÿÿ         þÿ   ÿÿÿÿz#TestCFGraph.test_dominance_frontierc                 C   sR   |   ¡ |  ¡ fD ]}|  t| ¡ ƒddg¡ q|  ¡ }|  t| ¡ ƒddg¡ d S )Nr   r�   r�   )r•   rš   rC   r½   Úbackbonerž   r”   r   r   r   Útest_backbone_looplessd  s    z"TestCFGraph.test_backbone_looplessc                 C   sh   |   ¡ }|  t| ¡ ƒdddddg¡ |  ¡ }|  t| ¡ ƒdg¡ |  ¡ }|  t| ¡ ƒddg¡ d S )Nr   rf   rŸ   r§   r¨   r2   )r®   rC   r½   rì   r¸   r¼   r”   r   r   r   Útest_backbone_loopsj  s    zTestCFGraph.test_backbone_loopsc                 C   s  |   ¡ |  ¡ |  ¡ fD ]}|  t| ¡ ƒd¡ q|  ¡ }|  t| ¡ ƒdddg¡ | ¡ d }| ¡ d }| ¡ d }|  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒdg¡ |  t|jƒdddddd	d
ddg	¡ |  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒdg¡ |  t|jƒddd	d
g¡ |  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒddg¡ |  t|jƒddg¡ dD ]}|  | |¡g ¡ �qrdD ]}|  | |¡|g¡ �q�dD ]}|  | |¡||g¡ �q°dD ]}|  | |¡|g¡ �qÒ|  ¡ }|  t| ¡ ƒdg¡ | ¡ d }|  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒg ¡ |  t|jƒdddg¡ dD ]}|  | |¡g ¡ �qhdD ]}|  | |¡|g¡ �q†|  ¡ }|  t| ¡ ƒdg¡ | ¡ d }|  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒg ¡ |  t|jƒdddg¡ dD ]}|  | |¡g ¡ �qdD ]}|  | |¡|g¡ �q:|  ¡ }|  t| ¡ ƒdg¡ | ¡ d }|  |jd¡ |  t|j	ƒdg¡ |  t|j
ƒdddg¡ |  t|jƒdddg¡ d D ]}|  | |¡g ¡ �qÖd!D ]}|  | |¡|g¡ �qôd S )"Nr   rf   r¡   r¨   rŸ   r   r    r£   r¤   r¥   r¢   r¦   r§   r«   r©   rª   )r   rŸ   r§   r«   r©   r¬   )rf   r   r    r¢   r¦   )r¡   r£   r¤   r¥   )r¨   rª   r°   r¶   )r   rµ   r   )r    r°   r¶   r2   rº   r¹   )r   )r2   rº   r¹   r±   r¯   )r   r°   r±   r¯   )rf   r   r£   )r•   rš   rž   rC   rÁ   Zloopsr®   r½   ÚheaderÚentriesZexitsÚbodyZin_loopsr¸   r¼   r´   )rE   r‰   Zouter1Zinner1Zouter2rŠ   Úloopr   r   r   Ú
test_loopsr  s€    ÿÿzTestCFGraph.test_loopsc              A   C   sŒ  |   ddhddhddhddhdhddhddhd	hd
dhddhd	hddhddhd	hd	dhd	dhd	hddhdhddhdhddhdhddhdhddhdhdhddhdhdhd d!hd!hd"d#hd$d%hd%hd&d'hd(d'htƒ d)d*hd)hd+d,hd-hd.hd/d0hd1d2hd3d4hd1d4hd1hd.hd5hd"hd6hd7hd8d9hd:d;hd<d=hd:d=hd:hd7hd"htƒ d>œ>¡}| d?¡ | ¡  i }|j|d@�}|  |dAdBh¡ |  |dC dD¡ d S )ENé&   é   é   é   r›   é@   rY   é:   é€   éH   éV   r«   él   r™   éf   ét   é|   é²   é®   éÒ   éÎ   éø   éü   é  é  é(  éF  éJ  ér  éT  év  é|  é~  é2  é†  éÈ  éÊ  é  é6  é$  éJ  é<  éÄ  éT  é`  éb  éÀ  él  éš  év  é|  é†  éÂ  éÐ  éÒ  é0  éÜ  é
  éæ  éì  éö  )>r   rõ   rö   r÷   rô   r›   rY   rù   rø   rû   r«   rü   r™   rþ   rý   rÿ   r   rú   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r"  r#  r   r  r$  r  r%  r&  r(  r*  r+  r,  r)  r'  r  r   )Ústats)r   r  )r)  r&  Ziteration_counté›   )rŒ   rã   r’   r“   Z_find_back_edgesrC   )rE   r‰   r-  Z
back_edgesr   r   r   Útest_loop_dfs_pathologicalº  sŒ    Â@
z&TestCFGraph.test_loop_dfs_pathologicalc                    s$  ‡ fdd„}|ƒ }|ƒ }ˆ   ||¡ ˆ  ddgdgg dgdœ¡}| d¡ | ¡  ˆ   ||¡ |ƒ }| d¡ | ¡  ˆ  ||¡ ˆ  ddgdgdgdgg d	œ¡}| d¡ | ¡  ˆ  ||¡ ˆ  ddgdgg d
œ¡}| d¡ | ¡  ˆ  ddgdgg d
œ¡}| d¡ | ¡  ˆ  ||¡ d S )Nc                     s2   ˆ   ddgdgdgg dœ¡} |  d¡ |  ¡  | S )Nr�   rŽ   r�   r�   r   r‘   )r‰   rN   r   r   Úget_new  s    
z(TestCFGraph.test_equals.<locals>.get_newrŽ   r�   r�   )r   r�   r�   rŽ   r   rö   )r   rŽ   r�   r�   rö   )r   rŽ   r�   )rC   rŒ   r’   r“   ZassertNotEqual)rE   r0  r   r   r‰   r'   Úar   rN   r   Útest_equals  s2    

ÿ


zTestCFGraph.test_equalsN)r   ) r�   r‚   rƒ   Ú__doc__rŒ   r•   rš   rž   r®   r´   r¸   r¼   r¿   rÀ   rÃ   rÄ   rÆ   rÎ   rÑ   rÙ   rÛ   rÝ   rÞ   rß   rå   ré   rë   rí   rî   ró   r/  r2  r   r   r   r   r…     s:   
%-#HJr…   c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestRealCodeDomFronta)  Test IDOM and DOMFRONT computation on real python bytecode.
    Note: there will be less testing on IDOM (esp in loop) because of
    the extra blocks inserted by the interpreter.  But, testing on DOMFRONT
    (which depends on IDOM) is easier.

    Testing is done by associating names to basicblock by using globals of
    the pattern "SET_BLOCK_<name>", which are scanned by
    `.get_cfa_and_namedblocks` into *namedblocks* dictionary.  That way, we
    can check that a block of a certain name is a IDOM or DOMFRONT of another
    named block.
    c                 C   s   t |ƒ}| ¡  |S r:   )r   Úrun)rE   ÚbcÚcfar   r   r   r7  ;  s    zTestRealCodeDomFront.cfac                 C   s2   t  |¡}t|d�}|  |¡}|  ||¡}||fS )N)Zfunc_id)r   Úfrom_functionr   r7  Ú_scan_namedblocks)rE   ÚfnÚfidr6  r7  Únamedblocksr   r   r   Úget_cfa_and_namedblocks@  s
    


z,TestRealCodeDomFront.get_cfa_and_namedblocksc                 C   s¼   i }t dd„ | ¡ D ƒƒ}d}|D ]”}|jdkr"|jt|jƒ }| |¡r"|t|ƒd… }t||dd… |d d g ƒD ]&\}	}
|	|j	  kr˜|
k rzn qz qªqzt
dƒ‚|	}|||< q"|S )	zÉScan namedblocks as denoted by a LOAD_GLOBAL bytecode referring
        to global variables with the pattern "SET_BLOCK_<name>", where "<name>"
        would be the name for the current block.
        c                 S   s   g | ]
}|j ‘qS r   )Úoffset)Ú.0r   r   r   r   Ú
<listcomp>Y  s     z:TestRealCodeDomFront._scan_namedblocks.<locals>.<listcomp>Z
SET_BLOCK_ÚLOAD_GLOBALNr   r   zunreachable loop)r½   Z
iterblocksÚopnameÚco_namesr	   ÚargÚ
startswithrÁ   Úzipr>  ÚAssertionError)rE   r6  r7  r<  ÚblocksÚprefixÚinstÚgvÚnameÚsrG   Zblknor   r   r   r9  S  s    

(
z&TestRealCodeDomFront._scan_namedblocksc                 C   s”   dd„ }|   |¡\}}|j ¡ }tdk r@|  |d ||d  ¡ |j ¡ }|  ||d  ¡ |  ||d  ¡ tdk r�|  |d h||d  ¡ d S )Nc                 S   s.   d}t  d}tr&t |d7 }|d7 }qt |S r!   )ÚSET_BLOCK_AÚSET_BLOCK_B0ÚSET_BLOCK_B1ÚSET_BLOCK_C)ÚnÚcr   r   r   r   Úfoom  s    
z+TestRealCodeDomFront.test_loop.<locals>.foo©r2   r   ÚB0ÚB1ÚAÚC)r=  rà   ræ   r
   rC   rê   ÚassertFalse©rE   rT  r7  Zblkptsrç   Zdomfrontr   r   r   Ú	test_loopl  s    

zTestRealCodeDomFront.test_loopc                 C   s\  dd„ }|   |¡\}}|j ¡ }|  |d |d ¡ tdk rT|  |d ||d  ¡ |j ¡ }|  ||d  ¡ |  ||d  ¡ tdk r¤|  |d	 h||d
  ¡ tdk rÌ|  |d |d h||d  ¡ |  |d h||d  ¡ |  |d h||d  ¡ tdk �rX|  |d h||d  ¡ |  |d	 h||d  ¡ |  |d	 h||d	  ¡ d S )Nc                 S   s<   t  tr4t tr.t tr t q.n| r(t t qt	 qt
 d S r:   )rN  rO  rP  ÚSET_BLOCK_C0ÚSET_BLOCK_C1ZSET_BLOCK_D0ZSET_BLOCK_D1ZSET_BLOCK_D2ÚSET_BLOCK_EÚSET_BLOCK_FÚSET_BLOCK_G)rR  r   r   r   rT  ˆ  s    z<TestRealCodeDomFront.test_loop_nested_and_break.<locals>.fooZD0ÚC1rU  ÚC0rX  ÚGrV  rW  ÚFZD1ÚEZD2)r=  rà   ræ   rC   r
   rê   rZ  r[  r   r   r   Útest_loop_nested_and_break‡  s*    


ÿ
z/TestRealCodeDomFront.test_loop_nested_and_breakc                 C   sŽ  dd„ }|   |¡\}}|j ¡ }|  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d	  ¡ |  |d ||d
  ¡ |j ¡ }|  ||d  ¡ |  ||d  ¡ |  ||d
  ¡ |  |d h||d  ¡ |  |d h||d  ¡ |  |d h||d  ¡ |  |d h||d  ¡ |  |d
 h||d	  ¡ d S )Nc                 S   sT   d}t  | |k rt d}ntr(t d}nt d}t | | dkrLt |d7 }t |S )Nr   r   r&   r2   )rN  ÚSET_BLOCK_Br]  r^  ÚSET_BLOCK_Dr_  r`  ra  )r1  ÚbrS  r   r   r   rT  ±  s     z.TestRealCodeDomFront.test_if_else.<locals>.foorX  ÚBrc  rb  ÚDrf  re  rd  ©r=  rà   ræ   rC   rê   rZ  r[  r   r   r   Útest_if_else°  s&    

z!TestRealCodeDomFront.test_if_elsec                 C   sJ  dd„ }|   |¡\}}|j ¡ }|  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d  ¡ |  |d ||d	  ¡ |j ¡ }|  ||d  ¡ |  ||d	  ¡ |  |d h||d  ¡ |  |d h||d
  ¡ |  |d h||d  ¡ |  |d	 h||d  ¡ d S )Nc                  S   s<   t r4t trt d} ntr$t d} nt d} t t t	 | S )Nr   r   r&   )
ZSET_BLOCK_A0ZSET_BLOCK_A1rO  rP  r]  r^  ZSET_BLOCK_C2ri  r_  r`  )r1  r   r   r   rT  Û  s    z5TestRealCodeDomFront.test_if_else_nested.<locals>.fooZA0ÚA1rW  rc  rl  rf  re  rb  rm  r[  r   r   r   Útest_if_else_nestedÚ  s     

z(TestRealCodeDomFront.test_if_else_nestedc                 C   sô   dd„ }|   |¡\}}|j ¡ }tdkr6|  d|¡ n|  |d |¡ |  |d ||d  ¡ |  |d ||d  ¡ |j ¡ }tdk r˜|  |d |¡ |  ||d  ¡ |  ||d  ¡ |  |d h||d  ¡ |  |d h||d  ¡ d S )	Nc                   S   s   t  trt d S t qt d S r:   )rN  rh  rQ  ri  r_  r   r   r   r   rT     s    z4TestRealCodeDomFront.test_infinite_loop.<locals>.foorU  rf  rk  rY  rl  rX  )r=  rà   ræ   r
   ZassertNotInrC   rê   rZ  r[  r   r   r   Útest_infinite_loopÿ  s    	

z'TestRealCodeDomFront.test_infinite_loopN)r�   r‚   rƒ   r3  r7  r=  r9  r\  rg  rn  rp  rq  r   r   r   r   r4  /  s   )*%r4  Ú__main__)3rA   ZunittestZnumba.core.controlflowr   r   Znumba.core.compilerr   r   Z
numba.corer   Znumba.core.bytecoder   r   r	   Znumba.core.utilsr
   Znumba.tests.supportr   r„   Zenable_pyobjectZforceobj_flagsZforce_pyobjectrM   Znrtr   r   r   r    r"   r#   r$   r%   r(   r)   r*   r,   r-   r.   r/   r1   r3   r4   r6   r7   r9   r<   r=   r…   r4  r�   Úmainr   r   r   r   Ú<module>   s^   		

		

	 "     5 p
