U
    Ã9%eö_  ã                0   @   sl  d 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	m
Z
mZmZmZ ddlmZmZmZ ddlmZ eegƒZejdejdejd	ejd
ejdejdejdejdejdej dej!dej"dej#dej$dej%dej&dej'dej(dej)dej*dej+dej,dej-dej.diZ/de/ej0< d e/ej1< ej2d!ej3d"ej4d#ej5d$ej6d%ej7d&ej8d'ej9d(ej:d)i	Z;G d*d+„ d+eƒZ<dS ),z*
Lowering implementation for object mode.
é    N)Úcached_property)ÚtypesÚutilsÚirÚ
generatorsÚcgutils)ÚForbiddenConstructÚLoweringErrorÚNumbaNotImplementedError)Ú	BaseLower)Ú
number_addF)Únumber_subtractF)Únumber_multiplyF)Únumber_truedivideF)Únumber_floordivideF)Únumber_remainderF)Únumber_powerF)Únumber_lshiftF)Únumber_rshiftF)Ú
number_andF)Ú	number_orF)Ú
number_xorF)r   T)r   T)r   T)r   T)r   T)r   T)r   T)r   T)r   T)r   T)r   T)r   T)Únumber_matrix_multiplyF)r   Tú==ú!=ú<z<=ú>z>=Úiszis notÚinc                       s   e Zd ZejZdd„ Z‡ fdd„Zdd„ Zdd„ Z	d	d
„ Z
edd„ ƒZdd„ Zdd„ ZdBd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dCd%d&„Zd'd(„ Zd)d*„ Zd+d,„ ZdDd.d/„Zd0d1„ Zd2d3„ ZdEd4d5„Zd6d7„ Z dFd8d9„Z!d:d;„ Z"d<d=„ Z#d>d?„ Z$d@dA„ Z%‡  Z&S )GÚPyLowerc                 C   s   t ƒ | _t ƒ | _d S ©N)ÚsetZ_frozen_stringsÚ
_live_vars©Úself© r%   úT/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/numba/core/pylowering.pyÚinitG   s    zPyLower.initc                    s   t t| ƒ ¡  |  ¡  d S r    )Úsuperr   Ú	pre_lowerZ
init_pyapir#   ©Ú	__class__r%   r&   r)   M   s    zPyLower.pre_lowerc                 C   s   d S r    r%   r#   r%   r%   r&   Ú
post_lowerQ   s    zPyLower.post_lowerc                 C   s   |   |¡ d S r    )Ú	init_vars©r$   Úblockr%   r%   r&   Ú	pre_blockT   s    zPyLower.pre_blockc                 C   sH  t |tjƒr*|  |¡}|  ||jj¡ nt |tjƒr~|  |jj¡}|  |j	j¡}|  |j
j¡}| j |||¡}|  |¡ nÆt |tjƒrÂ|  |jj¡}|  |j	j¡}| j ||¡}|  |¡ n‚t |tjƒr|  |jj¡}|  |j
j¡}| j ||  |j¡|¡}|  |¡ n2t |tjƒrR|  |jj¡}| j ||  |j¡¡}|  |¡ nòt |tjƒr¨|  |jj¡}|  |jj¡}|  |j
j¡}| j |||¡}|  |¡ nœt |tjƒrü|  |j
j¡}| jrè| j |¡ | j | ¡ d S | j  | j!|¡ nHt |tj"ƒrˆ|  |j#j¡}	|	j$t%j &d¡kr2|	}
n| j '|	¡}
t%j (|
j$d ¡}| j! )d|
|¡}| j*|j+ }| j*|j, }| j! -|||¡ n¼t |tj.ƒr°| j*|j }| j! /|¡ n”t |tj0ƒrÌ|  1|j
¡ nxt |tj2ƒrÜnht |tj3ƒr*|j4d k	r|  |j4j¡}|  5|¡ nd }| j 6|¡ |  7¡  nt$|ƒ› d|› }t8|ƒ‚d S )Né   r   z, )9Ú
isinstancer   ÚAssignÚlower_assignÚstorevarÚtargetÚnameZSetItemÚloadvarÚindexÚvalueÚpyapiZobject_setitemÚcheck_int_statusZDelItemZobject_delitemZSetAttrZobject_setattrÚ_freeze_stringÚattrZDelAttrZobject_delattrZStoreMapÚdctÚkeyÚdict_setitemÚReturnÚgenerator_infoÚdecrefÚgenlowerZreturn_from_generatorÚ	call_convÚreturn_valueÚbuilderZBranchÚcondÚtypeÚllvmliteZIntTypeZobject_istrueÚConstantÚicmp_unsignedZblkmapZtruebrZfalsebrZcbranchZJumpÚbranchÚDelÚdelvarZPopBlockÚRaiseÚ	exceptionÚincrefZraise_objectÚreturn_exception_raisedr
   )r$   Úinstr:   r6   r9   Úokr?   r@   ÚretvalrI   ZistrueÚzeroÚpredÚtrÚflÚexcÚmsgr%   r%   r&   Ú
lower_instW   s†    

þ
ÿ
zPyLower.lower_instc                 C   s    ddl m} | j | j |¡¡S )zeReturn a `OmittedArg` type instance as a LLVM value suitable for
        testing at runtime.
        r   )Ú
OmittedArg)Znumba.core.dispatcherr_   r;   ZunserializeZserialize_object)r$   r_   r%   r%   r&   Ú_omitted_typobj¯   s    
ÿzPyLower._omitted_typobjc              
   C   s²  |j }t|tjtjfƒr$|  |j ¡S t|tjƒrJ|  |j¡}|  	|¡ |S t|tj
ƒr`|  |¡S t|tjƒr||  |j|j ¡S t|tjƒr’|  |¡S t|tjƒr | jjjj |j¡}| j|j }t | j|¡}|dk	r|jtjjkr|  	|¡ | j ||¡ n’| j  !|¡}| j "d|| j#¡}| jj$|dd^\}	}
|
 |  	|¡ | j ||¡ W 5 Q R X |	" | j  %|d¡}| j ||¡ W 5 Q R X W 5 Q R X | j &|¡S t't(|ƒ|ƒ‚dS )z?
        The returned object must have a new reference
        Nr   F)Zlikelyr:   ))r:   r2   r   ZConstZFreeVarÚlower_constZVarr8   r7   rS   ÚExprÚ
lower_exprÚGlobalÚlower_globalÚYieldÚlower_yieldZArgÚfunc_irZfunc_idZpysigÚ
parametersÚgetZfnargsr9   r   Zalloca_once_valuerH   ÚdefaultÚinspectÚ	ParameterÚemptyÚstorer;   Úget_typerM   r`   Úif_elseZobject_getattr_stringÚloadÚNotImplementedErrorrJ   )r$   rU   r:   ÚvalÚparamÚobjZslotZtypobjZ
is_omittedZomittedZpresentr%   r%   r&   r4   ¸   sB    




ÿ
"zPyLower.lower_assignc                 C   s‚   | j j|j }|j|kst‚| j | ¡ t | ||j	|j
B ¡}| ¡  |  |jj¡}| j |¡ | j | j|¡ | ¡  | j ¡ S r    )rC   Zyield_pointsr9   rU   ÚAssertionErrorrE   Zinit_generator_stater   Z
LowerYieldZ	live_varsZweak_live_varsZlower_yield_suspendr8   r:   r7   r;   rS   rF   rG   rH   Zlower_yield_resumeÚ	make_none)r$   rU   ZypÚyrt   r%   r%   r&   rg   å   s    zPyLower.lower_yieldFc           	      C   sš   |   |jj¡}|   |jj¡}t|tƒr*t‚|tkrZt| \}}t| j	|ƒ}||||d}n2t
 |j|j¡}|dkr||| }}| j	 |||¡}|  |¡ |S )N©Úinplacer   )r8   Úlhsr7   Úrhsr2   Ústrrw   ÚPYTHON_BINOPMAPÚgetattrr;   ÚPYTHON_COMPAREOPMAPrj   ÚfnZobject_richcompareÚcheck_error)	r$   ÚexprÚopr{   r|   r}   Úfnamer‚   Úresr%   r%   r&   Úlower_binopù   s    

zPyLower.lower_binopc           '   
      sÆ  |j dkrˆ j||jddS |j dkr8ˆ j||jddS |j dkräˆ  |jj¡}|jtjkrjˆ j 	|¡}nl|jtj
kr„ˆ j |¡}nR|jtjkr´ˆ j |¡}ˆ  |¡ ˆ j |¡}n"|jtjkrÎˆ j |¡}nt|ƒ‚ˆ  |¡ |S |j dkrÎ‡ fdd	„|jD ƒ}ˆ  |jj¡}ˆ j |¡}|jrbˆ j ˆ  |jj¡¡}ˆ j ||¡}ˆ  |¡ ˆ  |¡ |}|js|ˆ j ||d ¡}	n:‡ fd
d	„|jD ƒ}
ˆ j |
¡}ˆ j |||¡}	ˆ  |¡ ˆ  |¡ ˆ  |	¡ |	S |j dkrˆ  |jj¡}ˆ j |ˆ  |j ¡¡}ˆ  |¡ |S |j dkrF‡ fdd	„|j!D ƒ}ˆ j |¡}ˆ  |¡ |S |j dkr€‡ fdd	„|j!D ƒ}ˆ j "|¡}ˆ  |¡ |S |j dkrìˆ j #|j$¡}ˆ  |¡ |j!D ]<\}}ˆ  |j¡}ˆ  |j¡}ˆ j %|||¡}ˆ  |¡ qª|S |j dkrH‡ fdd	„|j!D ƒ}ˆ j &¡ }ˆ  |¡ |D ]}ˆ j '||¡}ˆ  |¡ q$|S |j dkr|ˆ  |jj¡}ˆ j (|¡}ˆ  |¡ |S |j dkrBˆ  |jj¡}ˆ j )|¡}t* +ˆ j,|¡}ˆ j -d¡}ˆ j, .|¡X\}}| ˆ j /|d|¡ W 5 Q R X |$ ˆ  0¡  ˆ j /|dˆ j 1¡ ¡ W 5 Q R X W 5 Q R X ˆ j /|dˆ j |¡¡ |S |j dkrxˆ  |jj¡}ˆ j 2|d¡}ˆ  3|¡ |S |j dkr®ˆ  |jj¡}ˆ j 2|d¡}ˆ  3|¡ |S |j dkr4ˆ  |jj¡}ˆ j |¡}ˆ  |¡ ˆ j 4|¡}ˆ j5 6t7j8|j9¡}ˆ j, :d||¡}t* ;ˆ j,|¡ ˆ  <t=¡ W 5 Q R X |S |j dkrxˆ  |jj¡}ˆ  |j>j¡}ˆ j ?||¡}ˆ  |¡ |S |j dkràˆ  |jj¡}ˆ j5 6t7j8|j>¡}ˆ j @|¡} ˆ  | ¡ ˆ j ?|| ¡}ˆ  | ¡ ˆ  |¡ |S |j dkrbˆ  |jAj¡}!ˆ  |jBj¡}"ˆ  |jCj¡}#ˆ  Dd¡}$ˆ j E|$|"|#f¡}%ˆ  |$¡ ˆ  |%¡ ˆ j ?|!|%¡}ˆ  |¡ |S |j d krŠˆ  |jj¡}&ˆ  3|&¡ |&S |j d!kr tFd"ƒ‚n"|j d#krºt* Gˆ jjH¡S t|ƒ‚d S )$NZbinopFrz   Zinplace_binopTZunaryÚcallc                    s   g | ]}ˆ   |j¡‘qS r%   ©r8   r7   )Ú.0Úar#   r%   r&   Ú
<listcomp>   s     z&PyLower.lower_expr.<locals>.<listcomp>c                    s    g | ]\}}|ˆ   |j¡f‘qS r%   rŠ   )r‹   ÚkÚvr#   r%   r&   r   0  s     r€   Zbuild_tuplec                    s   g | ]}ˆ   |j¡‘qS r%   rŠ   ©r‹   Úitr#   r%   r&   r   =  s     Z
build_listc                    s   g | ]}ˆ   |j¡‘qS r%   rŠ   r   r#   r%   r&   r   B  s     Z	build_mapZ	build_setc                    s   g | ]}ˆ   |j¡‘qS r%   rŠ   r   r#   r%   r&   r   P  s     ZgetiterZiternexté   r   r1   Z
pair_firstZpair_secondZexhaust_iterr   ÚgetitemZstatic_getitemZgetsliceÚsliceÚcastÚphizPHI not strippedÚnull)Ir…   rˆ   r‚   r8   r:   r7   ÚoperatorÚnegr;   Znumber_negativeÚposZnumber_positiveÚnot_Z
object_notr<   Zbool_from_boolÚinvertZnumber_invertrs   rƒ   ÚargsÚfuncZ
tuple_packÚvarargZsequence_tupleZsequence_concatrD   Úkwsr‰   Z	dict_packÚobject_getattrr=   r>   ÚitemsZ	list_packZdict_newÚsizerA   Zset_newZset_addZobject_getiterZ	iter_nextr   Úis_not_nullrH   Ú	tuple_newrq   Ztuple_setitemÚcheck_occurredrx   Ztuple_getitemrS   Ú
tuple_sizeÚcontextZget_constantr   ZintpÚcountrM   Úif_unlikelyZreturn_exceptionÚ
ValueErrorr9   Zobject_getitemZlong_from_ssize_tr6   ÚstartÚstopÚget_builtin_objZcall_function_objargsr	   Úget_null_valueÚpyobj)'r$   r„   r:   r‡   Zargvalsr‚   r   ÚvarargsÚnew_argsÚretZ	keyvaluesr    rv   r¢   rŽ   r   r@   rV   r‘   ZiterobjÚitemZis_validÚpairZthenZ	otherwiseÚfirstÚsecondÚtupZtup_sizeZexpected_sizeZhas_wrong_sizer9   Zindexobjr6   r¬   r­   ZslicefnZsliceobjrt   r%   r#   r&   rc   
  s(   




ÿ











*


 ÿ









zPyLower.lower_exprc                 C   s0   | j  |¡}| j  |¡}|  |¡ |  |¡ |S r    )Zenv_managerZ	add_constZ
read_constrƒ   rS   )r$   Úconstr9   r³   r%   r%   r&   ra   ­  s
    

zPyLower.lower_constc              	   C   s  |   ¡ }| j ||  |¡¡}|  |¡ z|tkrBtd| | jd‚W n tk
rX   Y nX t	t
|ƒrà|  |¡}| jj}| j |¡. | j ||  d¡¡}|  ||¡}| jj}	W 5 Q R X | j | jj¡}
|
 ||¡ |
 ||	¡ n8|}
t | j|  |
¡¡ | j |¡ |  ¡  W 5 Q R X |
S )zÄ
        1) Check global scope dictionary.
        2) Check __builtins__.
            2a) is it a dictionary (for non __main__ module)
            2b) is it a module (for __main__ module)
        zbuiltins %s() is not supported)ÚlocÚ__builtins__)Úget_module_dictr;   Údict_getitemr=   rS   Ú_unsupported_builtinsr   rº   Ú	TypeErrorÚhasattrÚbuiltinsÚis_nullrH   Úbasic_blockZif_thenÚbuiltin_lookupr–   r°   Úadd_incomingr   rª   Úraise_missing_global_errorrT   )r$   r7   r:   Úmoddictrv   Zobj_is_nullZbbelseÚmodÚbuiltinZbbifrW   r%   r%   r&   re   µ  s:    
ÿÿ


ÿzPyLower.lower_globalc                 C   s   | j jS r    )Zenv_bodyÚglobalsr#   r%   r%   r&   r¼   à  s    zPyLower.get_module_dictc                 C   s(   |   ¡ }| j ||  d¡¡}|  ||¡S )Nr»   )r¼   r;   r½   r=   rÄ   )r$   r7   rÇ   rÈ   r%   r%   r&   r®   ã  s
    ÿzPyLower.get_builtin_objc              
   C   sÂ   | j  ||  |¡¡}|  |¡ | jj}t | j|  |¡¡V | j  	||  |¡¡}t | j|  |¡¡ | j  
|¡ |  ¡  W 5 Q R X | jj}W 5 Q R X | j | j j¡}| ||¡ | ||¡ |S )zÆ
        Args
        ----
        mod:
            The __builtins__ dictionary or module, as looked up in
            a module's globals.
        name: str
            The object to lookup
        )r;   r½   r=   rS   rH   rÃ   r   rª   rÂ   r¡   rÆ   rT   r–   r°   rÅ   )r$   rÈ   r7   ZfromdictZbbifdictZfrommodZbbifmodrÉ   r%   r%   r&   rÄ   ê  s    

zPyLower.builtin_lookupc              	   C   s:   t  | j| j ¡ ¡}t  | j|¡ |  ¡  W 5 Q R X dS )z2
        Return if an exception occurred.
        N)r   r¤   rH   r;   Úerr_occurredrª   rT   )r$   rË   r%   r%   r&   r¦     s
    ÿzPyLower.check_occurredc              	   C   s,   t  | j|  |¡¡ |  ¡  W 5 Q R X |S )z*
        Return if *obj* is NULL.
        )r   rª   rH   rÂ   rT   ©r$   rv   r%   r%   r&   rƒ     s    zPyLower.check_errorr   c              	   C   sF   t j |j|¡}| j d||¡}t | j|¡ |  ¡  W 5 Q R X dS )zI
        Raise an exception if *num* is smaller than *ok_value*.
        r   N)	rK   r   rL   rJ   rH   Zicmp_signedr   rª   rT   )r$   ÚnumZok_valuerV   rY   r%   r%   r&   r<     s    zPyLower.check_int_statusc                 C   s   t  | j|¡S r    )r   rÂ   rH   rÌ   r%   r%   r&   rÂ   $  s    zPyLower.is_nullc                 C   s   |   ¡  | j | j¡ dS )z=
        Return with the currently raised exception.
        N)Úcleanup_varsrF   Z
return_excrH   r#   r%   r%   r&   rT   '  s    zPyLower.return_exception_raisedc                 C   s   t | j |¡ƒ| _dS )z8
        Initialize live variables for *block*.
        N)r!   rh   Zget_block_entry_varsr"   r.   r%   r%   r&   r-   .  s    zPyLower.init_varsNc                 C   s(   || j kr| j||d| j |< | j | S )N©Últype)ÚvarmapÚalloca)r$   r7   rÐ   r%   r%   r&   Ú_getvar4  s    
zPyLower._getvarc              	   C   s`   || j kst|ƒ‚| j| }| j |¡}t | j|  |¡¡ | j 	|¡ |  
¡  W 5 Q R X |S )zC
        Load the llvm value of the variable named *name*.
        )r"   rw   rÑ   rH   rr   r   rª   rÂ   r;   Zraise_missing_name_errorrT   )r$   r7   Úptrrt   r%   r%   r&   r8   9  s    
zPyLower.loadvarc                 C   sD   | j  |¡ |  |¡}|  | j |¡¡ | j t |j	j
¡|¡ dS )zy
        Delete the variable slot with the given name. This will decref
        the corresponding Python object.
        N)r"   ÚremoverÓ   rD   rH   rr   ro   r   r¯   rJ   Úpointee©r$   r7   rÔ   r%   r%   r&   rP   F  s    
zPyLower.delvarc                 C   s†   || j ko| }| j||jd}|r2| j |¡}n| j  |¡ |j|jjksftt|jƒt|jjƒfƒ‚| j 	||¡ |r‚|  
|¡ dS )z|
        Stores a llvm value and allocate stack slot if necessary.
        The llvm value can be of arbitrary type.
        rÏ   N)r"   rÓ   rJ   rH   rr   ÚaddrÖ   rw   r~   ro   rD   )r$   r:   r7   ÚclobberZis_redefinerÔ   Úoldr%   r%   r&   r5   T  s    
ÿzPyLower.storevarc                 C   s,   | j D ] }|  |¡}|  | j |¡¡ qdS )z)
        Cleanup live variables.
        N)r"   rÓ   rD   rH   rr   r×   r%   r%   r&   rÎ   f  s    

zPyLower.cleanup_varsc              	   C   sX   |dkr| j  tj¡}| j | j¡* | jj||d}| j t	 
|¡|¡ W 5 Q R X |S )zœ
        Allocate a stack slot and initialize it to NULL.
        The default is to allocate a pyobject pointer.
        Use ``ltype`` to override.
        N)r7   )r¨   Úget_value_typer   ÚpyobjectrH   Z
goto_blockZentry_blockrÒ   ro   r   r¯   )r$   r7   rÐ   rÔ   r%   r%   r&   rÒ   n  s    zPyLower.allocac                 C   s
   |   |¡S r    )rÒ   )r$   r7   Zfetyper%   r%   r&   Ú_alloca_var{  s    zPyLower._alloca_varc                 C   s   | j  |¡ d S r    )r;   rS   )r$   r:   r%   r%   r&   rS   €  s    zPyLower.increfc                 C   s(   | j  tj¡}|j|kr$| j |¡ dS )zp
        This is allow to be called on non pyobject pointer, in which case
        no code is inserted.
        N)r¨   rÛ   r   rÜ   rJ   r;   rD   )r$   r:   Zlpyobjr%   r%   r&   rD   ƒ  s    
zPyLower.decrefc                 C   s
   |   |¡S )z>
        Freeze a Python string object into the code.
        )ra   )r$   Ústringr%   r%   r&   r=   Œ  s    zPyLower._freeze_string)F)r   )N)F)N)'Ú__name__Ú
__module__Ú__qualname__r   ZPyGeneratorLowerZGeneratorLowerr'   r)   r,   r0   r^   r   r`   r4   rg   rˆ   rc   ra   re   r¼   r®   rÄ   r¦   rƒ   r<   rÂ   rT   r-   rÓ   r8   rP   r5   rÎ   rÒ   rÝ   rS   rD   r=   Ú__classcell__r%   r%   r*   r&   r   C   sD   X
-
 $+
	
	


	r   )=Ú__doc__rÁ   r˜   rl   Ú	functoolsr   Zllvmlite.irrK   Z
numba.corer   r   r   r   r   Znumba.core.errorsr   r	   r
   Znumba.core.loweringr   r!   Úlocalsr¾   rØ   ÚsubÚmulÚtruedivÚfloordivrÈ   ÚpowÚlshiftÚrshiftÚand_Úor_ÚxorÚiaddÚisubÚimulÚitruedivÚ	ifloordivÚimodÚipowÚilshiftÚirshiftÚiandÚiorÚixorr   ÚmatmulÚimatmulÚeqÚneÚltÚleÚgtÚgeÚis_Úis_notÚcontainsr   r   r%   r%   r%   r&   Ú<module>   s    
                        ç

         ÷