U
    9%ek                     @   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   \/var/www/html/Darija-Ai-API/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 Nir   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 Nd   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 qdD ]}| ||||g qd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  qd!D ]}| |||g qd 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 qqzt
d|	}|||< q"|S )	zScan 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
