U
    9%e],                     @   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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,Z0G d"d# d#e-Z1G d$d% d%eZ2e3d&kre4  dS )'    N)TestCaseoverride_configoverride_env_configcaptured_stdoutforbid_codegenskip_parfors_unsupported
needs_blas)jit)typescompilerutils)compile_isolatedFlags)ParallelOptions)NumbaPerformanceWarning)prange)jitclassc                 C   s   | d }|S )N    )Zsomeargretvalr   r   U/var/www/html/Darija-Ai-API/env/lib/python3.8/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 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'   Zonesr   sin)nr)   ir   r   r   supported_parfor+   s    
r/   Tc                	   @   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 r   )assertRaisesAssertionError)r    argskwargsr   r   r   assert_fails:   s    zDebugTestBase.assert_failsc                 C   sn   t | jd}|D ]}||ks"td||< qt| D ]0\}}t| d| }|r\|| q8| || q8d S )NFTz_check_dump_%s)dictfromkeys	all_dumpsr:   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(   t jdkr| d| n| d| d S )N)      Z	BINARY_OP
BINARY_ADD)r   Z	PYVERSIONassertInr    rD   r   r   r   _check_dump_bytecodeI   s    
z"DebugTestBase._check_dump_bytecodec                 C   s   |  d| d S )NzCFG dominatorsrK   rL   r   r   r   _check_dump_cfgO   s    zDebugTestBase._check_dump_cfgc                 C   s   |  d| j | d S )Nz--IR DUMP: %s--rK   	func_namerL   r   r   r   _check_dump_irR   s    zDebugTestBase._check_dump_irc                 C   s   |  d| d S )Nz--propagate--rN   rL   r   r   r   _check_dump_typeinferU   s    z#DebugTestBase._check_dump_typeinferc                 C   s2   |  d| tjjd jjdkr.| |d| d S )Nz--LLVM DUMPauto_parallelFz#store i64 %\"\.\d", i64\* %"retptr")rK   r   r   optionsdefaultrF   assertRegexrL   r   r   r   _check_dump_llvmX   s    zDebugTestBase._check_dump_llvmc                 C   s"   |  d| j | |  d| d S )Nz--FUNCTION OPTIMIZED DUMP %sadd nsw i64 %arg.somearg, 1rP   rL   r   r   r   _check_dump_func_opt_llvm]   s    z'DebugTestBase._check_dump_func_opt_llvmc                 C   s"   |  d| j | |  d| d S )Nz--OPTIMIZED DUMP %srY   rP   rL   r   r   r   _check_dump_optimized_llvmb   s    z(DebugTestBase._check_dump_optimized_llvmc                 C   s.   |  d| j | t dkr*|  d| d S )Nz--ASSEMBLY %s)x86_64ZAMD64i386i686Zxorl)rK   rQ   platformmachinerL   r   r   r   _check_dump_assemblyf   s    z"DebugTestBase._check_dump_assemblyN)r"   r#   r$   setr@   r=   rG   rM   rO   rR   rS   rX   rZ   r[   ra   r   r   r   r   r0   5   s     r0   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 5 Q R X | S )N   rH   )r   r   r   r
   int64assertPreciseEqualentry_pointgetvaluer    rD   cresr   r   r   compile_simple_nopythonp   s    z-FunctionDebugTestBase.compile_simple_nopythonN)r"   r#   r$   rQ   rk   r   r   r   r   rc   l   s   rc   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 5 Q R X | |dg d S )NZDUMP_BYTECODETr1   r   rk   rG   rL   r   r   r   test_dump_bytecodez   s    z*TestFunctionDebugOutput.test_dump_bytecodec              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NDUMP_IRTr3   rm   rL   r   r   r   test_dump_ir   s    z$TestFunctionDebugOutput.test_dump_irc              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NZDUMP_CFGTr2   rm   rL   r   r   r   test_dump_cfg   s    z%TestFunctionDebugOutput.test_dump_cfgc              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NZ	DUMP_LLVMTr5   rm   rL   r   r   r   test_dump_llvm   s    z&TestFunctionDebugOutput.test_dump_llvmc              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NZDUMP_FUNC_OPTTr6   rm   rL   r   r   r   test_dump_func_opt_llvm   s    z/TestFunctionDebugOutput.test_dump_func_opt_llvmc              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NZDUMP_OPTIMIZEDTr7   rm   rL   r   r   r   test_dump_optimized_llvm   s    z0TestFunctionDebugOutput.test_dump_optimized_llvmc              	   C   s0   t dd |  }W 5 Q R X | |dg d S )NZDUMP_ASSEMBLYTr8   rm   rL   r   r   r   test_dump_assembly   s    z*TestFunctionDebugOutput.test_dump_assemblyN)
r"   r#   r$   rn   rp   rq   rr   rs   rt   ru   r   r   r   r   rl   x   s   rl   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 5 Q R X | S )Nrd   r   )	r   r   r   r
   re   rf   listrg   rh   ri   r   r   r   compile_simple_gen   s    &z+TestGeneratorDebugOutput.compile_simple_genc              	   C   sX   t dd |  }W 5 Q R X | |dg | d| j | td}| || d S )Nro   Tr3   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   rx   rG   rK   rQ   textwrapdedent)r    rD   Zexpected_gen_infor   r   r   test_dump_ir_generator   s    
z/TestGeneratorDebugOutput.test_dump_ir_generatorN)r"   r#   r$   rQ   rx   r{   r   r   r   r   rv      s   rv   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 5 Q R X W 5 Q R X d S )NDISABLE_JITTZnopythonrd   rH   )r   r   r	   r   rf   )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 5 Q R X W 5 Q R X d S )Nr}   Tr   r~   )	r   r   r   simple_class_specr   rf   r   r	   r&   )r    Z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   s^   |   }| | tdd& |   }| |ddddddg W 5 Q R X |   }| | d S )	NZNUMBA_DEBUG1r3   r4   r5   r6   r7   r8   )rk   ZassertFalser   rG   rL   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krd} q(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    Z	warn_listmsgZwarning_foundwr   r   r   check_parfors_warning   s    z&TestParforsDebug.check_parfors_warningc              	   C   sT   t t jdd}tjdd$}tdt tt||ft	d}W 5 Q R X | 
| dS )zr
        Test that using parallel=True on a function that does not have parallel
        semantics warns.
        rd   CT)recordalwaysflagsN)r
   ZArrayZfloat64warningscatch_warningssimplefilterr   r   r+   force_parallel_flagsr   )r    Zarr_tyr   rj   r   r   r   
test_warns   s    
zTestParforsDebug.test_warnsc              
   C   s^  t ttjftd}tdd6 t }t ttjftd}W 5 Q R X | d}dd |D }dd |D }dd |D }t	t
d	|d
 d}t||t| }d}	d}
t|||	D ]"\}}}|
||}| || q|d |d
 f}	d}
|D ]}|
j|	 }| || qtjdt|gf}	d}
|D ]}|
j|	 }| || q2W 5 Q R X dS )zM
        Test that NUMBA_DEBUG_ARRAY_OPT_STATS produces valid output
        r   ZNUMBA_DEBUG_ARRAY_OPT_STATSr   
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     s      c                 S   s   g | ]}d |kr|qS )zAfter fusion, functionr   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) #{}.N)r   r/   r
   re   r   r   r   rh   splitintrecompilesearchgrouprangelenzipformatrK   r"   rb   )r    rj   rD   outputZparallel_loop_outputZfuse_outputZafter_fusion_outputZparfor_stateZboundspatternfmtr.   ZtrialsZlpatternZto_matchr   r   r   test_array_debug_opt_stats  sP    	




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__)5osr_   r   ry   r   numpyr'   Znumba.tests.supportr   r   r   r   r   r   r   Znumbar	   Z
numba.corer
   r   r   Znumba.core.compilerr   r   Znumba.core.cpur   Znumba.core.errorsr   r   Znumba.experimentalr   Zunittestr   r   objectr   Zint32r   r&   r+   r/   r   rT   Znrtr0   rc   rl   rv   r|   r   r   r"   mainr   r   r   r   <module>   sB   $
7&Z
