o
    ‘iy"  ã                   @   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rne ¡  dS 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   úg/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/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J |ƒ‚t|ƒ}|ddƒ}|dks%J |ƒ‚d S )NÚother_codegenÚsumé   é   é   )r   Úunserialize_libraryÚget_pointer_to_functionÚ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   ó"   |   tt¡}| ¡ }|  |¡ d S r   )r   r'   r(   Úserialize_using_bitcoder.   ©r
   r   r   r   r   r   Ú"test_serialize_unserialize_bitcode„   ó   z8JITCPUCodegenTestCase.test_serialize_unserialize_bitcodec                 C   r=   r   )r   r'   r(   r>   r<   r?   r   r   r   Ú&test_unserialize_other_process_bitcode‰   rA   z<JITCPUCodegenTestCase.test_unserialize_other_process_bitcodec                 C   ó*   |   tt¡}| ¡  | ¡ }|  |¡ d S r   )r   r'   r(   Úenable_object_cachingÚserialize_using_object_coder.   r?   r   r   r   Ú&test_serialize_unserialize_object_codeŽ   ó   z<JITCPUCodegenTestCase.test_serialize_unserialize_object_codec                 C   rC   r   )r   r'   r(   rD   rE   r<   r?   r   r   r   Ú*test_unserialize_other_process_object_code”   rG   z@JITCPUCodegenTestCase.test_unserialize_other_process_object_codec              	   C   s  |   tt¡}| ¡  | ¡ }tjdd}| ¡ }| ¡ }| 	d¡ W d  ƒ n1 s,w   Y  |  
t|ƒd¡ tdƒ}| |¡}tjdd}t d¡ |  || ¡ ¡ W d  ƒ n1 s`w   Y  |  
t|ƒd¡ |  d	t|d jƒ¡ tjdd}t d¡ |  | ¡ |¡ W d  ƒ n1 s–w   Y  |  
t|ƒd¡ |  d	t|d jƒ¡ tjdd'}t d¡ |  t¡}| 	d¡ W d  ƒ n1 sÏw   Y  W d  ƒ n1 sÞw   Y  |  
t|ƒd¡ |  d	t|d jƒ¡ |  dt|jƒ¡ dS )
z	
        T)Úrecordr   Nr   r   Úalwaysé   zInspection disabled)r   r'   r(   rD   rE   Ú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š   sB   ý

þ
þ
ÿ€þz4JITCPUCodegenTestCase.test_cache_disabled_inspectionc                 C   s\   |   tt¡}| ¡  | ¡  | ¡  t |¡}t |j¡}~|  	|ƒ d ¡ |  	|ƒ d ¡ d S r   )
r   r'   r(   rD   r>   rE   ÚweakrefÚrefZ_final_moduleZassertIs)r
   r   ÚuÚvr   r   r   Útest_library_lifetimeÃ   s   
z+JITCPUCodegenTestCase.test_library_lifetimer   )r4   Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úclassmethodr#   r)   r-   r.   r<   r@   rB   rF   rH   rV   ÚunittestZexpectedFailurer[   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 ]}
| |
¡}|rF|	 | ¡ d ¡ q4|  t|	ƒd¡ |  |	d |	d	 ¡ d
 |	d ¡}d}t || ¡}t|ƒD ]$}
| |
¡}|r‘| ¡ d }| ¡  d¡}|D ]
}d|v r  d S q…qmqm|  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   rK   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&   rN   ÚreversedÚstripÚsplitZfail)r
   rb   Ú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Ô   sD   




€
üù

z'TestWrappers.test_noinline_on_main_callN)r4   r\   r]   rx   r   r   r   r   ra   Ò   s    ra   Ú__main__)r^   rL   r0   Úctypesr*   rg   r5   r7   rW   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   ra   r4   Úmainr   r   r   r   Ú<module>   s2    

 2ÿ