U
    ,d?                     @   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 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Z/e0d;krze1  dS )<    N)CFGraphControlFlowAnalysis)compile_isolatedFlags)types)FunctionIdentityByteCode)	PYVERSION)TestCaseTc                 C   s   d}t | D ]}||7 }q|S Nr   rangexyresulti r   A/tmp/pip-unpacked-wheel-eu7e0c37/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
    r0   c                 C   s(   | |krdS | dks|dkr dS dS d S )Nr   r   r%      r   r/   r   r   r   ifelse_usecase2   s
    r2   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   r/   r   r   r   ifelse_usecase3   s    r3   c                 C   s   | |krdS d S Nr   r   r/   r   r   r   ifelse_usecase4   s    r5   c                 C   s   | |krdS dS )NTFr   r/   r   r   r   ternary_ifelse_usecase1   s    r6   c                 C   s<   | }|}||d krq |d7 }q|d7 }||krq4q||fS r4   r   )r   r   Lr   r   r   r   double_infinite_loop   s    
r8   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>   Z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=   )rF   r   rD   r>   r   r   r   test_for_loop1   s    zTestFlowControl.test_for_loop1c                 C   s   | j td d S Nr=   )rI   no_pyobj_flagsrD   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 rG   )rF   r   rH   r   r   r   test_for_loop2   s    zTestFlowControl.test_for_loop2c                 C   s   | j td d S rJ   )rN   rK   rL   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)rF   r   rH   r   r   r   test_for_loop3  s    zTestFlowControl.test_for_loop3c                 C   s   | j td d S rJ   )rP   rK   rL   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=   )rF   r   rH   r   r   r   test_for_loop4  s    zTestFlowControl.test_for_loop4c                 C   s   | j td d S rJ   )rS   rK   rL   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=   )rF   r!   rH   r   r   r   test_for_loop5  s    zTestFlowControl.test_for_loop5c                 C   s   | j td d S rJ   )rX   rK   rL   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 rU   )rF   r"   rH   r   r   r   test_for_loop6  s    zTestFlowControl.test_for_loop6c                 C   s   | j td d S rJ   )rZ   rK   rL   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=   )rF   r#   rH   r   r   r   test_for_loop7"  s    zTestFlowControl.test_for_loop7c                 C   s   | j td d S rJ   )r]   rK   rL   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=   )rF   r$   rH   r   r   r   test_for_loop8(  s    zTestFlowControl.test_for_loop8c                 C   s   | j td d S rJ   )r`   rK   rL   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 r_   )rF   r'   rH   r   r   r   test_for_loop9.  s    zTestFlowControl.test_for_loop9c                 C   s   | j td d S rJ   )rb   rK   rL   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=   )rF   r(   rH   r   r   r   test_for_loop104  s    zTestFlowControl.test_for_loop10c                 C   s   | j td d S rJ   )re   rK   rL   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=   )rF   r)   rH   r   r   r   test_while_loop1:  s    z TestFlowControl.test_while_loop1c                 C   s   | j td d S rJ   )rh   rK   rL   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 rg   )rF   r+   rH   r   r   r   test_while_loop2@  s    z TestFlowControl.test_while_loop2c                 C   s   | j td d S rJ   )rj   rK   rL   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 rR   )rF   r,   rH   r   r   r   test_while_loop3F  s    z TestFlowControl.test_while_loop3c                 C   s   | j td d S rJ   )rl   rK   rL   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 rg   )rF   r-   rH   r   r   r   test_while_loop4L  s    z TestFlowControl.test_while_loop4c                 C   s   | j td d S rJ   )rn   rK   rL   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=   )rF   r.   rH   r   r   r   test_while_loop5R  s    z TestFlowControl.test_while_loop5c                 C   s   | j td d S rJ   )rp   rK   rL   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=   )rF   r0   rH   r   r   r   test_ifelse1X  s    zTestFlowControl.test_ifelse1c                 C   s   | j td d S rJ   )rs   rK   rL   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 rr   )rF   r2   rH   r   r   r   test_ifelse2^  s    zTestFlowControl.test_ifelse2c                 C   s   | j td d S rJ   )ru   rK   rL   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 rr   )rF   r3   rH   r   r   r   test_ifelse3d  s    zTestFlowControl.test_ifelse3c                 C   s   | j td d S rJ   )rw   rK   rL   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 rr   )rF   r5   rH   r   r   r   test_ifelse4j  s    zTestFlowControl.test_ifelse4c                 C   s   | j td d S rJ   )ry   rK   rL   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 rr   )rF   r6   rH   r   r   r   test_ternary_ifelse1p  s    z$TestFlowControl.test_ternary_ifelse1c                 C   s   | j td d S rJ   )r{   rK   rL   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 rg   )rF   r8   rH   r   r   r   test_double_infinite_loopw  s    z)TestFlowControl.test_double_infinite_loopc                 C   s   | j td d S rJ   )r}   rK   rL   r   r   r   test_double_infinite_loop_npm{  s    z-TestFlowControl.test_double_infinite_loop_npmN)/__name__
__module____qualname__enable_pyobj_flagsrF   rI   rM   rN   rO   rP   rQ   rS   rT   rX   rY   rZ   r[   r]   r^   r`   ra   rb   rc   re   rf   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rs   rt   ru   rv   rw   rx   ry   rz   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)rD   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rD   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 ...
        rd   r   <         8          ,   9   =   D   W   G   P   X   r   rd   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
        rd   r   $      r      %   r   rd   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:
                    ...
        r1      	   r   r1   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   rB   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   rB   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   rB   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descendentsrB   r   r   )rD   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   r1   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   rD   r   r   check_topo_sortx  s     (z3TestCFGraph.test_topo_sort.<locals>.check_topo_sortr   r   r   r   r   r   r   r   rd   r   )r   r   )rD   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rB   r   )rD   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 r9   r   r   ldomsrD   r   r   eq_  s    z1TestCFGraph.test_dominators_loopless.<locals>.eq_r   r   r   r   r   r   r   )r   r   
dominatorsr   rD   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   rd   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   rD   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 r9   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   rd   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   r1   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 r9   )Zdominator_treerB   )graphr   ZdomtreerL   r   r   check  s    z.TestCFGraph.test_dominator_tree.<locals>.checkr   r   r   r   r   r   )r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rd   r   r   r   r   r   r   r   r   r   r1   r   r   r   r   setr   r   r   r   r   r   rD   r   r   rL   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 r9   )immediate_dominatorsrB   )r   r   idomsrL   r   r   r   8  s    z4TestCFGraph.test_immediate_dominators.<locals>.checkr   r   r   r   r   r   r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r1   r   )r   r   r   r   r   r   r   r   r   rL   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 r9   )dominance_frontierrB   )r   r   ZdfrL   r   r   r   N  s    z2TestCFGraph.test_dominance_frontier.<locals>.checkr   r   r   rd   r   r   r   r   r   r   r   r1   r   r   r   r   rL   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   rB   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   rd   r   r   r   r1   )r   rB   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   rd   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )rd   r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   )r   r   r   r1   r   r   )r   )r1   r   r   r   r   )r   r   r   r   )rd   r   r   )r   r   r   rB   r   Zloopsr   r   headerentriesZexitsbodyZin_loopsr   r   r   )rD   r   Zouter1Zinner1Zouter2r   Z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   @   rW   :      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   rW   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_edgesrB   )rD   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   rL   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   )rB   r   r   r   ZassertNotEqual)rD   r-  r   r   r   r&   ar   rL   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,  r/  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 r9   )r   run)rD   bccfar   r   r   r4  ;  s    zTestRealCodeDomFront.cfac                 C   s2   t |}t|d}| |}| ||}||fS )N)Zfunc_id)r   from_functionr   r4  _scan_namedblocks)rD   fnZfidr3  r4  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|j }||r"|t|d }t||dd |d d g D ]&\}	}
|	|j  kr|
k rvn qv qqvt	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_namesarg
startswithr   zipr:  AssertionError)rD   r3  r4  r8  blocksprefixinstgvnamesrE   Zblknor   r   r   r6  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r1   r   B0B1AC)r9  r   r   r	   rB   r   assertFalserD   rP  r4  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 r9   )rJ  rK  rL  SET_BLOCK_C0SET_BLOCK_C1ZSET_BLOCK_D0ZSET_BLOCK_D1ZSET_BLOCK_D2SET_BLOCK_ESET_BLOCK_FSET_BLOCK_G)rN  r   r   r   rP    s    z<TestRealCodeDomFront.test_loop_nested_and_break.<locals>.fooZD0C1rQ  C0rT  GrR  rS  FZD1EZD2)r9  r   r   rB   r	   r   rV  rW  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%   r1   )rJ  SET_BLOCK_BrY  rZ  SET_BLOCK_Dr[  r\  r]  )r.  brO  r   r   r   rP    s     z.TestRealCodeDomFront.test_if_else.<locals>.foorT  Br_  r^  Drb  ra  r`  r9  r   r   rB   r   rV  rW  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_A1rK  rL  rY  rZ  ZSET_BLOCK_C2re  r[  r\  )r.  r   r   r   rP    s    z5TestRealCodeDomFront.test_if_else_nested.<locals>.fooZA0A1rS  r_  rh  rb  ra  r^  ri  rW  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 r9   )rJ  rd  rM  re  r[  r   r   r   r   rP     s    z4TestRealCodeDomFront.test_infinite_loop.<locals>.foorQ  rb  rg  rU  rh  rT  )r9  r   r   r	   ZassertNotInrB   r   rV  rW  r   r   r   test_infinite_loop  s    	

z'TestRealCodeDomFront.test_infinite_loopN)r   r   r   r0  r4  r9  r6  rX  rc  rj  rl  rm  r   r   r   r   r1  /  s   )*%r1  __main__)2r@   ZunittestZnumba.core.controlflowr   r   Znumba.core.compilerr   r   Z
numba.corer   Znumba.core.bytecoder   r   Znumba.core.utilsr	   Znumba.tests.supportr
   r   Zenable_pyobjectZforceobj_flagsZforce_pyobjectrK   Znrtr   r   r   r   r!   r"   r#   r$   r'   r(   r)   r+   r,   r-   r.   r0   r2   r3   r5   r6   r8   r;   r<   r   r1  r   mainr   r   r   r   <module>   s^   		

		

	 "     5 p
