U
    Ã9%e>F  ã                   @   s  d dl Z d dl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 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 e  e¡ZdgZe e	jd¡Ze e	jd ¡Ze e	jd¡Z e e	jd¡Z!dd„ Z"G dd„ de#ƒZ$G dd„ de#ƒZ%G dd„ de%ƒZ&dS )é    N)Úir)ÚLinkage)Ú
llvm_types)Úcreate_constant_array)Úcompile_extraÚFlags)Úglobal_compiler_lock)Ú
cpu_target)Ú	nrtdynmod)ÚcgutilsZCompileré   é   c                  C   s$   dd l } dd l}| dt| dƒ ¡S )Nr   a      #include <stdint.h>

    #ifndef HAVE_LONGDOUBLE
        #define HAVE_LONGDOUBLE %d
    #endif

    typedef struct {
        float real;
        float imag;
    } complex64;

    typedef struct {
        double real;
        double imag;
    } complex128;

    #if HAVE_LONGDOUBLE
    typedef struct {
        long double real;
        long double imag;
    } complex256;
    #endif

    typedef float float32;
    typedef double float64;
    #if HAVE_LONGDOUBLE
    typedef long double float128;
    #endif
    Z
complex256)ÚnumpyÚtextwrapÚdedentÚhasattr)r   r   © r   úR/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/pycc/compiler.pyÚ
get_header   s
    ãr   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚExportEntryz0
    A simple record for exporting symbols.
    c                 C   s   || _ || _|| _d S ©N)ÚsymbolÚ	signatureÚfunction)Úselfr   r   r   r   r   r   Ú__init__G   s    zExportEntry.__init__c                 C   s   d| j | jf S )NzExportEntry(%r, %r))r   r   ©r   r   r   r   Ú__repr__L   s    zExportEntry.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   B   s   r   c                   @   sÆ   e Zd ZdZe ejejej	ejf¡Z
e e
¡Ze ejej	ejejej	f¡Ze e¡Zddd„Zdd„ Zdd„ Zed	d
„ ƒZddd„Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú_ModuleCompilerzÕA base class to compile Python modules to a single shared library or
    extension module.

    :param export_entries: a list of ExportEntry instances.
    :param module_name: the name of the exported module.
    Fc                 K   sD   || _ d| _g | _|| _d | _|| _tj| _tjj	| j f|Ž| _
d S )NF)Úmodule_nameÚexport_python_wrapÚdll_exportsÚexport_entriesÚexternal_init_functionÚuse_nrtr	   Útyping_contextÚtarget_contextZwith_aot_codegenÚcontext)r   r&   r#   r(   Zaot_optionsr   r   r   r   p   s    ÿÿz_ModuleCompiler.__init__c                 C   s
   d|f S )Nz._pycc_method_%sr   )r   Ú	func_namer   r   r   Ú_mangle_method_symbol~   s    z%_ModuleCompiler._mangle_method_symbolc                 C   s   t ‚dS )zAEmit generated Python wrapper and extension module code.
        N)ÚNotImplementedError)r   Úllvm_moduler   r   r   Ú_emit_python_wrapper   s    z$_ModuleCompiler._emit_python_wrapperc                 C   s®  i | _ i | _i | _| j ¡ }| | j¡}tƒ }d|_| j	sFd|_
d|_| jrld|_t | j¡\}}| |¡ | jD ]È}t| j| j|j|jj|jj|i |d}|jj}|j |¡}	| j	r$d|	_|jj}
|j |
¡}|  |j¡|_ d|_|j!j" #|jj$|jj%¡}|| j |< |j&| j|< |jj'| j|< qr|j|	_ | j( )|j¡ qr| j	rb| *d¡}|  +|¡ | |¡ | ,¡  | -¡ D ]6}|j | j(krr|jt.j/t.j0hkr d|_1nd|_1qr|S )z€Read all the exported functions/modules in the translator
        environment, and join them into a single LLVM module.
        T)ÚlocalsÚlibraryÚinternalÚexternalÚwrapperÚdefaultZhidden)2Úexported_function_typesÚfunction_environmentsÚenvironment_gvsr+   ÚcodegenZcreate_libraryr#   r   Z
no_compiler$   Zno_cpython_wrapperZno_cfunc_wrapperr(   Znrtr
   Zcreate_nrt_moduleZadd_ir_moduler&   r   r)   r   r   ÚargsÚreturn_typeZfndescÚllvm_func_namer2   Zget_functionÚlinkageZllvm_cpython_wrapper_namer-   r   Únamer*   Z	call_convZget_function_typeÚrestypeZargtypesÚenvironmentÚenv_namer%   ÚappendZcreate_ir_moduler0   ÚfinalizeZget_defined_functionsr   Úprivater3   Z
visibility)r   r:   r2   ÚflagsZ
nrt_moduleÚ_ÚentryZcresr,   Z	llvm_funcZwrappernamer5   ÚfntyZwrapper_moduleÚfnr   r   r   Ú_cull_exports†   sf    



  ü ÿ




z_ModuleCompiler._cull_exportsc              	   K   s6   || _ |  ¡ }t|dƒ}| | ¡ ¡ W 5 Q R X d S ©NÚwb)r$   rK   ÚopenÚwriteZemit_bitcode©r   ÚoutputÚwrapÚkwsr2   Úfoutr   r   r   Úwrite_llvm_bitcodeÇ   s    z"_ModuleCompiler.write_llvm_bitcodec              	   K   s6   || _ |  ¡ }t|dƒ}| | ¡ ¡ W 5 Q R X d S rL   )r$   rK   rN   rO   Zemit_native_objectrP   r   r   r   Úwrite_native_objectÍ   s    z#_ModuleCompiler.write_native_objectc                 C   s&   t |ƒ}d|kr"| d¡r"|d7 }|S )NÚint)Ú8Z16Z32Z64Z_t)ÚstrÚendswith)r   ZtyobjZret_valr   r   r   Ú	emit_typeÓ   s
    
z_ModuleCompiler.emit_typec           	   	      s”   t j |¡\}}t|d dƒl}| tƒ ¡ | d¡ ˆ jD ]H}|j}ˆ  |j	j
¡}d ‡ fdd„|j	jD ƒ¡}| d|||f ¡ q<W 5 Q R X d S )Nz.hÚwz
/* Prototypes */
z, c                 3   s   | ]}ˆ   |¡V  qd S r   )r[   )Ú.0Zargtyper   r   r   Ú	<genexpr>â   s   ÿz._ModuleCompiler.emit_header.<locals>.<genexpr>zextern %s %s(%s);
)ÚosÚpathÚsplitextrN   rO   r   r&   r   r[   r   r<   Újoinr;   )	r   rQ   ÚfnameÚextrT   Zexport_entryr?   r@   r;   r   r   r   Úemit_headerÚ   s    

ÿz_ModuleCompiler.emit_headerc                 C   sÌ   g }| j D ]d}|j}|  |¡}| j| }t |||¡}| j ||¡}tj 	|tj 
|tj¡ttf¡}	| |	¡ q
tj 	ttttg¡}
| |
¡ t| j|ƒ}t ||jd¡}||_d|_tj |ttg¡}|S )z
        Collect exported methods and emit a PyMethodDef array.

        :returns: a pointer to the PyMethodDef array.
        z.module_methodsr3   )r&   r   r-   r7   r   ÚFunctionr+   Úinsert_const_stringÚConstantÚliteral_structÚbitcastÚltÚ
_void_starÚMETH_VARARGS_AND_KEYWORDSÚNULLrC   ÚZEROr   Úmethod_def_tyr   Úadd_global_variableÚtypeÚinitializerr>   Úgep)r   r/   Zmethod_defsrH   r?   r=   rI   ZlfuncÚmethod_nameZmethod_def_constÚsentinelZmethod_array_initÚmethod_arrayZmethod_array_ptrr   r   r   Ú_emit_method_arrayæ   s4    


ýÿ
þz"_ModuleCompiler._emit_method_arrayc           
      C   sZ   g }| j D ]$}| j| }| |j¡}| |¡ q
t| j|ƒ}| j |d|¡}	|	 	t
t
g¡S )z©
        Emit an array of env_def_t structures (see modulemixin.c)
        storing the pickled environment constants for each of the
        exported functions.
        z.module_environments)r&   r8   Zserialize_uncachedZconstsrC   r   Ú
env_def_tyr+   Úinsert_unique_constrt   ro   )
r   r/   ÚbuilderÚpyapiZenv_defsrH   ÚenvZenv_defZenv_defs_initÚgvr   r   r   Ú_emit_environment_array  s    

þz'_ModuleCompiler._emit_environment_arrayc           
      C   sh   g }| j D ]2}| j| }| j ||¡}| tj¡}| |¡ q
ttj|ƒ}	| j 	|d|	¡}| 
ttg¡S )zj
        Emit an array of Environment pointers that needs to be filled at
        initialization.
        z.module_envgvs)r&   r9   r+   Zdeclare_env_globalrj   rk   rl   rC   r   rz   rt   ro   )
r   r/   r{   r|   Zenv_settersrH   Z
envgv_namer~   ZenvgvZenv_setters_initr   r   r   Ú_emit_envgvs_array  s    

þz"_ModuleCompiler._emit_envgvs_arrayc           	      C   sP   | j rHt tj|j| j| j|jg¡}t ||| j ¡}| 	|||||g¡S dS dS )z@
        Emit call to "external" init function, if any.
        N)
r'   r   ÚFunctionTyperk   Ú_int32rr   Úmethod_def_ptrÚenv_def_ptrrf   Úcall)	r   r/   r{   Zmodobjrw   Ú	env_arrayÚenvgv_arrayrI   rJ   r   r   r   Ú_emit_module_init_code*  s     ÿÿÿz&_ModuleCompiler._emit_module_init_codeN)F)F)F)r   r   r    r!   r   ÚLiteralStructTyperk   Ú
_int8_starrl   r‚   rp   ÚPointerTyperƒ   ry   r„   r   r-   r0   r   rK   rU   rV   r[   re   rx   r   r€   rˆ   r   r   r   r   r"   P   s6   ý
ü


@

 r"   c                   @   sº   e Zd Zdd„ ZeejejƒZeejejƒZeejejeej	ƒZ
eejej	ƒZeejƒZejZe ejeejejf¡Ze eeeejejee
eef	¡Zedd„ ƒZedd„ ƒZdd„ Zd	S )
ÚModuleCompilerc                 G   s   t  t  | |¡¡S r   )r   r‹   r   )Úretr;   r   r   r   Ú<lambda><  ó    zModuleCompiler.<lambda>c                 C   s6   t  tjt  | j¡tjf¡}d}tjr.|d7 }||fS )zn
        Return the signature and name of the Python C API function to
        initialize the module.
        ZPyModule_Create2Z	TraceRefs)r   r   rk   Ú_pyobject_head_pr‹   Úmodule_def_tyr‚   Z_trace_refs_)r   r   r?   r   r   r   Úmodule_create_definition|  s    
ÿÿz'ModuleCompiler.module_create_definitionc                 C   s   t  tjd¡}|d| j fS )zX
        Return the name and signature of the module's initialization function.
        r   ZPyInit_)r   r   rk   r   r#   )r   r   r   r   r   Úmodule_init_definitionŒ  s    z%ModuleCompiler.module_init_definitionc                 C   s  t j|f| jžŽ }d|_| j || j¡}t j t	j
t  | jd ¡t  t	jd ¡t  t	jd ¡f¡}t ||jd¡}||_d|_|  |¡}t j ||t  | jd ¡t  t	jd¡|t  | jd ¡t  | jd ¡t  | jd ¡t  | jd ¡f	¡}t ||jd¡}||_d|_t j|f| jžŽ }	|	 d¡}
t  |
¡}| j |¡}| ||t  t	jtj¡f¡}| t  ||¡¡ | !t" #|	jj$j%¡¡ W 5 Q R X |  &|||¡}|  '|||¡}|  (||||||¡}|d k	ræ| t )||¡¡ | !t  |jd ¡¡ W 5 Q R X | !|¡ | j* +|	j,¡ d S )Nr4   z.module_def_baser3   éÿÿÿÿz.module_defZEntry)-r   rf   r’   r>   r+   rg   r#   rh   ri   rk   Z_pyobject_head_initÚ	m_init_tyÚ_llvm_py_ssize_tr   r   rq   rr   rs   rx   Ú
_char_starÚ
inquiry_tyÚtraverseproc_tyÚfreefunc_tyr“   Zappend_basic_blockZ	IRBuilderZget_python_apir…   r‚   ÚsysÚapi_versionZif_thenZis_nullr   rn   rj   Zpointeer<   r   r€   rˆ   Zis_not_nullr%   rC   r?   )r   r/   Zcreate_module_fnZmod_name_constZmod_def_base_initZmod_def_baserw   Zmod_def_initZmod_defZmod_init_fnrH   r{   r|   Úmodr†   r‡   r   r   r   r   r0   •  sv    ÿýÿþ
øÿ
ÿ

ÿÿ 
  ÿ

z#ModuleCompiler._emit_python_wrapperN)r   r   r    Z_ptr_funrk   Z_int8r   Zvisitproc_tyr˜   rl   r™   rš   r•   rŠ   r—   r   r‰   Z_pyobject_headr–   Zmodule_def_base_tyr"   rƒ   r‘   Úpropertyr’   r“   r0   r   r   r   r   rŒ   :  sR   ÿÿýÿ
üÿ÷ÿ

rŒ   )'Úloggingr_   r›   Zllvmliter   Zllvmlite.bindingr   Z
numba.pyccr   rk   Znumba.core.cgutilsr   Znumba.core.compilerr   r   Znumba.core.compiler_lockr   Znumba.core.registryr	   Znumba.core.runtimer
   Z
numba.corer   Ú	getLoggerr   ÚloggerÚ__all__rh   rl   rn   r‚   ro   ZONErm   r   Úobjectr   r"   rŒ   r   r   r   r   Ú<module>   s,   
$ k