U
    ð¾|eR0  ã                   @   s4  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 dl
mZ d dlmZmZmZmZmZmZ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Zd d
lmZm Z m!Z! d dl"m#Z# G dd„ dej$ƒZ%G dd„ dej$ƒZ&G dd„ deƒZ'eddddddddddddddd d!d"d#ƒZ(G d$d%„ d%e(eƒZ)dS )&é    N)Úir)Ú_dynfunc)ÚPyCallWrapper)ÚBaseContext)	ÚutilsÚtypesÚconfigÚcgutilsÚcallconvÚcodegenÚ	externalsÚfastmathpassÚ
intrinsics)ÚTargetOptionsÚinclude_default_options)Úrtsys)Úglobal_compiler_lock)ÚParallelOptionsÚFastMathOptionsÚInlineOptions)Úufunc_dbc                   @   s   e Zd ZdejfgZdS )ÚClosureBodyÚenvN©Ú__name__Ú
__module__Ú__qualname__r   ÚpyobjectÚ_fields© r   r   úK/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/cpu.pyr      s   r   c                   @   s    e Zd ZdejfdejfgZdS )ÚEnvBodyÚglobalsÚconstsNr   r   r   r   r    r!      s   þr!   c                       sÎ   e Zd ZdZdZd-‡ fdd„	Zdd„ Zedd	„ ƒZd
d„ Z	e
dd„ ƒZdd„ Zdd„ Ze
dd„ ƒZdd„ Zd.dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd/d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS )0Ú
CPUContextz0
    Changes BaseContext calling convention
    TÚcpuc                    s   t ƒ  ||¡ d S ©N)ÚsuperÚ__init__)ÚselfÚ	typingctxÚtarget©Ú	__class__r   r    r(   )   s    zCPUContext.__init__c                 C   s   | j  |¡S r&   )Ú_internal_codegenZ_create_empty_module)r)   Únamer   r   r    Úcreate_module-   s    zCPUContext.create_modulec                 C   s>   t jdk| _t d¡| _t ¡ dkr.t 	d¡ t
j | ¡ d S )Né    z
numba.execZarmv7lzlibgcc_s.so.1)r   ÚMACHINE_BITSÚis32bitr   ZJITCPUCodegenr.   ÚplatformÚmachineÚllÚload_library_permanentlyr   Zc_math_functionsÚinstall©r)   r   r   r    Úinit0   s
    
zCPUContext.initc           &      C   sr  t  | ¡ ddlm}m}m}m}m}m}m	}m
}m}	m}
m}m}m} ddlm} ddlm}m} ddlm}m}m}m} ddlm}m} ddlm}m} ddlm }m!} dd	l"m#}m$} dd
lm%} ddlm&} ddlm'}m(} m)}!m*}" ddlm+}# ddl,m-}$ |  .|j/¡ |  .|#j/¡ |  .| j/¡ |  .|j/¡ |  .|!j/¡ |  .|"j/¡ |  .|$j0¡ t1j2j3 4¡  ddl5m6}% d S )Nr   )ÚbuiltinsÚcharseqÚenumimplÚhashingÚheapqÚ	iteratorsÚlistobjÚnumbersÚrangeobjÚsetobjÚslicingÚtupleobjÚunicode)Úoptional)Úgdb_hookÚliteral)ÚlinalgÚ
polynomialÚ	arraymathÚarrayobj)Úgenerator_coreÚgenerator_methods)Ú	typeddictÚdictimpl)Ú	typedlistÚ
listobject)ÚjitclassÚfunction_type)Ú
npdatetime)Únpyimpl)Ú	cmathimplÚmathimplÚ	printimplÚ
randomimpl)Úcffiimpl)ÚClassBuilder)Úndarray)7r   Ú
initializeÚnumba.cpythonr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   Ú
numba.corerH   Ú
numba.miscrI   rJ   Únumba.nprK   rL   rM   rN   Znumba.np.randomrO   rP   Únumba.typedrQ   rR   rS   rT   Znumba.experimentalrU   rV   rW   rX   rY   rZ   r[   r\   r]   Z numba.experimental.jitclass.baser^   Úinstall_registryÚregistryZclass_impl_registryÚnumbaÚcoreÚentrypointsÚinit_allZnumba.np.unsafer_   )&r)   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   Zjitclassimplr_   r   r   r    Úload_additional_registries<   s.    
<z%CPUContext.load_additional_registriesc                 C   s   | j jS r&   )r.   Útarget_datar9   r   r   r    rm   h   s    zCPUContext.target_datac                 K   s   t j|f|Ž}| j|dd�S )NT)r.   Úaot_mode)r   ZAOTCPUCodegenÚ	subtarget)r)   r/   Zaot_optionsZaot_codegenr   r   r    Úwith_aot_codegenl   s    ÿzCPUContext.with_aot_codegenc                 C   s   | j S r&   )r.   r9   r   r   r    r   q   s    zCPUContext.codegenc                 C   s
   t  | ¡S r&   )r
   ÚCPUCallConvr9   r   r   r    Ú	call_convt   s    zCPUContext.call_convc                 C   s$   t  ||tjd ¡}t| ||dd�S )zŸ
        From the given *envptr* (a pointer to a _dynfunc.Environment object),
        get a EnvBody allowing structured access to environment fields.
        Zoffsetof_env_bodyT)ÚrefÚcast_ref)r	   Úpointer_addr   Ú
_impl_infor!   )r)   ÚbuilderÚenvptrZbody_ptrr   r   r    Úget_env_bodyx   s      ÿzCPUContext.get_env_bodyFc                 C   sZ   |   |j|  | j¡¡}| |¡}|  |¡}|j||| jjd� |  ||¡}| 	| j
||¡S )N)Úreturn_pyobjectÚ	debug_msg)Údeclare_env_globalÚmoduleÚget_env_nameÚfndescÚloadÚget_python_apiÚemit_environment_sentryÚenv_namery   Úget_env_managerÚenvironment)r)   rw   rz   ZenvgvÚenvargÚpyapiÚenv_bodyr   r   r    r„   �   s    
ÿ

ýzCPUContext.get_env_managerc                 C   s   t j||tjd |d�S )z~
        From the given *genptr* (a pointer to a _dynfunc.Generator object),
        get a pointer to its state area.
        Zoffsetof_generator_state)Úreturn_type)r	   ru   r   rv   )r)   rw   Úgenptrr‰   r   r   r    Úget_generator_stateŽ   s      þzCPUContext.get_generator_statec                 C   s   ddl m} | | |||¡S )zR
        Build a list from the Numba *list_type* and its initial *items*.
        r   )rA   )ra   rA   Ú
build_list)r)   rw   Z	list_typeÚitemsrA   r   r   r    rŒ   —   s    zCPUContext.build_listc                 C   s   ddl m} | | |||¡S )zP
        Build a set from the Numba *set_type* and its initial *items*.
        r   )rD   )ra   rD   Ú	build_set)r)   rw   Úset_typer�   rD   r   r   r    rŽ   ž   s    zCPUContext.build_setc                 C   s   ddl m} | | ||||¡S )Nr   )Ú
dictobject)re   r�   Ú	build_map)r)   rw   Z	dict_typeZ
item_typesr�   r�   r   r   r    r‘   ¥   s    zCPUContext.build_mapc                 C   s4   | j rt || j ¡ | jr$t |¡ | tj¡ d S r&   )	Úfastmathr   Zrewrite_moduler3   r   Z
fix_divmodÚadd_linking_libraryr   Úlibrary)r)   Úmodr”   r   r   r    Úpost_loweringª   s
    
zCPUContext.post_loweringc           
   	   C   sX   |   d¡}| j |j|j¡}t |||j¡}t| ||||||d�}	|	 	¡  | 
|¡ d S )NÚwrapper)Úcall_helperÚrelease_gil)r0   rr   Úget_function_typeÚrestypeÚargtypesr   ÚFunctionÚllvm_func_namer   ÚbuildÚadd_ir_module)
r)   r”   r   r   r˜   r™   Úwrapper_moduleÚfntyÚwrapper_calleerw   r   r   r    Úcreate_cpython_wrapperµ   s    
ÿ  þz!CPUContext.create_cpython_wrapperc              	      s*  ˆ   d¡}ˆ j |j|j¡}t |||j¡}‡ fdd„|jD ƒ}ˆ  |j¡}	t 	|	|¡}
t ||
|j
¡}t | d¡¡}ˆ jj|||j|j|jdd�\}}|j|jdd��b ˆ  |¡}| ¡ }ˆ j |||¡ ˆ  |jtˆ ƒ¡}| |¡}| |¡ | |¡ | |¡ W 5 Q R X | |¡ | |¡ d S )	NZcfunc_wrapperc                    s   g | ]}ˆ   |¡‘qS r   )Úget_value_type)Ú.0Útyr9   r   r    Ú
<listcomp>Ç   s     z3CPUContext.create_cfunc_wrapper.<locals>.<listcomp>Úentry)Únoinline)ÚattrsF)Úlikely)r0   rr   rš   r›   rœ   r   r�   rž   r¥   ÚFunctionTypeÚllvm_cfunc_wrapper_nameÚ	IRBuilderÚappend_basic_blockÚcall_functionÚargsÚif_thenÚis_errorr�   Ú
gil_ensureÚraise_errorÚinsert_const_stringr}   ÚreprÚstring_from_stringÚerr_write_unraisableÚdecrefÚgil_releaseÚretr    )r)   r”   r   r   r˜   r¡   r¢   r£   Zll_argtypesZll_return_typeZwraptyZwrapfnrw   ÚstatusÚoutr‡   Ú	gil_stateÚcstrÚstrobjr   r9   r    Úcreate_cfunc_wrapperÁ   s>    
ÿÿ    þ





zCPUContext.create_cfunc_wrapperc                 C   sV   |  |j¡}d|jf }t | ¡ |j d¡d ||||f¡}|j |  	|¡|¡ |S )zö
        Returns
        -------
        (cfunc, fnptr)

        - cfunc
            callable function (Can be None)
        - fnptr
            callable function address
        - env
            an execution environment (from _dynfunc)
        zcompiled wrapper for %rÚ.éÿÿÿÿ)
Úget_pointer_to_functionÚllvm_cpython_wrapper_nameÚqualnamer   Úmake_functionÚlookup_moduleÚsplitr   Úset_envr~   )r)   r”   r   r   ZfnptrÚdocÚcfuncr   r   r    Úget_executableá   s    ÿ
  üzCPUContext.get_executablec                 C   s    t  t j|d¡}|  |  |¡¡S )zI
        Calculate the size of an array struct on the CPU target
        ÚA)r   ÚArrayÚint32Úget_abi_sizeofr¥   )r)   ÚndimÚarytyr   r   r    Úcalc_array_sizeofþ   s    zCPUContext.calc_array_sizeofc                 C   s
   t  |¡S r&   )r   Úget_ufunc_info)r)   Ú	ufunc_keyr   r   r    r×     s    zCPUContext.get_ufunc_info)r%   )F)F)r   r   r   Ú__doc__Úallow_dynamic_globalsr(   r0   r   r:   rl   Úpropertyrm   rp   r   rr   ry   r„   r‹   rŒ   rŽ   r‘   r–   r¤   rÃ   rÏ   rÖ   r×   Ú__classcell__r   r   r,   r    r$   #   s4   
,

	
	 ÿ
 r$   ÚnopythonÚforceobjZloopliftZ_nrtÚdebugÚboundscheckZnogilÚno_rewritesÚno_cpython_wrapperÚno_cfunc_wrapperÚparallelr’   Úerror_modelÚinlineÚforceinlineÚtarget_backendZ_dbg_extend_lifetimesZ_dbg_optnonec                   @   s   e Zd Zdd„ ZdS )ÚCPUTargetOptionsc                 C   s´   |  d¡sd|_|  d¡s d|_|jddd� |  d¡s@tj|_|  d¡s`|jrXd|_ntj|_|  d¡sr|j|_	d|_
| d	¡ |jd
dd� | d¡ | d¡ |jr°d|_d S )NÚenable_pyobjectTÚenable_loopliftÚnrt)ÚdefaultÚ	debuginfoÚdbg_extend_lifetimesrà   r’   rå   Úpythonrè   rç   F)Úis_setrê   rë   Úinherit_if_not_setr   ÚDEBUGINFO_DEFAULTrî   rï   ÚEXTEND_VARIABLE_LIFETIMESrà   Úenable_pyobject_loopliftrç   Úoptnone)r)   ÚflagsÚoptionsr   r   r    Úfinalize%  s(    







zCPUTargetOptions.finalizeN)r   r   r   rù   r   r   r   r    ré   $  s   ré   )*r4   Úllvmlite.bindingÚbindingr6   Úllvmliter   rh   r   Znumba.core.callwrapperr   Únumba.core.baser   rb   r   r   r   r	   r
   r   r   r   r   Znumba.core.optionsr   r   Znumba.core.runtimer   Únumba.core.compiler_lockr   Znumba.core.entrypointsÚnumba.core.cpu_optionsr   r   r   rd   r   Ú	Structurer   r!   r$   Z_options_mixinré   r   r   r   r    Ú<module>   sJ   , kí