o
    1&i0                     @   s2  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"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   Zpyobject_fields r   r   9C:\wamp64\www\opt\env\Lib\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globalsZ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 )/
CPUContextz0
    Changes BaseContext calling convention
    Tcpuc                    s   t  || d S N)super__init__)selfZ	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.execarmv7lzlibgcc_s.so.1)r   ZMACHINE_BITSis32bitr   ZJITCPUCodegenr+   platformmachinellZload_library_permanentlyr   Zc_math_functionsinstallr'   r   r   r   init0   s
   
zCPUContext.initc           (      C   s  t |  ddlm}m}m}m}m}m}m	}m
}m}	m}
m}m}m} ddlm}m} ddlm}m} ddl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&}m'} ddlm(} ddlm)}  ddlm*}!m+}"m,}#m-}$ ddlm.}% ddl/m0}& | 1|!j2 | 1|%j2 | 1|"j2 | 1| j2 | 1|#j2 | 1|$j2 | 1|&j3 t4j5j67  ddl8m9}' d S )Nr   )builtinscharseqenumimplhashingheapq	iteratorslistobjnumbersrangeobjsetobjslicingtupleobjunicode)optionalinline_closurecall)gdb_hookliteral)linalg	arraymatharrayobj)generator_coregenerator_methods)polynomial_corepolynomial_functions)	typeddictdictimpl)	typedlist
listobject)jitclassfunction_type)
npdatetime)npyimpl)	cmathimplmathimpl	printimpl
randomimpl)cffiimpl)ClassBuilder)ndarray):r   Z
initializenumba.cpythonr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   
numba.corerD   rE   Z
numba.miscrF   rG   numba.nprH   rI   rJ   Znumba.np.randomrK   rL   Znumba.np.polynomialrM   rN   numba.typedrO   rP   rQ   rR   Znumba.experimentalrS   rT   rU   rV   rW   rX   rY   rZ   r[   Z numba.experimental.jitclass.baser\   Zinstall_registryregistryZclass_impl_registrynumbacoreentrypointsZinit_allZnumba.np.unsafer]   )(r'   r7   r8   r9   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[   Zjitclassimplr]   r   r   r   load_additional_registries<   s0   
<z%CPUContext.load_additional_registriesc                 C   s   | j jS r$   )r+   target_datar5   r   r   r   rg   h   s   zCPUContext.target_datac                 K   s    t j|fi |}| j|ddS )NT)r+   Zaot_mode)r   ZAOTCPUCodegenZ	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+   r5   r   r   r   r   q   s   zCPUContext.codegenc                 C   s
   t | S r$   )r
   ZCPUCallConvr5   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)refZcast_ref)r	   pointer_addr   
_impl_infor    )r'   builderZ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_pyobjectZ	debug_msg)Zdeclare_env_globalmoduleget_env_namefndescloadget_python_apiZemit_environment_sentryenv_namern   get_env_managerenvironment)r'   rm   ro   ZenvgvZenvargpyapiZenv_bodyr   r   r   rv      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	   rk   r   rl   )r'   rm   Zgenptrry   r   r   r   get_generator_state   s   zCPUContext.get_generator_statec                 C      ddl m} || |||S )zR
        Build a list from the Numba *list_type* and its initial *items*.
        r   )r=   )r^   r=   
build_list)r'   rm   Z	list_typeitemsr=   r   r   r   r|         zCPUContext.build_listc                 C   r{   )zP
        Build a set from the Numba *set_type* and its initial *items*.
        r   )r@   )r^   r@   	build_set)r'   rm   set_typer}   r@   r   r   r   r      r~   zCPUContext.build_setc                 C   s   ddl m} || ||||S )Nr   )
dictobject)ra   r   	build_map)r'   rm   	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_moduler0   r   Z
fix_divmodZ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)r-   ri   get_function_typerestypeargtypesr   Functionllvm_func_namer   buildadd_ir_module)
r'   r   rr   r   r   r   wrapper_modulefntywrapper_calleerm   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6  |}| } j|||  |jt }||}|| || || W d    n1 sw   Y  || || d S )	NZcfunc_wrapperc                    s   g | ]}  |qS r   )get_value_type).0tyr5   r   r   
<listcomp>   s    z3CPUContext.create_cfunc_wrapper.<locals>.<listcomp>entry)Znoinline)attrsF)Zlikely)r-   ri   r   r   r   r   r   r   r   FunctionTypeZllvm_cfunc_wrapper_nameZ	IRBuilderZappend_basic_blockcall_functionargsZif_thenZis_errorrt   Z
gil_ensureZraise_errorZinsert_const_stringrp   reprZstring_from_stringZerr_write_unraisableZdecrefZgil_releaseretr   )r'   r   rr   r   r   r   r   r   Zll_argtypesZll_return_typeZwraptyZwrapfnrm   statusoutrx   Z	gil_stateZcstrZstrobjr   r5   r   create_cfunc_wrapper   s8   






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.)
Zget_pointer_to_functionZllvm_cpython_wrapper_namequalnamer   Zmake_functionZlookup_modulesplitr   Zset_envrq   )r'   r   rr   r   ZfnptrdocZ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   ArrayZint32Zget_abi_sizeofr   )r'   ndimZarytyr   r   r   calc_array_sizeof   s   zCPUContext.calc_array_sizeofc                 C   s
   t |S r$   )r   get_ufunc_info)r'   Z	ufunc_keyr   r   r   r     s   
zCPUContext.get_ufunc_info)r#   )F)r   r   r   __doc__Zallow_dynamic_globalsr&   r-   r   r6   rf   propertyrg   rh   r   ri   rn   rv   rz   r|   r   r   r   r   r   r   r   r   __classcell__r   r   r)   r   r"   #   s6    
,


		
 r"   ZnopythonZforceobjZloopliftZ_nrtdebugboundscheckZnogilZno_rewritesZno_cpython_wrapperZno_cfunc_wrapperZparallelr   error_modelinlineforceinlineZ_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s0|jr,d|_ntj|_| ds9|j|_	d|_
|d	 |jd
dd |d |jrUd|_d S d S )Nenable_pyobjectTenable_loopliftZnrt)default	debuginfodbg_extend_lifetimesr   r   r   pythonr   F)is_setr   r   Zinherit_if_not_setr   ZDEBUGINFO_DEFAULTr   r   ZEXTEND_VARIABLE_LIFETIMESr   Zenable_pyobject_loopliftr   Zdbg_optnone)r'   flagsoptionsr   r   r   finalize#  s(   







zCPUTargetOptions.finalizeN)r   r   r   r   r   r   r   r   r   "  s    r   )*r1   Zllvmlite.bindingZbindingr3   Zllvmliter   rc   r   Znumba.core.callwrapperr   Znumba.core.baser   r_   r   r   r   r	   r
   r   r   r   r   Znumba.core.optionsr   r   Znumba.core.runtimer   Znumba.core.compiler_lockr   Znumba.core.entrypointsZnumba.core.cpu_optionsr   r   r   r`   r   	Structurer   r    r"   Z_options_mixinr   r   r   r   r   <module>   sJ    , k