B
      ›\&0  ã               @   s‚   d dl mZmZmZ d dlZd dlmZmZ d dl	m
Z
mZmZmZmZ ddlmZmZ d dlmZ dd	„ ZG d
d„ deeƒZdS )é    )Úprint_functionÚabsolute_importÚdivisionN)Úcompile_isolatedÚrun_frontend)ÚtypesÚrewritesÚirÚjitÚir_utilsé   )ÚTestCaseÚMemoryLeakMixin)Údead_branch_prunec             C   s0   t | ƒ}G dd„ dtƒ}tj d||ƒ|¡ |S )Nc               @   s   e Zd Zdd„ ZdS )z#compile_to_ir.<locals>.MockPipelinec             S   s.   d | _ d | _d | _|| _d | _d | _d | _d S )N)Z	typingctxZ	targetctxÚargsÚfunc_irZtypemapZreturn_typeZ	calltypes)Úselfr   © r   ú8lib/python3.7/site-packages/numba/tests/test_analysis.pyÚ__init__   s    z,compile_to_ir.<locals>.MockPipeline.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   ÚMockPipeline   s   r   zbefore-inference)r   Úobjectr   Zrewrite_registryZapply)Úfuncr   r   r   r   r   Úcompile_to_ir   s
    
r   c               @   s„   e Zd 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d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚTestBranchPrunez
    Tests branch pruning
    Fc             C   s>   g }x4|j  ¡ D ]&}dd„ |jtjdD ƒ}| |¡ qW |S )Nc             S   s   g | ]}|‘qS r   r   )Ú.0Ú_r   r   r   ú
<listcomp>)   s    z1TestBranchPrune.find_branches.<locals>.<listcomp>)Úcls)ÚblocksÚvaluesZ
find_instsr	   ZBranchÚextend)r   Zthe_irZbranchesZblkZtmpr   r   r   Úfind_branches&   s
    zTestBranchPrune.find_branchesc          
   G   s  t |ƒ}| ¡ }| jr.tdƒ tdƒ | ¡  t||ƒ |}| jrRtdƒ | ¡  |  |¡}|  t|ƒt|ƒ¡ g }	x^t	|ƒD ]R\}
}||
 }|dkr¤|	 
|j¡ q~|dkrº|	 
|j¡ q~|d krÄq~ds~tdƒ‚q~W tdd	„ |j ¡ D ƒƒ}td
d	„ |j ¡ D ƒƒ}y|  ||t|	ƒ ¡ W nF tk
rb } z&td|ƒ td|ƒ td|	ƒ |‚W d d }~X Y nX t||ƒ}|j|Ž }||Ž }|  ||¡ d S )NzP================================================================================zbefore prunezafter pruneTFr   Zunreachablec             S   s   g | ]}|‘qS r   r   )r   r   r   r   r   r    X   s    z0TestBranchPrune.assert_prune.<locals>.<listcomp>c             S   s   g | ]}|‘qS r   r   )r   r   r   r   r   r    Y   s    Ú
new_labelsÚoriginal_labelsÚexpect_removed)r   ÚcopyÚ_DEBUGÚprintÚdumpr   r%   ÚassertEqualÚlenÚ	enumerateÚappendZtruebrZfalsebrÚAssertionErrorÚsetr"   Úkeysr   Zentry_point)r   r   Zargs_tysZpruner   r   ZbeforeZafterÚbefore_branchesr(   ÚidxÚbranchr'   r&   ÚeZcresZresZexpectedr   r   r   Úassert_prune-   sH    






zTestBranchPrune.assert_prunec             C   sü   dd„ }|   |t d¡fdgd ¡ dd„ }|   |t d¡fdgd ¡ dd„ }|   |t d¡fdgd ¡ |   |t d¡fdgd¡ d	d„ }|   |t d¡fdgd ¡ |   |t d¡fd gd¡ d
d„ }|   |t d¡fdgd ¡ |   |t d¡fd gd¡ d S )Nc             S   s   ddkrdS d S )Nr   r   gn†ðù!	@r   )Úxr   r   r   Úimplk   s    z,TestBranchPrune.test_single_if.<locals>.implÚnoneTc             S   s   ddkrdS d S )Nr   gn†ðù!	@r   )r9   r   r   r   r:   q   s    Fc             S   s   | d krdS d S )Ngn†ðù!	@r   )r9   r   r   r   r:   w   s    é
   c             S   s   | dkrdS d S )Nr<   gn†ðù!	@r   )r9   r   r   r   r:   ~   s    c             S   s   | dkrd}d S )Nr<   gn†ðù!	@r   )r9   Úzr   r   r   r:   …   s    )r8   r   ÚNoneTypeÚIntegerLiteral)r   r:   r   r   r   Útest_single_ifi   s    zTestBranchPrune.test_single_ifc             C   s@   dd„ }|   |t d¡fdgd ¡ |   |t d¡fdgd¡ d S )Nc             S   s   | d krdS dS d S )Ngn†ðù!	@gl&ßlsãù?r   )r9   r   r   r   r:   ˜   s    z1TestBranchPrune.test_single_if_else.<locals>.implr;   Fr<   T)r8   r   r>   r?   )r   r:   r   r   r   Útest_single_if_else–   s    z#TestBranchPrune.test_single_if_elsec             C   s|   dd„ }|   |t d¡fdgd ¡ |   |t d¡fd gd¡ dd„ }|   |t d¡fdgd ¡ |   |t d¡fd gd¡ d S )Nc             S   s   | dkrdS d S )Néd   gn†ðù!	@r   )r9   r   r   r   r:   £   s    z6TestBranchPrune.test_single_if_const_val.<locals>.implr;   TrB   c             S   s   d| krdS d S )NrB   gn†ðù!	@r   )r9   r   r   r   r:   ª   s    )r8   r   r>   r?   )r   r:   r   r   r   Útest_single_if_const_val¡   s    z(TestBranchPrune.test_single_if_const_valc             C   s”   dd„ }|   |t d¡fd d gdd¡ |   |t d¡fd dgd d ¡ |   |t d¡t d¡fdgdd ¡ |   |t d¡t d¡fd gdd¡ d S )	Nc             S   s   | |krdS dS d S )Ngn†ðù!	@gl&ßlsãù?r   )r9   Úyr   r   r   r:   ´   s    z?TestBranchPrune.test_single_if_else_two_const_val.<locals>.implrB   é   r;   FTiè  )r8   r   r?   r>   )r   r:   r   r   r   Ú!test_single_if_else_two_const_val²   s    z1TestBranchPrune.test_single_if_else_two_const_valc             C   s„   dd„ }|   |t d¡fdd gd ¡ |   |t d¡fdd gd¡ dd„ }|   |t d¡fd d gd ¡ |   |t d¡fdd gd¡ d S )Nc             S   s(   d}| d krd}nd}|r d}nd}|S )NFTé   r<   éýÿÿÿr   )r9   Úx_is_none_workÚdeadrD   r   r   r   r:   Å   s    zJTestBranchPrune.test_single_if_else_w_following_undetermined.<locals>.implr;   Fr<   Tc             S   s$   d}| d krd}n |rd}nd}|S )NFTr<   rH   r   )r9   rI   rD   r   r   r   r:   Õ   s    )r8   r   r>   r?   )r   r:   r   r   r   Ú,test_single_if_else_w_following_undeterminedÃ   s    z<TestBranchPrune.test_single_if_else_w_following_undeterminedc             C   sD   dd„ }|   |t d¡fdd gd ¡ |   |t d¡fdd gd¡ d S )Nc             S   s4   d}d}| d krd}nd}||kr(d}nd}||fS )NrB   é   rG   r<   rH   r   )r9   Úone_hundredrI   rJ   rD   r   r   r   r:   ç   s    z:TestBranchPrune.test_double_if_else_rt_const.<locals>.implr;   Fr<   T)r8   r   r>   r?   )r   r:   r   r   r   Útest_double_if_else_rt_constå   s    z,TestBranchPrune.test_double_if_else_rt_constc             C   s@   dd„ }|   |t d¡fd gd¡ |   |t d¡fd gd¡ d S )Nc             S   s   d}| |krd}nd}|S )NrB   gn†ðù!	@gl&ßlsãù?r   )r9   rM   rD   r   r   r   r:   û   s
    zCTestBranchPrune.test_double_if_else_non_literal_const.<locals>.implr<   rB   )r8   r   r?   )r   r:   r   r   r   Ú%test_double_if_else_non_literal_constù   s    	z5TestBranchPrune.test_double_if_else_non_literal_constc             C   sD   dd„ }|   |t d¡fddgd ¡ |   |t d¡fddgd¡ d S )Nc             S   s,   | d krd}nd}| d k	r d}nd}||fS )Nr<   é(   rB   i  r   )r9   rD   r=   r   r   r   r:   	  s    z@TestBranchPrune.test_single_two_branches_same_cond.<locals>.implr;   FTr<   )r8   r   r>   r?   )r   r:   r   r   r   Ú"test_single_two_branches_same_cond  s    z2TestBranchPrune.test_single_two_branches_same_condc             C   sb   ddd„}|   |t d ¡fddgd ¡ |   |t d¡fddgd ¡ |   |t d¡fddgd¡ d S )Nc             S   s,   | d krd}nd}| d k	r d}nd}||fS )Nr<   rP   rB   i  r   )r9   rD   r=   r   r   r   r:     s    z5TestBranchPrune.test_cond_is_kwarg_none.<locals>.implFTr;   r<   )N)r8   r   ÚOmittedr>   r?   )r   r:   r   r   r   Útest_cond_is_kwarg_none  s
    
z'TestBranchPrune.test_cond_is_kwarg_nonec             C   s~   ddd„}|   |t d¡fd d gd¡ |   |t d¡fd d gd¡ |   |t d¡fd d gd¡ |   |t d¡fddgd ¡ d S )	Néè  c             S   s,   | dkrd}nd}| dkr d}nd}||fS )Niè  r<   rP   rB   i  r   )r9   rD   r=   r   r   r   r:   /  s    z6TestBranchPrune.test_cond_is_kwarg_value.<locals>.implr   r;   TF)rT   )r8   r   rR   r?   r>   )r   r:   r   r   r   Útest_cond_is_kwarg_value-  s    
z(TestBranchPrune.test_cond_is_kwarg_valuec                s@   dd„ }‡ fdd„}||t  d¡fdƒ ||t  d¡fdƒ d S )	Nc             S   s   | d krdS dS )Nr<   é   r   )r9   r   r   r   ÚfnE  s    z8TestBranchPrune.test_cond_rewrite_is_correct.<locals>.fnc                s¼   t | ƒ}ˆ  |¡}ˆ  t|ƒd¡ |d j}t ||¡}ˆ  |jd¡ ˆ jrdt	dƒ t	dƒ | 
¡  t||ƒ ˆ jrŒt	dƒ t	dƒ | 
¡  t ||¡}ˆ  t|tjƒ¡ ˆ  |j|¡ d S )Nr   r   ZbinopzP================================================================================zbefore prunezafter prune)r   r%   r-   r.   Zcondr   Zget_definitionÚopr*   r+   r,   r   Z
assertTrueÚ
isinstancer	   ZConstÚvalue)r   Zarg_tysZbit_valr   r4   Zcondition_varZcondition_defnZnew_condition_defn)r   r   r   ÚcheckJ  s$    


z;TestBranchPrune.test_cond_rewrite_is_correct.<locals>.checkr;   r   r<   r   )r   r>   r?   )r   rW   r[   r   )r   r   Útest_cond_rewrite_is_correctB  s    z,TestBranchPrune.test_cond_rewrite_is_correctc             C   sˆ   t dd„ ƒ}|  |t d¡dƒd¡ |  |t d¡d ƒd¡ |  |t d¡ d¡dƒg ¡ |  |t d¡ d¡d ƒg ¡ |  |j¡ d S )Nc             S   s   | j dkr|d krdS dS g S )Nr   r<   rV   )Úndim)ÚaÚbr   r   r   Úbugn  s
    
z3TestBranchPrune.test_obj_mode_fallback.<locals>.bugr<   rL   rV   )rE   é   )r
   r-   ÚnpZarangeZreshapeZassertFalseZnopython_signatures)r   r`   r   r   r   Útest_obj_mode_fallbackj  s    z&TestBranchPrune.test_obj_mode_fallbackN)r   r   r   Ú__doc__r*   r%   r8   r@   rA   rC   rF   rK   rN   rO   rQ   rS   rU   r\   rc   r   r   r   r   r      s    <-"(r   )Z
__future__r   r   r   Znumpyrb   Znumba.compilerr   r   Znumbar   r   r	   r
   r   Zsupportr   r   Znumba.analysisr   r   r   r   r   r   r   Ú<module>   s   