U
    ,dm                     @   s   d dl mZmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZ d dlmZmZmZ d dlmZ d dlmZ G d	d
 d
eZG dd deZdS )    )CompilerDefaultPassBuilder)FunctionPassAnalysisPassregister_pass)InlineInlinables)IRLegalization)jitgenerated_jitobjmodenjitcfunc)typespostprocerrors)
FunctionIR)TestCasec                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )TestCustomPipelinec                    s,   t t|   G  fdddt  | _d S )Nc                       s0   e Zd Zg Z fddZ fddZ  ZS )z0TestCustomPipeline.setUp.<locals>.CustomPipelinec                    s   | j | t | |S N)custom_pipeline_cacheappendsupercompile_extra)selffuncCustomPipeline	__class__ =/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_pipeline.pyr      s    z>TestCustomPipeline.setUp.<locals>.CustomPipeline.compile_extrac                    s$   | j | t | j|f||S r   )r   r   r   
compile_ir)r   func_irargskwargsr   r   r   r       s    
z;TestCustomPipeline.setUp.<locals>.CustomPipeline.compile_ir)__name__
__module____qualname__r   r   r    __classcell__r   r   r   r   r      s   r   )r   r   setUpr   pipeline_classr   r)   r(   r   r*      s    zTestCustomPipeline.setUpc                 C   sL   |  | jjg  t| jddd }| |dd |  | jj|jg d S )Nr+   c                 S   s   | S r   r   xr   r   r   foo$   s    z8TestCustomPipeline.test_jit_custom_pipeline.<locals>.foo   )assertListEqualr+   r   r	   assertEqualpy_funcr   r0   r   r   r   test_jit_custom_pipeline!   s    


z+TestCustomPipeline.test_jit_custom_pipelinec                 C   sV   |  | jjg  tttj| jddd }| |dd |  | jj|jg d S )Nr-   c                 S   s   | S r   r   r.   r   r   r   r0   /   s    z:TestCustomPipeline.test_cfunc_custom_pipeline.<locals>.foor1   )r2   r+   r   r   r   Zint64r3   __wrapped__r5   r   r   r   test_cfunc_custom_pipeline,   s    

z-TestCustomPipeline.test_cfunc_custom_pipelinec                    sV   |  | jjg  dd  t| jd fdd}| |dd |  | jj g d S )Nc                 S   s   | S r   r   r.   r   r   r   inner:   s    zDTestCustomPipeline.test_generated_jit_custom_pipeline.<locals>.innerr-   c                    s   t | tjr S d S r   )
isinstancer   ZIntegerr.   r9   r   r   r0   =   s    zBTestCustomPipeline.test_generated_jit_custom_pipeline.<locals>.foo   )r2   r+   r   r
   r3   r5   r   r;   r   "test_generated_jit_custom_pipeline7   s    

z5TestCustomPipeline.test_generated_jit_custom_pipelinec                 C   s   |  | jjg  t| jddd }d}| |||d  | t| jjd | jjd }| ||j | jjd }| |t	 d S )Nr-   c              	   S   s&   t dd | td7 } W 5 Q R X | S )NZintpr.      )r   intr.   r   r   r   r0   I   s    z<TestCustomPipeline.test_objmode_custom_pipeline.<locals>.foo{   r>      r   )
r2   r+   r   r	   r3   lenZassertIsr4   ZassertIsInstancer   )r   r0   argfirstsecondr   r   r   test_objmode_custom_pipelineF   s    

z/TestCustomPipeline.test_objmode_custom_pipeline)	r$   r%   r&   r*   r6   r8   r=   rF   r'   r   r   r)   r   r      s
   r   c                   @   s&   e Zd ZdddZdd Zdd ZdS )	TestPassManagerFunctionalityNc                    sV   |  dk	 |  dk	 tdddG fddd G  fdddt}|S )z
        Creates a new compiler pipeline with the _InjectDelsPass injected after
        the pass supplied in kwarg 'inject_after'.
        NF)Zmutates_CFGZanalysis_onlyc                       s0   e Zd ZdZde  Z fddZdd ZdS )zLTestPassManagerFunctionality._create_pipeline_w_del.<locals>._InjectDelsPasszD
            This pass injects ir.Del nodes into the IR
            zinject_dels_%sc                    s     |  d S r   )__init__r,   baser   r   rH   l   s    zUTestPassManagerFunctionality._create_pipeline_w_del.<locals>._InjectDelsPass.__init__c                 S   s   t |j}|jdd dS )NT)Z	emit_dels)r   ZPostProcessorr!   run)r   stateppr   r   r   run_passo   s    zUTestPassManagerFunctionality._create_pipeline_w_del.<locals>._InjectDelsPass.run_passN)r$   r%   r&   __doc__str_namerH   rN   r   rI   r   r   _InjectDelsPasse   s   rR   c                       s   e Zd Z fddZdS )zITestPassManagerFunctionality._create_pipeline_w_del.<locals>.TestCompilerc                    s&   t | j}|  |  |gS r   )r   Zdefine_nopython_pipelinerL   Zadd_pass_afterfinalize)r   ZpmrR   inject_afterr   r   define_pipelinesv   s    zZTestPassManagerFunctionality._create_pipeline_w_del.<locals>.TestCompiler.define_pipelinesN)r$   r%   r&   rV   r   rT   r   r   TestCompilert   s   rW   )
assertTruer   r   )r   rJ   rU   rW   r   )rR   rJ   rU   r   _create_pipeline_w_del]   s    
z3TestPassManagerFunctionality._create_pipeline_w_delc              	   C   sd   |  tt}t|ddd }| tj}|d W 5 Q R X t|j}| 	d| | 	d| d S )Nr-   c                 S   s   | d S Nr>   r   r.   r   r   r   r0      s    zYTestPassManagerFunctionality.test_compiler_error_on_ir_del_from_functionpass.<locals>.foo
   zIllegal IR, del found at:zdel x)
rY   r   r   r   assertRaisesr   ZCompilerErrorrP   	exceptionZassertIn)r   new_compilerr0   ZraisesZerrstrr   r   r   /test_compiler_error_on_ir_del_from_functionpass~   s    

zLTestPassManagerFunctionality.test_compiler_error_on_ir_del_from_functionpassc                 C   s8   |  tt}t|ddd }| |d|d d S )Nr-   c                 S   s   | d S rZ   r   r.   r   r   r   r0      s    z]TestPassManagerFunctionality.test_no_compiler_error_on_ir_del_after_legalization.<locals>.foor[   )rY   r   r   r   rX   r4   )r   r^   r0   r   r   r   3test_no_compiler_error_on_ir_del_after_legalization   s    	
zPTestPassManagerFunctionality.test_no_compiler_error_on_ir_del_after_legalization)NN)r$   r%   r&   rY   r_   r`   r   r   r   r   rG   [   s   
!rG   N)Znumba.core.compilerr   r   Znumba.core.compiler_machineryr   r   r   Znumba.core.untyped_passesr   Znumba.core.typed_passesr   Znumbar	   r
   r   r   r   Z
numba.corer   r   r   Znumba.core.irr   Znumba.tests.supportr   r   rG   r   r   r   r   <module>   s   O