U
    Ã9%ey"  ã                   @   sÜ   d 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ZddlZddl	m
Z ddlZddlmZ ddlmZ ddlmZ ddlmZ dZdZd	Ze ejejej¡ZG d
d„ deƒZG dd„ deƒZedkrØe ¡  dS )z
Tests for numba.core.codegen.
é    N)Únjit)ÚJITCPUCodegen)Úglobal_compiler_lock)ÚTestCasezb
    define i32 @sum(i32 %.1, i32 %.2) {
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }
    z›
    define i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2) {
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }
a  
    declare i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2)

    define i32 @sum(i32 %.1, i32 %.2) {
      %.3 = call i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2)
      ret i32 %.3
    }
c                   @   sŒ   e Zd ZdZdd„ Zdd„ Zddd„Ze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ejdd„ ƒZdS ) ÚJITCPUCodegenTestCasez'
    Test the JIT code generation.
    c                 C   s   t  ¡  tdƒ| _d S )NZtest_codegen)r   Úacquirer   Úcodegen©Úself© r   úW/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/tests/test_codegen.pyÚsetUp;   s    zJITCPUCodegenTestCase.setUpc                 C   s   | ` t ¡  d S ©N)r   r   Úreleaser	   r   r   r   ÚtearDown?   s    zJITCPUCodegenTestCase.tearDownNc                 C   sb   | j  d¡}t |¡}| ¡  | |¡ |r^| j  d¡}t |¡}| ¡  | |¡ | |¡ |S )NZcompiled_moduleZlinking_module)r   Zcreate_libraryÚllZparse_assemblyÚverifyZadd_llvm_moduleZadd_linking_library)r
   ÚasmZlinking_asmÚlibraryZ	ll_moduleZlinking_libraryr   r   r   Úcompile_moduleC   s    




z$JITCPUCodegenTestCase.compile_modulec                 C   sN   t dƒ}| |¡}| d¡}|s(t|ƒ‚t|ƒ}|ddƒ}|dksJt|ƒ‚d S )NÚother_codegenÚsumé   é   é   )r   Úunserialize_libraryÚget_pointer_to_functionÚAssertionErrorÚctypes_sum_ty)ÚclsÚstater   r   ÚptrÚcfuncÚresr   r   r   Ú_check_unserialize_sumP   s    


z,JITCPUCodegenTestCase._check_unserialize_sumc                 C   sz   |   t¡}| d¡}|  |t¡ t|ƒ}|  |ddƒd¡ |   tt¡}| d¡}|  |t¡ t|ƒ}|  |ddƒd¡ d S )Nr   r   r   r   )	r   Úasm_sumr   ZassertIsInstanceÚintr   ÚassertEqualÚasm_sum_outerÚasm_sum_inner)r
   r   r!   r"   Zlibrary2r   r   r   Útest_get_pointer_to_functionZ   s    


z2JITCPUCodegenTestCase.test_get_pointer_to_functionc                 C   s0   | j  ¡ }t |¡ tdƒ}|  | ¡ |¡ d S )NZxxx)r   Zmagic_tupleÚpickleÚdumpsr   r'   )r
   ÚtupZcg2r   r   r   Útest_magic_tuplel   s    

z&JITCPUCodegenTestCase.test_magic_tuplec                 C   s   |   |¡ d S r   )r$   )r
   r    r   r   r   Ú_check_serialize_unserializet   s    z2JITCPUCodegenTestCase._check_serialize_unserializec                 C   s@   t  t |d¡¡}dt| jjd }t t	j
d|| ¡ g¡ d S )Néÿÿÿÿa  if 1:
            import base64
            import pickle
            import sys
            from numba.tests.test_codegen import %(test_class)s

            state = pickle.loads(base64.b64decode(sys.argv[1]))
            %(test_class)s._check_unserialize_sum(state)
            )Z
test_classz-c)Úbase64Ú	b64encoder+   r,   ÚdictÚ	__class__Ú__name__Ú
subprocessÚ
check_callÚsysÚ
executableÚdecode)r
   r    ÚargÚcoder   r   r   Ú _check_unserialize_other_processw   s
    ø	z6JITCPUCodegenTestCase._check_unserialize_other_processc                 C   s"   |   tt¡}| ¡ }|  |¡ d S r   )r   r(   r)   Úserialize_using_bitcoder/   ©r
   r   r    r   r   r   Ú"test_serialize_unserialize_bitcode„   s    z8JITCPUCodegenTestCase.test_serialize_unserialize_bitcodec                 C   s"   |   tt¡}| ¡ }|  |¡ d S r   )r   r(   r)   r>   r=   r?   r   r   r   Ú&test_unserialize_other_process_bitcode‰   s    z<JITCPUCodegenTestCase.test_unserialize_other_process_bitcodec                 C   s*   |   tt¡}| ¡  | ¡ }|  |¡ d S r   )r   r(   r)   Úenable_object_cachingÚserialize_using_object_coder/   r?   r   r   r   Ú&test_serialize_unserialize_object_codeŽ   s    z<JITCPUCodegenTestCase.test_serialize_unserialize_object_codec                 C   s*   |   tt¡}| ¡  | ¡ }|  |¡ d S r   )r   r(   r)   rB   rC   r=   r?   r   r   r   Ú*test_unserialize_other_process_object_code”   s    z@JITCPUCodegenTestCase.test_unserialize_other_process_object_codec              
   C   sž  |   tt¡}| ¡  | ¡ }tjdd }| ¡ }| ¡ }| 	d¡ W 5 Q R X |  
t|ƒd¡ tdƒ}| |¡}tjdd }t d¡ |  || ¡ ¡ W 5 Q R X |  
t|ƒd¡ |  dt|d jƒ¡ tjdd }t d¡ |  | ¡ |¡ W 5 Q R X |  
t|ƒd¡ |  dt|d jƒ¡ tjdd0}t d¡ |  t¡}| 	d¡ W 5 Q R X W 5 Q R X |  
t|ƒd¡ |  dt|d jƒ¡ |  dt|jƒ¡ d	S )
z	
        T)Úrecordr   r   r   Úalwaysé   zInspection disabledN)r   r(   r)   rB   rC   ÚwarningsÚcatch_warningsZget_llvm_strZget_asm_strZget_function_cfgr'   Úlenr   r   ÚsimplefilterZassertNotEqualZassertInÚstrÚmessageÚassertRaisesÚ	NameErrorÚ	exception)r
   r   r    ÚwZold_llvmZold_asmr   Zraisesr   r   r   Útest_cache_disabled_inspectionš   s6    



z4JITCPUCodegenTestCase.test_cache_disabled_inspectionc                 C   s\   |   tt¡}| ¡  | ¡  | ¡  t |¡}t |j¡}~|  	|ƒ d ¡ |  	|ƒ d ¡ d S r   )
r   r(   r)   rB   r>   rC   ÚweakrefÚrefZ_final_moduleZassertIs)r
   r   ÚuÚvr   r   r   Útest_library_lifetimeÃ   s    
z+JITCPUCodegenTestCase.test_library_lifetime)N)r5   Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úclassmethodr$   r*   r.   r/   r=   r@   rA   rD   rE   rS   ÚunittestZexpectedFailurerX   r   r   r   r   r   6   s"   

	)r   c                   @   s   e Zd Zdd„ ZdS )ÚTestWrappersc                 C   s:  t dd„ ƒ}|ƒ  |jd }|j| }|jj dd¡}d |¡}d}t || ¡}| 	|¡ 
¡ }g }	|D ]$}
| |
¡}|rh|	 | ¡ d ¡ qh|  t|	ƒd¡ |  |	d |	d	 ¡ d
 |	d ¡}d}t || ¡}t|ƒD ]P}
| |
¡}|rÚ| ¡ d }| ¡  d¡}|D ]}d|kr
 q$q
qÚ q6qÚ|  d¡S d S )Nc                   S   s   d S r   r   r   r   r   r   ÚfooØ   s    z4TestWrappers.test_noinline_on_main_call.<locals>.foor   ú$z\$z
.*call.*{}z.*(#[0-9]+).*r   rH   z^attributes\s+{}z\s+=\s+{(.*)}.*$ú Znoinlinez!Metadata did not match 'noinline')r   Z
signaturesZ	overloadsZfndescZmangled_nameÚreplaceÚformatÚreÚcompileZinspect_llvmÚ
splitlinesÚmatchÚappendÚgroupsr'   rK   ÚreversedÚstripÚsplitZfail)r
   r_   ÚsigÚolÚnameÚp1Úp2Z	call_siteÚlinesZmeta_data_idxÚlZmatchedZ	attr_siteZ	meta_dataZlmetaÚxr   r   r   Útest_noinline_on_main_callÔ   s>    







z'TestWrappers.test_noinline_on_main_callN)r5   rY   rZ   ru   r   r   r   r   r^   Ò   s   r^   Ú__main__)r[   rI   r1   Úctypesr+   rd   r6   r8   rT   Zllvmlite.bindingZbindingr   r]   Znumbar   Znumba.core.codegenr   Znumba.core.compiler_lockr   Znumba.tests.supportr   r%   r)   r(   Z	CFUNCTYPEÚc_intr   r   r^   r5   Úmainr   r   r   r   Ú<module>   s.   

 2