U
    9%e$                     @   s   d dl 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mZmZmZmZmZ d dlmZmZmZmZ d dlmZmZmZ d d	lmZ d
Zede jje j fgG dd de!Z"G dd deZ#e$dkre%  dS )    N)TestCaseunittest)
cpu_target)CompilerBaseFlags)PassManager)typesirbytecodecompilerir_utilsregistry)ExtractByteCodeTranslateByteCode	FixupArgsIRProcessing)NopythonTypeInferencetype_inference_stageDeadCodeElimination)jitclass   valc                   @   s   e Zd Zdd ZdS )Dummyc                 C   s
   || _ d S N)r   )selfr    r   X/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_ir_utils.py__init__   s    zDummy.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TestIrUtilszA
    Tests ir handling utility functions like find_callname.
    c                 C   sx   dd }t |}tj}tj}t|||dd}t||jd j	d j
|j}| t|topt|dkop|d dk dS )	zGTest matching of an object method (other than Array see #3449)
        c                  S   s   t dg} | jd d S )N      )r   r   append)dr   r   r   	test_func!   s    
z2TestIrUtils.test_obj_func_match.<locals>.test_funcr   Nr      r#   r$   )r   run_frontendr   typing_contexttarget_contextr   r   Zfind_callnameblocksbodyvaluetypemap
assertTrue
isinstancetuplelen)r   r&   Ztest_irZ	typingctxZ	targetctxZ
typing_resZmatched_callr   r   r   test_obj_func_match   s*    
      

zTestIrUtils.test_obj_func_matchc           	         s   G dd dt } fdd} fdd}dd }|tjf}||}||}|tjf}|j|d	d
}||  t|jd jt| t|jd j d S )Nc                   @   s0   e Zd Zeddi dddfddZdddZdS )z6TestIrUtils.test_dead_code_elimination.<locals>.TesterNc                 S   sD   |s
t  }d|_|d kr tjj}|d kr0tjj}| |||||||S )NT)r   Znrtr   r   r)   r*   )clsargsreturn_typeflagslocalsZlibraryr)   r*   r   r   r   mk_pipeline4   s    
  zBTestIrUtils.test_dead_code_elimination.<locals>.Tester.mk_pipelineFc                 S   s   t j|}|| j_t | j | j}d}t|}|t	d |t
d |td |td |dkrx|td |  || |jS )z7
                Compile and return IR
                ZDCE_testingzanalyzing bytecodezfix up argszprocessing IRznopython frontendTzDCE after typing)r
   ZFunctionIdentityfrom_functionstatefunc_idr   Zrun_passr   Zadd_passr   r   r   r   r   finalizerunfunc_ir)r   funcDCEr<   r;   namepmr   r   r   compile_to_irB   s    
zDTestIrUtils.test_dead_code_elimination.<locals>.Tester.compile_to_ir)F)r   r   r    classmethodr9   rD   r   r   r   r   Tester2   s    rF   c                    s     t| jd | jd }g }|tjD ]4}tt|dd tjr,dt|j	ddkr,|
| q,  t|d |D ],}| |j} td|j	j d	|j qv|S )
Nr"   r   targetdeadrB    r#   z0x%s   )assertEqualr2   r+   
find_instsr	   Assignr0   getattrVarrG   r$   Zget_definitionr-   r/   intrB   )the_irblockdeadsxr%   Z	const_valr   r   r   check_initial_irW   s    
z@TestIrUtils.test_dead_code_elimination.<locals>.check_initial_irc                    s     t| jd | jd }g }g }|tjD ]R}tt|dd tjrddt|j	ddkrd|
| tt|dd tjr0|
| q0  t|d |D ]} |jjdk qd S )	Nr"   r   rG   rH   rB   rI   r-   )     ^[= )rK   r2   r+   rL   r	   rM   r0   rN   rO   rG   r$   ZConstr/   r-   )rQ   rR   rS   ZconstsrT   rU   r   r   check_dce_irp   s    

z<TestIrUtils.test_dead_code_elimination.<locals>.check_dce_irc                 S   s$   | d }d}|d }d}|| }|S )Nr"   rW   r#   rX   r   )rT   yrH   zZdeaddeadretr   r   r   foo   s    z3TestIrUtils.test_dead_code_elimination.<locals>.fooT)rA   r   )	r   r9   r   intprD   rK   r2   r+   r,   )	r   rF   rV   rY   r]   Ztest_pipelineZno_dceremovedZw_dcer   rU   r   test_dead_code_elimination0   s    %
z&TestIrUtils.test_dead_code_eliminationc                    s   d  fdd}t |}|jd }d}d}|jD ]X}t|tjr`|jjdkr`t	
t	j||j}t|tjr2|jjdkr2t	
t	j||j}q2| |t | |  dS )z
        Test find_const() for values in globals (ir.Global) and freevars
        (ir.FreeVar) that are considered constants for compilation.
           c                    s   t } }| | | S r   )GLOBAL_B)abcZ	FREEVAR_Cr   r   r]      s    z/TestIrUtils.test_find_const_global.<locals>.foor   Nrd   re   )r   r(   r+   r,   r0   r	   rM   rG   rB   r   guardZ
find_constrK   rb   )r   r]   Zf_irrR   Zconst_bZconst_cinstr   rf   r   test_find_const_global   s*    


    z"TestIrUtils.test_find_const_globalc                    sX   dd }dd }dd } fdd}||}||}||}  ||  || d	S )
z tests flatten_labels c                 S   s   d}| dkr"|d7 }| dkrndS nL| dk rf| dkr:|d7 }t dD ]}|d8 }|d	k rB qnqB|d
7 }ntdd}d	}d}d}|S )Nr      r"      5     ra   
   r#   r'   some string   range
ValueErrorrc   accrT   py310_defeat1py310_defeat2py310_defeat3py310_defeat4r   r   r   r]      s&    
z,TestIrUtils.test_flatten_labels.<locals>.fooc                 S   s   d}d}| dkr6|d7 }|d7 }| dkr|d7 }dS nd| dk r| dkrV|d7 }|d7 }t dD ] }|d7 }|d8 }|d	k r^ qq^|d7 }|d
7 }ntdd}d	}d}d}|S )Nr   ra   rj   r"   rk   rl   rm   rn   r#   r'   ro   rp   rq   )rc   ru   r[   rT   rv   rw   rx   ry   r   r   r   bar   s2    
z,TestIrUtils.test_flatten_labels.<locals>.barc                 S   s   d}| dkr&|d7 }| dkr dS dS nL| dk rj| dkr>|d7 }t d	D ]}|d8 }|d
k rF qrqF|d7 }ntdd}d
}d}d}|S )Nr   rj   r"   rk   rl   7   rm   ra   rn   r#   r'   ro   rp   rq   rt   r   r   r   baz   s(    
z,TestIrUtils.test_flatten_labels.<locals>.bazc                    sB   t | t }t |j} t| d t|j t 	|S )Nr"   )
r   Zcompile_to_numba_irdictZflatten_labelsr+   rK   maxkeysr2   Zcompute_cfg_from_blocks)r@   r?   Zflat_blocksrU   r   r   get_flat_cfg  s    z5TestIrUtils.test_flatten_labels.<locals>.get_flat_cfgN)rK   ZassertNotEqual)r   r]   rz   r|   r   Zfoo_cfgZbar_cfgZbaz_cfgr   rU   r   test_flatten_labels   s    zTestIrUtils.test_flatten_labelsN)r   r   r    __doc__r3   r`   ri   r   r   r   r   r   r!      s
   fr!   __main__)&ZnumbaZnumba.tests.supportr   r   Znumba.core.registryr   Znumba.core.compilerr   r   Znumba.core.compiler_machineryr   Z
numba.corer   r	   r
   r   r   r   Znumba.core.untyped_passesr   r   r   r   Znumba.core.typed_passesr   r   r   Znumba.experimentalr   rb   coreListr^   objectr   r!   r   mainr   r   r   r   <module>   s     y