o
    8ήc+                     @   s  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mZmZ d dlmZ d dl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 d d	lmZ d dl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(_*G dd deZ+G dd de+Z,G dd de,Z-G dd de+Z.G d d! d!e+Z/G d"d# d#e,Z0G d$d% d%eZ1e2d&kre3  dS dS )'    N)TestCaseoverride_configoverride_env_configcaptured_stdoutforbid_codegenskip_parfors_unsupported
needs_blas)jit)typescompiler)compile_isolatedFlags)ParallelOptions)NumbaPerformanceWarning)prange)jitclassc                 C   s   | d }|S )N    )someargretvalr   r   =/tmp/pip-target-vg8gfxp4/lib/python/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 r   r   )objr   r   r   simple_class_user%   s   r&   c                 C   s   t | |S r   )npdot)abr   r   r   unsupported_parfor(   s   r+   c                 C   s2   t | }t| D ]}|| t | ||< q	|S r   )r'   onesr   sin)nr)   ir   r   r   supported_parfor+   s   
r0   Tc                   @   sh   e Zd Zeg 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S )DebugTestBase)bytecodecfgir	typeinferllvmfunc_opt_llvmoptimized_llvmassemblyc                 O   s   | j tg|R i | d S r   )assertRaisesAssertionError)r    argskwargsr   r   r   assert_fails:   s   zDebugTestBase.assert_failsc                 C   sn   t | jd}|D ]}||v sJ d||< q	t| D ]\}}t| d| }|r.|| q| || qd S )NFTz_check_dump_%s)dictfromkeys	all_dumpssorteditemsgetattrr>   )r    out
dump_namesenabled_dumpsnameenabled
check_methr   r   r   check_debug_output=   s   

z DebugTestBase.check_debug_outputc                 C      |  d| d S )N
BINARY_ADDassertInr    rE   r   r   r   _check_dump_bytecodeI      z"DebugTestBase._check_dump_bytecodec                 C   rL   )NzCFG dominatorsrN   rP   r   r   r   _check_dump_cfgL   rR   zDebugTestBase._check_dump_cfgc                 C   s   |  d| j | d S )Nz--IR DUMP: %s--rO   	func_namerP   r   r   r   _check_dump_irO   s   zDebugTestBase._check_dump_irc                 C   rL   )Nz--propagate--rN   rP   r   r   r   _check_dump_typeinferR   rR   z#DebugTestBase._check_dump_typeinferc                 C   s6   |  d| tjjd jjdkr| |d| d S d S )Nz--LLVM DUMPauto_parallelFz#store i64 %\"\.\d", i64\* %"retptr")rO   r   r   optionsdefaultrI   assertRegexrP   r   r   r   _check_dump_llvmU   s   zDebugTestBase._check_dump_llvmc                 C   "   |  d| j | |  d| d S )Nz--FUNCTION OPTIMIZED DUMP %sadd nsw i64 %arg.somearg, 1rT   rP   r   r   r   _check_dump_func_opt_llvmZ   s   z'DebugTestBase._check_dump_func_opt_llvmc                 C   r]   )Nz--OPTIMIZED DUMP %sr^   rT   rP   r   r   r   _check_dump_optimized_llvm_   s   z(DebugTestBase._check_dump_optimized_llvmc                 C   s2   |  d| j | t dv r|  d| d S d S )Nz--ASSEMBLY %s)x86_64AMD64i386i686xorl)rO   rU   platformmachinerP   r   r   r   _check_dump_assemblyc   s   z"DebugTestBase._check_dump_assemblyN)r"   r#   r$   setrA   r>   rK   rQ   rS   rV   rW   r\   r_   r`   rh   r   r   r   r   r1   5   s    r1   c                   @   s   e Zd ZdZdd ZdS )FunctionDebugTestBaser   c                 C   sT   t  }tttjf}| |dd W d    | S 1 s!w   Y  | S )N      )r   r   r   r
   int64assertPreciseEqualentry_pointgetvaluer    rE   cresr   r   r   compile_simple_nopythonm   s   
z-FunctionDebugTestBase.compile_simple_nopythonN)r"   r#   r$   rU   rs   r   r   r   r   rj   i   s    rj   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   D   t dd |  }W d    n1 sw   Y  | |dg d S )NDUMP_BYTECODETr2   r   rs   rK   rP   r   r   r   test_dump_bytecodew      
z*TestFunctionDebugOutput.test_dump_bytecodec                 C   ru   )NDUMP_IRTr4   rw   rP   r   r   r   test_dump_ir|   ry   z$TestFunctionDebugOutput.test_dump_irc                 C   ru   )NDUMP_CFGTr3   rw   rP   r   r   r   test_dump_cfg   ry   z%TestFunctionDebugOutput.test_dump_cfgc                 C   ru   )N	DUMP_LLVMTr6   rw   rP   r   r   r   test_dump_llvm   ry   z&TestFunctionDebugOutput.test_dump_llvmc                 C   ru   )NDUMP_FUNC_OPTTr7   rw   rP   r   r   r   test_dump_func_opt_llvm   ry   z/TestFunctionDebugOutput.test_dump_func_opt_llvmc                 C   ru   )NDUMP_OPTIMIZEDTr8   rw   rP   r   r   r   test_dump_optimized_llvm   ry   z0TestFunctionDebugOutput.test_dump_optimized_llvmc                 C   ru   )NDUMP_ASSEMBLYTr9   rw   rP   r   r   r   test_dump_assembly   ry   z*TestFunctionDebugOutput.test_dump_assemblyN)
r"   r#   r$   rx   r{   r}   r   r   r   r   r   r   r   r   rt   u   s    rt   c                   @       e Zd ZdZdd Zdd ZdS )TestGeneratorDebugOutputr   c                 C   sb   t  "}tttjtjf}| t|ddddg W d    | S 1 s(w   Y  | S )Nrk   r   )	r   r   r   r
   rm   rn   listro   rp   rq   r   r   r   compile_simple_gen   s   
z+TestGeneratorDebugOutput.compile_simple_genc                 C   sl   t dd |  }W d    n1 sw   Y  | |dg | d| j | td}| || d S )Nrz   Tr4   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   r   rK   rO   rU   textwrapdedent)r    rE   expected_gen_infor   r   r   test_dump_ir_generator   s   

z/TestGeneratorDebugOutput.test_dump_ir_generatorN)r"   r#   r$   rU   r   r   r   r   r   r   r      s    r   c                   @   r   )TestDisableJITz:
    Test the NUMBA_DISABLE_JIT environment variable.
    c              	   C   s   t dd3 t  tddt}| |dd W d    n1 s#w   Y  W d    d S W d    d S 1 s;w   Y  d S )NDISABLE_JITTnopythonrk   rl   )r   r   r	   r   rn   )r    cfuncr   r   r   test_jit   s   "zTestDisableJIT.test_jitc              	   C   s   t ddC t ' ttt}| }| |jd tddt}| ||d W d    n1 s3w   Y  W d    d S W d    d S 1 sKw   Y  d S )Nr   Tr   r   )	r   r   r   simple_class_specr   rn   r   r	   r&   )r    SimpleJITClassr%   r   r   r   r   test_jitclass   s   "zTestDisableJIT.test_jitclassN)r"   r#   r$   __doc__r   r   r   r   r   r   r      s    r   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   sj   |   }| | tdd |   }| |g d W d    n1 s%w   Y  |   }| | d S )NNUMBA_DEBUG1)r4   r5   r6   r7   r8   r9   )rs   assertFalser   rK   rP   r   r   r   
test_debug   s   
z"TestEnvironmentOverride.test_debugN)r"   r#   r$   r   _numba_parallel_test_r   r   r   r   r   r      s    r   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   s8   d}d}|D ]}|t |jv rd} nq| |d d S )NzX'parallel=True' was specified but no transformation for parallel execution was possible.FTz Warning message should be found.)strmessage
assertTrue)r    	warn_listmsgwarning_foundwr   r   r   check_parfors_warning   s   z&TestParforsDebug.check_parfors_warningc                 C   sh   t t jdd}tjdd}tdt tt||ft	d}W d   n1 s(w   Y  | 
| dS )zr
        Test that using parallel=True on a function that does not have parallel
        semantics warns.
        rk   CT)recordalwaysflagsN)r
   Arrayfloat64warningscatch_warningssimplefilterr   r   r+   force_parallel_flagsr   )r    arr_tyr   rr   r   r   r   
test_warns   s   
zTestParforsDebug.test_warnsc              	   C   s  t ttjftd}tdd t }t ttjftd}W d   n1 s&w   Y  | d}dd |D }dd |D }d	d |D }t	t
d
|d d}t||t| }d}	d}
t|||	D ]\}}}|
||}| || qi|d |d f}	d}
|D ]}|
j|	 }| || qtjdt|gf}	d}
|D ]}|
j|	 }| || qW d   dS 1 sw   Y  dS )zM
        Test that NUMBA_DEBUG_ARRAY_OPT_STATS produces valid output
        r   NUMBA_DEBUG_ARRAY_OPT_STATSr   N
c                 S      g | ]}d |v r|qS )zis produced from patternr   .0r   r   r   r   
<listcomp>      z?TestParforsDebug.test_array_debug_opt_stats.<locals>.<listcomp>c                 S   r   )zis fused intor   r   r   r   r   r     r   c                 S   r   )zAfter fusion, functionr   r   r   r   r   r     r   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   r0   r
   rm   r   r   r   rp   splitintrecompilesearchgrouprangelenzipformatrO   r"   ri   )r    rr   rE   outputparallel_loop_outputfuse_outputafter_fusion_outputparfor_stateboundspatternfmtr/   trialslpatternto_matchr   r   r   test_array_debug_opt_stats   sV   
	



"z+TestParforsDebug.test_array_debug_opt_statsN)
r"   r#   r$   r   r   r   r   r   r   r   r   r   r   r   r      s    
r   __main__)4osrf   r   r   r   numpyr'   numba.tests.supportr   r   r   r   r   r   r   numbar	   
numba.corer
   r   numba.core.compilerr   r   numba.core.cpur   numba.core.errorsr   r   numba.experimentalr   unittestr   r   objectr   int32r   r&   r+   r0   r   rX   nrtr1   rj   rt   r   r   r   r   r"   mainr   r   r   r   <module>   sF    $
4&Z