o
    'ѹg\N                     @   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re   dS dS )    N)TestCase)objmode)ircompiler)errors)CompilerBaseReconstructSSA)FunctionPassPassManagerregister_pass)TranslateByteCodeIRProcessing)njitc                   @      e Zd Zdd ZdS )TestIRc                 C   sh  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
y   Y d S w | 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&   W/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/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sr0   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loc3r8   r&   r&   r&   r'   r,   8   s    r,   c                   @       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   r5   r6   F)Zmaybe_decoratorTr5   )r   r   r8   r#   r-   r.   r/   r0   r1   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 NrF   )r   r   r?   r@   r8   )	r#   Zparent1Zparent2Zparent3r-   r.   r/   r0   r1   r&   r&   r'   
test_scopeZ   s   zTestIRMeta.test_scopeN)r)   r*   r+   __doc__rJ   rL   r&   r&   r&   r'   rC   J   s    rC   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   $   t  }t  }| j||gd d S rK   )r   Z
Terminatorr8   )r#   t1t2r&   r&   r'   test_terminatorp   s   zTestIRNodes.test_terminatorc                 C   R   t d| j}t d| j}t d| j}t d| j}| j|||g|gd d S Nr   r   rE   )r   ZJumpr?   r@   r8   r#   r-   r.   r/   r0   r&   r&   r'   	test_jumpv   
   zTestIRNodes.test_jumpc                 C   Z   t | j| j}t | j| j}t | j| j}t | j| j}| j|||g|gd d S NrE   )r   Returnr;   r?   r@   r<   r8   rU   r&   r&   r'   test_return}   
   zTestIRNodes.test_returnc                 C   rX   rY   )r   Raiser;   r?   r@   r<   r8   rU   r&   r&   r'   
test_raise   r\   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)strrE   )r   ZStaticRaiseAssertionErrorr?   r@   RuntimeErrorr8   )r#   r-   r.   r/   r1   r0   r&   r&   r'   test_staticraise      zTestIRNodes.test_staticraisec                 C      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   rE   )r   Branchr;   r?   r@   r<   r8   r#   r-   r.   r/   r0   r1   rH   r&   r&   r'   test_branch      zTestIRNodes.test_branchc                 C   rS   )NZsome_opZsome_other_oprE   )r   Exprr?   r@   r8   rU   r&   r&   r'   	test_expr   rW   zTestIRNodes.test_exprc                 C      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 rY   )	r   ZSetItemr;   r<   r=   r?   r@   r>   r8   rf   r&   r&   r'   test_setitem      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 rT   )	r   ZStaticSetItemr;   r<   r=   r?   r@   r>   r8   rG   r&   r&   r'   test_staticsetitem   s    zTestIRNodes.test_staticsetitemc                 C      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 rY   )r   ZDelItemr;   r<   r?   r@   r=   r8   r#   r-   r.   r/   r0   r1   r&   r&   r'   test_delitem      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 rY   )r   Delr;   namer?   r@   r<   r8   rU   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barrE   )r   ZSetAttrr;   r<   r?   r@   r=   r8   rf   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 rv   )r   ZDelAttrr;   r?   r@   r=   r8   rp   r&   r&   r'   test_delattr      zTestIRNodes.test_delattrc                 C   ro   rY   )r   Assignr;   r<   r?   r@   r=   r8   rp   r&   r&   r'   test_assign   rr   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 rY   )r   ZPrintr;   r<   r?   r@   r=   r8   rp   r&   r&   r'   
test_print   s   zTestIRNodes.test_printc                 C   rk   rY   )	r   ZStoreMapr;   r<   r=   r?   r@   r>   r8   rf   r&   r&   r'   test_storemap   rm   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   rE   )r   Yieldr;   r?   r@   r<   r8   rp   r&   r&   r'   
test_yield   r{   zTestIRNodes.test_yieldc                 C   rd   )Nr   r   r   rE   )r   Z	EnterWithr;   r?   r@   r<   r8   rf   r&   r&   r'   test_enterwith   rh   zTestIRNodes.test_enterwithc                 C   l   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 Nrw   r   rx   r   rE   )r   ZArgr?   r@   r8   rp   r&   r&   r'   test_arg   rc   zTestIRNodes.test_argc                 C   rS   rT   )r   ZConstr?   r@   r8   rU   r&   r&   r'   
test_const  rW   zTestIRNodes.test_constc                 C   r   r   )r   Globalr?   r@   r8   rp   r&   r&   r'   test_global  rc   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 rv   )r   r9   r?   r@   r   r:   r8   rp   r&   r&   r'   test_var  s   zTestIRNodes.test_varc                 C   rO   rK   )r   ZUndefinedTyper8   )r#   r-   r.   r&   r&   r'   test_undefinedtype  s   zTestIRNodes.test_undefinedtypec                 C   J   t dd}t dd}t dd}t dd}| j||g||gd d S Nr   r   r   r   rE   )r   ZLoopr8   rU   r&   r&   r'   	test_loop$  
   zTestIRNodes.test_loopc                 C   r   r   )r   Withr8   rU   r&   r&   r'   	test_with+  r   zTestIRNodes.test_withN)r)   r*   r+   rM   rR   rV   r[   r^   rb   rg   rj   rl   rn   rq   ru   ry   rz   r}   r~   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   rN   l   s6    		
			rN   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 rv   )r   ZVarMapr   r;   r<   r=   r8   )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 r2   )r   r   r?   ZBlockr@   r|   r;   r<   rA   r=   append)r   tmpZassign1Zassign2Zassign3r#   r&   r'   	gen_blockK  s   


z-TestIRCompounds.test_block.<locals>.gen_blockrE   )r   r   r|   r;   r<   rA   r8   )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rV|	j	d }
|
j|
j|
_|
_ qWq6|||d	g | }| || ||}t }tt|j D ]_}|j| }	|	j	d d }
d }tt|
d
 D ]}t|
| t
jrt|
|d
  t
jr|} qq|d ur|	j	}|t||d
   |t||  ||d
  || ||< ||d
 <  qq{|  | | || | 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   ^     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r|| }	t d|d }
t  t||	 W d    n1 s>w   Y  t |
| }t |d dk rod}t| D ]}|d7 }t |dk rh qiqY||d 7 }||
 }g }tt	|D ]7}|
||  |dkrtdd	d
 d}d}W d    n1 sw   Y  |dkr||7 }||d t 7 }q{|| | | | |  | S )N)Zdtyper   r   r   r   r   r   ZintpZ
complex128)r7   t{   z   )npzerosZ	complex64absZaranger   printsqrtranger"   r   _GLOBAL)r-   r.   r/   r0   r1   rH   rI   hiklmnopqrr7   r   Z_FREEVARr&   r'   rw   i  sB   z9TestIRCompounds.test_functionir.<locals>.gen.<locals>.foo)r   r   Nr&   )rw   r&   r   r'   genf  s   !z,TestIRCompounds.test_functionir.<locals>.genc                 S   s@   |   }|D ]}|D ]}|dr||v r qq
td| d S )Nz->zCould not find %s )
splitlines
startswithr`   )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      | d }|| }t |}|S Nr   r   r   r-   r.   r/   r0   r1   r&   r&   r'   rw        
z,TestIRCompounds.test_functionir.<locals>.fooc                 S   r   r   r   r   r&   r&   r'   rx     r   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)r3   Zequal_irZassertInZdiff_strreversedlistblockskeys
isinstancebodyr   re   ZfalsebrZtruebrZassertFalsesetr   r"   rs   addr_   r!   r   )r#   r   r   r   yZx_irZy_irr   labelblkrefzZz_irZ
change_setidxr   r.   r   rw   rx   r   Zfoo_irZbar_irZbaz_irr   r&   r&   r'   test_functionir\  sr   &



"

zTestIRCompounds.test_functionirN)r)   r*   r+   rM   r   r   r   r&   r&   r&   r'   r   7  s
    r   c                   @   r   )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 3 tdtj | 	tj
}|d W d    n1 sQw   Y  | t|jd W d    d S 1 sjw   Y  d S )NF)Zmutates_CFGZanalysis_onlyc                   @   rB   )zKTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.RemoveVarInScope_remove_var_in_scopec                 S      t |  d S r2   r	   __init__r   r&   r&   r'   r     r   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                   @   rB   )zCTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.FailPass_failc                 _   r   r2   r   )r#   argskwargsr&   r&   r'   r     r   zLTestIRPedanticChecks.test_var_in_scope_assumption.<locals>.FailPass.__init__c                 S   s   t d)NZunreachable)r`   )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}||fS 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assertRegexr_   	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,   rC   rN   r   r   r   r)   mainr&   r&   r&   r'   <module>   s.    " I 1H