U
    ,‰dXN  ã                   @   s
  d dl Z d dlmZ d dlZd dlZd dl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mZmZ d dlmZmZ d d	lmZ G d
d„ de jƒZG dd„ de jƒZG dd„ deƒZG dd„ deƒZdZG dd„ deƒZG dd„ deƒZedkre  ¡  dS )é    N)ÚTestCase)Úobjmode)ÚirÚcompiler)Úerrors)ÚCompilerBaseÚReconstructSSA)ÚFunctionPassÚPassManagerÚregister_pass)ÚTranslateByteCodeÚIRProcessing)Únjitc                   @   s   e Zd Zdd„ ZdS )ÚTestIRc                 C   sj  d}t jd t j|ddd}t j|t j|ddd}|jdt j|ddd}|  | d¡|¡ |  t|jƒd¡ |jd	t j|d
dd}|  t|jƒd¡ |  t|jƒd¡ |  | d	¡|¡ |  | d	¡|¡ |jd	t j|ddd}|  | d	¡|¡ |  	| d	¡| ¡ |  | d	¡|¡ z|jd	t j|ddd W n t j
k
rT   Y nX |  dt j
 ¡ d S )Nz<?>é   )ÚfilenameÚline©ÚparentÚlocé   Úappleé   )r   Úorangeé   é   zExpecting an %s)r   ÚScopeÚLocÚdefineZassertIsÚgetÚassertEqualÚlenZ	localvarsZassertIsNotZRedefinedErrorZfail)Úselfr   ÚtopÚlocalr   r   Zmore_orange© r%   ú7/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_ir.pyÚtest_IRScope   s,    ÿ
zTestIR.test_IRScopeN)Ú__name__Ú
__module__Ú__qualname__r'   r%   r%   r%   r&   r      s   r   c                   @   s”   e Zd Ze ddej¡Ze ddej¡Ze ddej¡Ze ddej¡Z	e ddej¡Z
e ddd	¡Ze dd
d	¡Ze ddd	¡Zg g fdd„ZdS )ÚCheckEqualityNÚaÚbÚcÚdÚeZmockr   r   r   r   c                 C   s4   |D ]}|   ||k¡ q|D ]}|   ||k¡ qd S ©N)Ú
assertTrue)r"   ÚbaseÚsameÚ	differentÚsr/   r%   r%   r&   ÚcheckC   s    zCheckEquality.check)r(   r)   r*   r   ÚVarÚunknown_locÚvar_aÚvar_bÚvar_cÚvar_dZvar_er   Úloc1Úloc2Úloc3r7   r%   r%   r%   r&   r+   8   s   r+   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú
TestIRMetaz0
    Tests IR node meta, like Loc and Scope
    c                 C   s˜   t  ddd¡}t  ddd¡}t  ddd¡}t  ddd¡}t  ddd¡}| j||g|||gd t jddddd}t jdddd	d}| j|||gd
 d S )NÚfiler   r   Zpiler   ©r4   r5   F)Zmaybe_decoratorT©r4   )r   r   r7   ©r"   r,   r-   r.   r/   r0   ÚfÚgr%   r%   r&   Útest_locN   s    zTestIRMeta.test_locc           	      C   sª   t  d | j¡}t  d | j¡}t  d | j¡}| j|||gd t  || j¡}t  || j¡}t  || j¡}t  || j¡}| j||||gd t  || j¡}| j||gd d S ©NrD   )r   r   r>   r?   r7   )	r"   Zparent1Zparent2Zparent3r,   r-   r.   r/   r0   r%   r%   r&   Ú
test_scopeZ   s    zTestIRMeta.test_scopeN)r(   r)   r*   Ú__doc__rH   rJ   r%   r%   r%   r&   rA   J   s   rA   c                   @   sØ   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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d0d1„ Zd2d3„ Zd4S )5ÚTestIRNodesz
    Tests IR nodes
    c                 C   s$   t  ¡ }t  ¡ }| j||gd d S rI   )r   Z
Terminatorr7   )r"   Út1Út2r%   r%   r&   Útest_terminatorp   s    zTestIRNodes.test_terminatorc                 C   sR   t  d| j¡}t  d| j¡}t  d| j¡}t  d| j¡}| j|||g|gd d S ©Nr   r   rC   )r   ZJumpr>   r?   r7   ©r"   r,   r-   r.   r/   r%   r%   r&   Ú	test_jumpv   s
    zTestIRNodes.test_jumpc                 C   sZ   t  | j| j¡}t  | j| j¡}t  | j| j¡}t  | j| j¡}| j|||g|gd d S ©NrC   )r   ZReturnr:   r>   r?   r;   r7   rQ   r%   r%   r&   Útest_return}   s
    zTestIRNodes.test_returnc                 C   sZ   t  | j| j¡}t  | j| j¡}t  | j| j¡}t  | j| j¡}| j|||g|gd d S rS   )r   ZRaiser:   r>   r?   r;   r7   rQ   r%   r%   r&   Ú
test_raise„   s
    zTestIRNodes.test_raisec                 C   sl   t  td | j¡}t  td | j¡}t  td | j¡}t  td| j¡}t  td | j¡}| j|||g||gd d S )N)ÚstrrC   )r   ZStaticRaiseÚAssertionErrorr>   r?   ÚRuntimeErrorr7   )r"   r,   r-   r.   r0   r/   r%   r%   r&   Útest_staticraise‹   s    zTestIRNodes.test_staticraisec                 C   s–   t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}| j|||g|||gd d S )Nr   r   r   rC   )r   ÚBranchr:   r>   r?   r;   r7   ©r"   r,   r-   r.   r/   r0   rF   r%   r%   r&   Útest_branch“   s    zTestIRNodes.test_branchc                 C   sR   t  d| j¡}t  d| j¡}t  d| j¡}t  d| j¡}| j|||g|gd d S )NZsome_opZsome_other_oprC   )r   ZExprr>   r?   r7   rQ   r%   r%   r&   Ú	test_exprœ   s
    zTestIRNodes.test_exprc                 C   s®   t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}| j|||g|||gd d S rS   )	r   ZSetItemr:   r;   r<   r>   r?   r=   r7   r[   r%   r%   r&   Útest_setitem£   s    zTestIRNodes.test_setitemc                 C   sÖ   t  | jd| j| j| j¡}t  | jd| j| j| j¡}t  | jd| j| j| j¡}t  | jd| j| j| j¡}t  | jd| j| j| j¡}t  | jd| j| j| j¡}t  | jd| j| j| j¡}| j|||g||||gd d S rP   )	r   ZStaticSetItemr:   r;   r<   r>   r?   r=   r7   rE   r%   r%   r&   Útest_staticsetitem¬   s    zTestIRNodes.test_staticsetitemc                 C   s€   t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}| j|||g||gd d S rS   )r   ZDelItemr:   r;   r>   r?   r<   r7   ©r"   r,   r-   r.   r/   r0   r%   r%   r&   Útest_delitem¶   s    zTestIRNodes.test_delitemc                 C   sb   t  | jj| j¡}t  | jj| j¡}t  | jj| j¡}t  | jj| j¡}| j|||g|gd d S rS   )r   ÚDelr:   Únamer>   r?   r;   r7   rQ   r%   r%   r&   Útest_del¾   s
    zTestIRNodes.test_delc                 C   s¢   t  | jd| j| j¡}t  | jd| j| j¡}t  | jd| j| j¡}t  | jd| j| j¡}t  | jd| j| j¡}t  | jd| j| j¡}| j|||g|||gd d S ©NÚfooÚbarrC   )r   ZSetAttrr:   r;   r>   r?   r<   r7   r[   r%   r%   r&   Útest_setattrÅ   s    zTestIRNodes.test_setattrc                 C   sv   t  | jd| j¡}t  | jd| j¡}t  | jd| j¡}t  | jd| j¡}t  | jd| j¡}| j|||g||gd d S re   )r   ZDelAttrr:   r>   r?   r<   r7   r`   r%   r%   r&   Útest_delattrÎ   s    zTestIRNodes.test_delattrc                 C   s€   t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}t  | j| j| j¡}| j|||g||gd d S rS   )r   ÚAssignr:   r;   r>   r?   r<   r7   r`   r%   r%   r&   Útest_assignÖ   s    zTestIRNodes.test_assignc                 C   sŠ   t  | jf| j| j¡}t  | jf| j| j¡}t  | jf| j| j¡}t  | jf| j| j¡}t  | jf| j| j¡}| j|||g||gd d S rS   )r   ZPrintr:   r;   r>   r?   r<   r7   r`   r%   r%   r&   Ú
test_printÞ   s    zTestIRNodes.test_printc                 C   s®   t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}t  | j| j| j| j¡}| j|||g|||gd d S rS   )	r   ZStoreMapr:   r;   r<   r>   r?   r=   r7   r[   r%   r%   r&   Útest_storemapæ   s    zTestIRNodes.test_storemapc                 C   sv   t  | j| jd¡}t  | j| jd¡}t  | j| jd¡}t  | j| jd¡}t  | j| jd¡}| j|||g||gd d S )Nr   r   rC   )r   ZYieldr:   r>   r?   r;   r7   r`   r%   r%   r&   Ú
test_yieldï   s    zTestIRNodes.test_yieldc                 C   s–   t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}t  | jdd| j¡}| j|||g|||gd d S )Nr   r   r   rC   )r   Z	EnterWithr:   r>   r?   r;   r7   r[   r%   r%   r&   Útest_enterwith÷   s    zTestIRNodes.test_enterwithc                 C   sl   t  dd| j¡}t  dd| j¡}t  dd| j¡}t  dd| j¡}t  dd| j¡}| j|||g||gd d S ©Nrf   r   rg   r   rC   )r   ZArgr>   r?   r7   r`   r%   r%   r&   Útest_arg   s    zTestIRNodes.test_argc                 C   sR   t  d| j¡}t  d| j¡}t  d| j¡}t  d| j¡}| j|||g|gd d S rP   )r   ZConstr>   r?   r7   rQ   r%   r%   r&   Ú
test_const  s
    zTestIRNodes.test_constc                 C   sl   t  dd| j¡}t  dd| j¡}t  dd| j¡}t  dd| j¡}t  dd| j¡}| j|||g||gd d S rp   )r   ZGlobalr>   r?   r7   r`   r%   r%   r&   Útest_global  s    zTestIRNodes.test_globalc                 C   sv   t  d d| j¡}t  d d| j¡}t  d d| j¡}t  t  d t j¡d| j¡}t  d d| j¡}| j||||g|gd d S re   )r   r8   r>   r?   r   r9   r7   r`   r%   r%   r&   Útest_var  s    zTestIRNodes.test_varc                 C   s$   t  ¡ }t  ¡ }| j||gd d S rI   )r   ZUndefinedTyper7   )r"   r,   r-   r%   r%   r&   Útest_undefinedtype  s    zTestIRNodes.test_undefinedtypec                 C   sJ   t  dd¡}t  dd¡}t  dd¡}t  dd¡}| j||g||gd d S ©Nr   r   r   r   rC   )r   ZLoopr7   rQ   r%   r%   r&   Ú	test_loop$  s
    zTestIRNodes.test_loopc                 C   sJ   t  dd¡}t  dd¡}t  dd¡}t  dd¡}| j||g||gd d S rv   )r   ZWithr7   rQ   r%   r%   r&   Ú	test_with+  s
    zTestIRNodes.test_withN)r(   r)   r*   rK   rO   rR   rT   rU   rY   r\   r]   r^   r_   ra   rd   rh   ri   rk   rl   rm   rn   ro   rq   rr   rs   rt   ru   rw   rx   r%   r%   r%   r&   rL   l   s4   		
			rL   iÒ  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestIRCompoundsz+
    Tests IR concepts that have state
    c                 C   s„   t  ¡ }| | jd¡ | | jd¡ t  ¡ }| | jd¡ | | jd¡ t  ¡ }| | jd¡ | | jd¡ | j||g|gd d S re   )r   ZVarMapr   r:   r;   r<   r7   )r"   r,   r-   r.   r%   r%   r&   Útest_varmap;  s    zTestIRCompounds.test_varmapc                    sL   ‡ fdd„}|ƒ }|ƒ }|ƒ   t ˆ jˆ jˆ j¡¡}ˆ j||g|gd d S )Nc                     sz   t  d ˆ j¡} t  | ˆ j¡}t  ˆ jˆ jˆ j¡}t  ˆ jˆ j	ˆ j¡}t  ˆ j	ˆ jˆ j¡}| 
|¡ | 
|¡ | 
|¡ |S r1   )r   r   r>   ZBlockr?   rj   r:   r;   r@   r<   Úappend)r   ÚtmpZassign1Zassign2Zassign3©r"   r%   r&   Ú	gen_blockK  s    


z-TestIRCompounds.test_block.<locals>.gen_blockrC   )r{   r   rj   r:   r;   r@   r7   )r"   r~   r,   r-   r.   r%   r}   r&   Ú
test_blockJ  s
    zTestIRCompounds.test_blockc                 C   sœ  dd„ }dd„ }|ƒ }|ƒ }||ƒ}||ƒ}|   | |¡¡ g fdd„}|  d| |¡¡ tt|j ¡ ƒƒD ]@}|j| }	t|	j	d t
jƒrl|	j	d }
|
j|
j |
_|
_ q®ql|| |¡d	gƒ |ƒ }|  | |¡¡ ||ƒ}tƒ }tt|j ¡ ƒƒD ]Ä}|j| }	|	j	d d… }
d }tt|
ƒƒD ]8}t|
| t
jƒr"t|
|d
  t
jƒr"|} q\q"|d k	rö|	j	}| t||d
  ƒ¡ | t|| ƒ¡ ||d
  ||  ||< ||d
 <  q¼qö|   |¡ |  | |¡¡ |  t|ƒd¡ |D ]}|   | d¡¡ qê|| |¡|ƒ dd„ }dd„ }dd„ }||ƒ}||ƒ}|   | |¡¡ |  d| |¡¡ ||ƒ}|  | |¡¡ | |¡}|  d|¡ ||ddgƒ d S )Nc                 S   s   t j| ddS )NT)Z	emit_dels)r   Úrun_frontend)Úxr%   r%   r&   r€   ^  s    z5TestIRCompounds.test_functionir.<locals>.run_frontendc                     s   d‰ d‡ fdd„	} | S )NiþÊ  é   ù              ð?c              
      s`  | | }| ˆ 7 } t j|t jd}|| }d| }t  |¡dkrD|| }	t  d|d ¡}
tƒ  t||	ƒ W 5 Q R X t  |
| ¡}t  |d ¡dk rÌd}t| ƒD ]}|d7 }t  |¡dk r  qÀq ||d 7 }||
 }g }tt	|ƒƒD ]^}| 
|| ¡ |dkr2tdd	d
 d}d}W 5 Q R X |dkr2||7 }||d t 7 }qä|| | | | |  | S )N)Zdtyperƒ   r   r   r   r   r   ZintpZ
complex128)r6   Úté{   éz   )ÚnpÚzerosZ	complex64ÚabsZaranger   ÚprintÚsqrtÚranger!   r{   Ú_GLOBAL)r,   r-   r.   r/   r0   rF   rG   ÚhÚiÚkÚlÚmÚnÚoÚpÚqÚrr6   r„   ©Z_FREEVARr%   r&   rf   i  s<    

z9TestIRCompounds.test_functionir.<locals>.gen.<locals>.foo)r‚   rƒ   Nr%   )rf   r%   r˜   r&   Úgenf  s    !z,TestIRCompounds.test_functionir.<locals>.genc                 S   sB   |   ¡ }|D ]0}|D ]}| d¡r||kr qqtd| ƒ‚qd S )Nz->zCould not find %s )Ú
splitlinesÚ
startswithrW   )ÚstringZpointing_atÚlinesÚitemr‘   r%   r%   r&   Úcheck_diffstr“  s    
z6TestIRCompounds.test_functionir.<locals>.check_diffstrzIR is considered equivalentéÿÿÿÿÚbranchr   r   zdel c                 S   s   | d }|| }t  |¡}|S ©Nr   ©r‡   r‹   ©r,   r-   r.   r/   r0   r%   r%   r&   rf   É  s    
z,TestIRCompounds.test_functionir.<locals>.fooc                 S   s   | d }|| }t  |¡}|S r¢   r£   r¤   r%   r%   r&   rg   Ï  s    
z,TestIRCompounds.test_functionir.<locals>.barc                 S   s"   | d }|| }t  |d ¡}|S )Nr   r   r£   r¤   r%   r%   r&   ÚbazÕ  s    z,TestIRCompounds.test_functionir.<locals>.bazz$Other block contains more statementszc + bzb + c)r2   Zequal_irZassertInZdiff_strÚreversedÚlistÚblocksÚkeysÚ
isinstanceÚbodyr   rZ   ZfalsebrZtruebrZassertFalseÚsetrŒ   r!   rb   ÚaddrV   r    r›   )r"   r€   r™   r   ÚyZx_irZy_irrŸ   ÚlabelÚblkÚrefÚzZz_irZ
change_setÚidxr   r-   rž   rf   rg   r¥   Zfoo_irZbar_irZbaz_irr|   r%   r%   r&   Útest_functionir\  sl    &



ÿ
"

zTestIRCompounds.test_functionirN)r(   r)   r*   rK   rz   r   r´   r%   r%   r%   r&   ry   7  s   ry   c                   @   s   e Zd Zdd„ ZdS )ÚTestIRPedanticChecksc              
      s¸   t dddG dd„ dtƒƒ‰t dddG dd„ dtƒƒ‰ G ‡ ‡fdd„dtƒ}t|d	d
d„ ƒ}t ¡ F t dtj¡ |  	tj
¡}|dƒ W 5 Q R X |  t|jƒd¡ W 5 Q R X d S )NF)Zmutates_CFGZanalysis_onlyc                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zKTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.RemoveVarInScopeÚ_remove_var_in_scopec                 S   s   t  | ¡ d S r1   ©r	   Ú__init__r}   r%   r%   r&   r¸   î  s    zTTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.RemoveVarInScope.__init__c                 S   s4   |j }|j ¡ D ]}|j}tj|j|jd|_qdS )Nr   T)Úfunc_irr¨   ÚvaluesZscoper   r   r   r   )r"   Ústater¹   r°   Zoldscoper%   r%   r&   Úrun_passó  s    ÿ
zTTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.RemoveVarInScope.run_passN©r(   r)   r*   Ú_namer¸   r¼   r%   r%   r%   r&   ÚRemoveVarInScopeê  s   r¿   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zCTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.FailPassÚ_failc                 _   s   t  | ¡ d S r1   r·   )r"   ÚargsÚkwargsr%   r%   r&   r¸     s    zLTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.FailPass.__init__c                 S   s   t dƒ‚d S )NZunreachable)rW   )r"   r»   r%   r%   r&   r¼     s    zLTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.FailPass.run_passNr½   r%   r%   r%   r&   ÚFailPassþ  s   rÃ   c                       s   e Zd Z‡ ‡fdd„ZdS )zETestIRPedanticChecks.test_var_in_scope_assumption.<locals>.MyCompilerc                    sR   t dƒ}| td¡ | td¡ | ˆd¡ | td¡ | ˆ d¡ | ¡  |gS )Nz
testing pmzanalyzing bytecodezprocessing IRr¶   ZssarÀ   )r
   Zadd_passr   r   r   Úfinalize)r"   Zpm©rÃ   r¿   r%   r&   Údefine_pipelines  s    zVTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.MyCompiler.define_pipelinesN)r(   r)   r*   rÆ   r%   rÅ   r%   r&   Ú
MyCompiler  s   rÇ   )Zpipeline_classc                 S   s"   d}d}||k rd}nd}||fS )Nr   r   r   r%   )r   r,   r-   r%   r%   r&   Údummy  s    z@TestIRPedanticChecks.test_var_in_scope_assumption.<locals>.dummyÚerrorr   z variable '[a-z]' is not in scope)r   r	   r   r   ÚwarningsÚcatch_warningsÚsimplefilterr   ZNumbaPedanticWarningÚassertRaisesZNumbaIRAssumptionWarningÚassertRegexrV   Ú	exception)r"   rÇ   rÈ   Zraisesr%   rÅ   r&   Útest_var_in_scope_assumptionè  s    



þz1TestIRPedanticChecks.test_var_in_scope_assumptionN)r(   r)   r*   rÐ   r%   r%   r%   r&   rµ   ç  s   rµ   Ú__main__) ZunittestZunittest.caser   rÊ   Znumpyr‡   Znumbar   Z
numba.corer   r   r   Znumba.core.compilerr   r   Znumba.core.compiler_machineryr	   r
   r   Znumba.core.untyped_passesr   r   r   r   r+   rA   rL   r   ry   rµ   r(   Úmainr%   r%   r%   r&   Ú<module>   s*   " I 1H
