B
     \=,                 @   s  d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZ	ddl
mZmZmZmZmZ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ ddlm Z  ddl!m"Z" dd Z#dd Z$G dd de%Z&dej'fgZ(dd Z)dd Z*dd Z+e Z,e,-ded e,-d G dd deZ.G dd  d e.Z/G d!d" d"e/Z0G d#d$ d$e.Z1G d%d& d&e.Z2G d'd( d(e/Z3G d)d* d*eZ4e5d+kre6  dS ),    )print_functionabsolute_importN   )TestCaseoverride_configoverride_env_configcaptured_stdoutforbid_codegen)unittest_support)jitjitclasstypes)compile_isolatedFlags)ParallelOptions)NumbaWarning)compilerprange)skip_unsupported)
needs_blasc             C   s   | d }|S )Nr    )ZsomeargZretvalr   r   5lib/python3.7/site-packages/numba/tests/test_debug.pysimple_nopython   s    r   c             c   s   | V  |V  d S )Nr   )xyr   r   r   
simple_gen   s    r   c               @   s   e Zd Zdd ZdS )SimpleClassc             C   s
   d| _ d S )N   )h)selfr   r   r   __init__    s    zSimpleClass.__init__N)__name__
__module____qualname__r    r   r   r   r   r      s   r   r   c             C   s   | j S )N)r   )objr   r   r   simple_class_user%   s    r%   c             C   s   t | |S )N)npdot)abr   r   r   unsupported_parfor(   s    r*   c             C   s6   t | }x&t| D ]}|| t | ||< qW |S )N)r&   Zonesr   Zsin)nr(   ir   r   r   supported_parfor+   s    
r-   auto_parallelTZnrtc            	   @   st   e Zd Zeddddddddg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 )DebugTestBasebytecodecfgir	typeinferllvmfunc_opt_llvmoptimized_llvmassemblyc             O   s   | j tf|| d S )N)ZassertRaisesAssertionError)r   argskwargsr   r   r   assert_fails:   s    zDebugTestBase.assert_failsc             C   sv   t | jd}x |D ]}||ks$td||< qW x@t| D ]0\}}t| d| }|rb|| q>| || q>W d S )NFTz_check_dump_%s)dictfromkeys	all_dumpsr8   sorteditemsgetattrr;   )r   outZ
dump_namesZenabled_dumpsnameenabledZ
check_methr   r   r   check_debug_output=   s    

z DebugTestBase.check_debug_outputc             C   s   |  d| d S )NZ
BINARY_ADD)assertIn)r   rB   r   r   r   _check_dump_bytecodeI   s    z"DebugTestBase._check_dump_bytecodec             C   s   |  d| d S )NzCFG dominators)rF   )r   rB   r   r   r   _check_dump_cfgL   s    zDebugTestBase._check_dump_cfgc             C   s   |  d| j | d S )Nz--IR DUMP: %s--)rF   	func_name)r   rB   r   r   r   _check_dump_irO   s    zDebugTestBase._check_dump_irc             C   s   |  d| d S )Nz--propagate--)rF   )r   rB   r   r   r   _check_dump_typeinferR   s    z#DebugTestBase._check_dump_typeinferc             C   s.   |  d| tjjd jdkr*|  d| d S )Nz--LLVM DUMPr.   Fz%"retval" = alloca)rF   r   r   ZOPTIONSrD   )r   rB   r   r   r   _check_dump_llvmU   s    zDebugTestBase._check_dump_llvmc             C   s"   |  d| j | |  d| d S )Nz--FUNCTION OPTIMIZED DUMP %szadd nsw i64 %arg.somearg, 1)rF   rI   )r   rB   r   r   r   _check_dump_func_opt_llvmZ   s    z'DebugTestBase._check_dump_func_opt_llvmc             C   s"   |  d| j | |  d| d S )Nz--OPTIMIZED DUMP %szadd nsw i64 %arg.somearg, 1)rF   rI   )r   rB   r   r   r   _check_dump_optimized_llvm_   s    z(DebugTestBase._check_dump_optimized_llvmc             C   s.   |  d| j | t dkr*|  d| d S )Nz--ASSEMBLY %s)Zx86_64ZAMD64Zi386Zi686Zxorl)rF   rI   platformmachine)r   rB   r   r   r   _check_dump_assemblyc   s    z"DebugTestBase._check_dump_assemblyN)r!   r"   r#   setr>   r;   rE   rG   rH   rJ   rK   rL   rM   rN   rQ   r   r   r   r   r/   5   s   r/   c               @   s   e Zd ZdZdd ZdS )FunctionDebugTestBaser   c          	   C   s:   t  &}tttjf}| |dd W d Q R X | S )N      )r   r   r   r   int64assertPreciseEqualentry_pointgetvalue)r   rB   cresr   r   r   compile_simple_nopythonm   s    z-FunctionDebugTestBase.compile_simple_nopythonN)r!   r"   r#   rI   r[   r   r   r   r   rS   i   s   rS   c               @   sD   e 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S )TestFunctionDebugOutputc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZDUMP_BYTECODETr0   )r   r[   rE   )r   rB   r   r   r   test_dump_bytecodew   s    z*TestFunctionDebugOutput.test_dump_bytecodec          	   C   s0   t dd |  }W d Q R X | |dg d S )NDUMP_IRTr2   )r   r[   rE   )r   rB   r   r   r   test_dump_ir|   s    z$TestFunctionDebugOutput.test_dump_irc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZDUMP_CFGTr1   )r   r[   rE   )r   rB   r   r   r   test_dump_cfg   s    z%TestFunctionDebugOutput.test_dump_cfgc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZ	DUMP_LLVMTr4   )r   r[   rE   )r   rB   r   r   r   test_dump_llvm   s    z&TestFunctionDebugOutput.test_dump_llvmc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZDUMP_FUNC_OPTTr5   )r   r[   rE   )r   rB   r   r   r   test_dump_func_opt_llvm   s    z/TestFunctionDebugOutput.test_dump_func_opt_llvmc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZDUMP_OPTIMIZEDTr6   )r   r[   rE   )r   rB   r   r   r   test_dump_optimized_llvm   s    z0TestFunctionDebugOutput.test_dump_optimized_llvmc          	   C   s0   t dd |  }W d Q R X | |dg d S )NZDUMP_ASSEMBLYTr7   )r   r[   rE   )r   rB   r   r   r   test_dump_assembly   s    z*TestFunctionDebugOutput.test_dump_assemblyN)
r!   r"   r#   r]   r_   r`   ra   rb   rc   rd   r   r   r   r   r\   u   s   r\   c               @   s    e Zd ZdZdd Zdd ZdS )TestGeneratorDebugOutputr   c          	   C   sH   t  4}tttjtjf}| t|ddddg W d Q R X | S )NrT   r   )	r   r   r   r   rV   rW   listrX   rY   )r   rB   rZ   r   r   r   compile_simple_gen   s    &z+TestGeneratorDebugOutput.compile_simple_genc          	   C   sX   t dd |  }W d Q R X | |dg | d| j | td}| || d S )Nr^   Tr2   z--GENERATOR INFO: %sz
            generator state variables: ['x', 'y']
            yield point #1: live variables = ['y'], weak live variables = ['x']
            yield point #2: live variables = [], weak live variables = ['y']
            )r   rg   rE   rF   rI   textwrapdedent)r   rB   Zexpected_gen_infor   r   r   test_dump_ir_generator   s    z/TestGeneratorDebugOutput.test_dump_ir_generatorN)r!   r"   r#   rI   rg   rj   r   r   r   r   re      s   re   c               @   s    e Zd ZdZdd Zdd ZdS )TestDisableJITz:
    Test the NUMBA_DISABLE_JIT environment variable.
    c          
   C   sJ   t dd6 t $ tddt}| |dd W d Q R X W d Q R X d S )NDISABLE_JITT)nopythonrT   rU   )r   r	   r   r   rW   )r   cfuncr   r   r   test_jit   s    zTestDisableJIT.test_jitc          
   C   sj   t ddV t D ttt}| }| |jd tddt}| ||d W d Q R X W d Q R X d S )Nrl   Tr   )rm   )	r   r	   r   simple_class_specr   rW   r   r   r%   )r   ZSimpleJITClassr$   rn   r   r   r   test_jitclass   s    zTestDisableJIT.test_jitclassN)r!   r"   r#   __doc__ro   rq   r   r   r   r   rk      s   rk   c               @   s   e Zd ZdZdZdd ZdS )TestEnvironmentOverridezN
    Test that environment variables are reloaded by Numba when modified.
    Fc          
   C   s^   |   }| | tdd& |   }| |ddddddg W d Q R X |   }| | d S )	NZNUMBA_DEBUG1r2   r3   r4   r5   r6   r7   )r[   ZassertFalser   rE   )r   rB   r   r   r   
test_debug   s    

z"TestEnvironmentOverride.test_debugN)r!   r"   r#   rr   _numba_parallel_test_ru   r   r   r   r   rs      s   rs   c               @   s8   e Zd ZdZdZdd Zeedd Zedd Z	d	S )
TestParforsDebugz5
    Tests debug options associated with parfors
    Fc             C   s:   d}d}x |D ]}|t |jkrd}P qW | |d d S )NzVparallel=True was specified but no transformation for parallel execution was possible.FTz Warning message should be found.)strmessageZ
assertTrue)r   Z	warn_listmsgZwarning_foundwr   r   r   check_parfors_warning   s    
z&TestParforsDebug.check_parfors_warningc          
   C   sj   t ddV ttjdd}tjdd$}tdt tt	||ft
d}W d	Q R X | | W d	Q R X d	S )
z
        Test that using parallel=True on a function that does not have parallel
        semantics warns if NUMBA_WARNINGS is set.
        ZNUMBA_WARNINGSrt   rT   CT)recordalways)flagsN)r   r   ZArrayZfloat64warningscatch_warningssimplefilterr   r   r*   force_parallel_flagsr|   )r   Zarr_tyr{   rZ   r   r   r   
test_warns   s    
zTestParforsDebug.test_warnsc          
   C   sl  t ttjftd}tddD t }t ttjftd}W dQ R X | d}dd |D }dd |D }d	d |D }t	t
d
|d d}t||t| }d}	d}
x2t|||	D ]"\}}}|
||}| || qW |d |d f}	d}
x$|D ]}|
j|	 }| || qW tjdt|gf}	d}
x$|D ]}|
j|	 }| || q>W W dQ R X dS )zM
        Test that NUMBA_DEBUG_ARRAY_OPT_STATS produces valid output
        )r   ZNUMBA_DEBUG_ARRAY_OPT_STATSrt   N
c             S   s   g | ]}d |kr|qS )zis produced from patternr   ).0r   r   r   r   
<listcomp>  s    z?TestParforsDebug.test_array_debug_opt_stats.<locals>.<listcomp>c             S   s   g | ]}d |kr|qS )zis fused intor   )r   r   r   r   r   r     s    c             S   s   g | ]}d |kr|qS )zAfter fusion, functionr   )r   r   r   r   r   r     s    z	#([0-9]+)r   r   )z"('ones function', 'NumPy mapping'))r   user z6Parallel for-loop #{} is produced from pattern '{}' atz1Parallel for-loop #{} is fused into for-loop #{}.z:After fusion, function {} has {} parallel for-loop(s) #{}.)r   r-   r   rV   r   r   r   rY   splitintrecompilesearchgrouprangelenzipformatrF   r!   rR   )r   rZ   rB   outputZparallel_loop_outputZfuse_outputZafter_fusion_outputZparfor_stateZboundspatternZfmtr,   ZtrialsZlpatternZto_matchr   r   r   test_array_debug_opt_stats   s<    	





z+TestParforsDebug.test_array_debug_opt_statsN)
r!   r"   r#   rr   rv   r|   r   r   r   r   r   r   r   r   rw      s   
rw   __main__)7Z
__future__r   r   osrO   r   rh   r   Znumpyr&   Zsupportr   r   r   r   r	   Znumbar
   Zunittestr   r   r   Znumba.compilerr   r   Znumba.targets.cpur   Znumba.errorsr   r   r   Ztest_parforsr   Zmatmul_usecaser   r   r   objectr   Zint32rp   r%   r*   r-   r   rR   r/   rS   r\   re   rk   rs   rw   r!   mainr   r   r   r   <module>   sD   
4&[
