U
    ø¾|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%   úR/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/pylowering.pyÚinitG   s    zPyLower.initc                    s   t t| ƒ ¡  |  ¡  d S r    )Úsuperr   Ú	pre_lowerÚ
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ÚnameÚSetItemÚloadvarÚindexÚvalueÚpyapiÚobject_setitemÚcheck_int_statusÚDelItemÚobject_delitemÚSetAttrÚobject_setattrÚ_freeze_stringÚattrÚDelAttrÚobject_delattrÚStoreMapÚdctÚkeyÚdict_setitemÚReturnÚgenerator_infoÚdecrefÚgenlowerÚreturn_from_generatorÚ	call_convÚreturn_valueÚbuilderÚBranchÚcondÚtypeÚllvmliteÚIntTypeÚobject_istrueÚConstantÚicmp_unsignedÚblkmapÚtruebrÚfalsebrÚcbranchÚJumpÚbranchÚDelÚdelvarÚPopBlockÚRaiseÚ	exceptionÚincrefÚraise_objectÚreturn_exception_raisedr
   )r$   Úinstr<   r7   r;   ÚokrI   rJ   ÚretvalrU   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)Únumba.core.dispatcherrt   r=   ÚunserializeÚserialize_object)r$   rt   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)Úlikelyr<   ))r<   r3   r   ÚConstÚFreeVarÚlower_constÚVarr:   r8   rg   ÚExprÚ
lower_exprÚGlobalÚlower_globalÚYieldÚlower_yieldÚArgÚfunc_irÚfunc_idÚpysigÚ
parametersÚgetÚfnargsr;   r   Úalloca_once_valuerS   ÚdefaultÚinspectÚ	ParameterÚemptyÚstorer=   Úget_typer[   rx   Úif_elseÚobject_getattr_stringÚloadÚNotImplementedErrorrV   )r$   rj   r<   ÚvalÚparamÚobjZslotZtypobjZ
is_omittedZomittedZpresentr%   r%   r&   r5   ¸   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    )rM   Úyield_pointsr;   rj   ÚAssertionErrorrO   Úinit_generator_stater   Ú
LowerYieldÚ	live_varsÚweak_live_varsÚlower_yield_suspendr:   r<   r8   r=   rg   rQ   rR   rS   Úlower_yield_resumeÚ	make_none)r$   rj   ÚypÚyr–   r%   r%   r&   rƒ   å   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   )r:   Úlhsr8   Úrhsr3   Ústrrš   ÚPYTHON_BINOPMAPÚgetattrr=   ÚPYTHON_COMPAREOPMAPr‰   ÚfnÚ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 )$NÚbinopFr¤   Úinplace_binopTÚunaryÚcallc                    s   g | ]}ˆ   |j¡‘qS r%   ©r:   r8   )Ú.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ª   Úbuild_tuplec                    s   g | ]}ˆ   |j¡‘qS r%   r¸   ©r¹   Úitr#   r%   r&   r»   =  s     Ú
build_listc                    s   g | ]}ˆ   |j¡‘qS r%   r¸   r¿   r#   r%   r&   r»   B  s     Ú	build_mapÚ	build_setc                    s   g | ]}ˆ   |j¡‘qS r%   r¸   r¿   r#   r%   r&   r»   P  s     ÚgetiterÚiternexté   r   r2   Ú
pair_firstÚpair_secondÚexhaust_iterr   ÚgetitemÚstatic_getitemZgetsliceÚsliceÚcastÚphizPHI not strippedÚnull)Ir°   r³   r¬   r:   r<   r8   ÚoperatorÚnegr=   Únumber_negativeÚposÚnumber_positiveÚnot_Ú
object_notr?   Úbool_from_boolÚinvertÚnumber_invertr•   r®   ÚargsÚfuncÚ
tuple_packÚvarargÚsequence_tupleÚsequence_concatrN   Úkwsr·   Ú	dict_packÚobject_getattrrD   rE   ÚitemsÚ	list_packÚdict_newÚsizerK   Úset_newÚset_addÚobject_getiterÚ	iter_nextr   Úis_not_nullrS   Ú	tuple_newr’   Útuple_setitemÚcheck_occurredr¡   Útuple_getitemrg   Ú
tuple_sizeÚcontextÚget_constantr   ÚintpÚcountr[   Úif_unlikelyÚreturn_exceptionÚ
ValueErrorr;   Úobject_getitemÚlong_from_ssize_tr7   ÚstartÚstopÚget_builtin_objÚcall_function_objargsr	   Úget_null_valueÚpyobj)'r$   r¯   r<   r²   Úargvalsr¬   rÚ   ÚvarargsÚnew_argsÚretÚ	keyvaluesrà   r˜   rã   r¼   r½   rJ   rk   rÀ   ÚiterobjÚitemÚis_validÚpairÚthenÚ	otherwiseÚfirstÚsecondÚtupZtup_sizeZexpected_sizeZhas_wrong_sizer;   Zindexobjr7   rú   rû   ZslicefnZsliceobjr–   r%   r#   r&   r   
  s(   




ÿ











*


 ÿ









zPyLower.lower_exprc                 C   s0   | j  |¡}| j  |¡}|  |¡ |  |¡ |S r    )Úenv_managerÚ	add_constÚ
read_constr®   rg   )r$   Úconstr;   r  r%   r%   r&   r|   ­  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_getitemrD   rg   Ú_unsupported_builtinsr   r  Ú	TypeErrorÚhasattrÚbuiltinsÚis_nullrS   Úbasic_blockÚif_thenÚbuiltin_lookuprÎ   rÿ   Úadd_incomingr   rõ   Úraise_missing_global_errorri   )r$   r8   r<   Úmoddictr˜   Zobj_is_nullÚbbelseÚmodÚbuiltinÚbbifrl   r%   r%   r&   r   µ  s:    
ÿÿ


ÿzPyLower.lower_globalc                 C   s   | j jS r    )Úenv_bodyÚglobalsr#   r%   r%   r&   r  à  s    zPyLower.get_module_dictc                 C   s(   |   ¡ }| j ||  d¡¡}|  ||¡S )Nr  )r  r=   r  rD   r  )r$   r8   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  rD   rg   rS   r  r   rõ   r  râ   r  ri   rÎ   rÿ   r  )r$   r"  r8   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ë   rS   r=   Úerr_occurredrõ   ri   )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õ   rS   r  ri   ©r$   r˜   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)	rW   r   rZ   rV   rS   Úicmp_signedr   rõ   ri   )r$   ÚnumZok_valuerk   rn   r%   r%   r&   r?     s    zPyLower.check_int_statusc                 C   s   t  | j|¡S r    )r   r  rS   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_varsrQ   Ú
return_excrS   r#   r%   r%   r&   ri   '  s    zPyLower.return_exception_raisedc                 C   s   t | j |¡ƒ| _dS )z8
        Initialize live variables for *block*.
        N)r!   r…   Ú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$   r8   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"   rš   r0  rS   r”   r   rõ   r  r=   Úraise_missing_name_errorri   )r$   r8   Úptrr–   r%   r%   r&   r:   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"   Úremover2  rN   rS   r”   r   r   rþ   rV   Úpointee©r$   r8   r4  r%   r%   r&   rc   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"   r2  rV   rS   r”   Úaddr6  rš   r¨   r   rN   )r$   r<   r8   ZclobberZis_redefiner4  Úoldr%   r%   r&   r6   T  s    
ÿzPyLower.storevarc                 C   s,   | j D ] }|  |¡}|  | j |¡¡ qdS )z)
        Cleanup live variables.
        N)r"   r2  rN   rS   r”   r7  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)r8   )rñ   Úget_value_typer   ÚpyobjectrS   Ú
goto_blockÚentry_blockr1  r   r   rþ   )r$   r8   r/  r4  r%   r%   r&   r1  n  s    zPyLower.allocac                 C   s
   |   |¡S r    )r1  )r$   r8   Úfetyper%   r%   r&   Ú_alloca_var{  s    zPyLower._alloca_varc                 C   s   | j  |¡ d S r    )r=   rg   )r$   r<   r%   r%   r&   rg   €  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;  rV   r=   rN   )r$   r<   Zlpyobjr%   r%   r&   rN   ƒ  s    
zPyLower.decrefc                 C   s
   |   |¡S )z>
        Freeze a Python string object into the code.
        )r|   )r$   Ústringr%   r%   r&   rD   Œ  s    zPyLower._freeze_string)F)r   )N)F)N)'Ú__name__Ú
__module__Ú__qualname__r   ÚPyGeneratorLowerÚGeneratorLowerr'   r)   r-   r1   rs   r   rx   r5   rƒ   r³   r   r|   r   r  rü   r  rî   r®   r?   r  ri   r.   r2  r:   rc   r6   r+  r1  r?  rg   rN   rD   Ú__classcell__r%   r%   r+   r&   r   C   sD   X
-
 $+
	
	


	r   )=Ú__doc__r  rÐ   r   Ú	functoolsr   Úllvmlite.irrW   Ú
numba.corer   r   r   r   r   Únumba.core.errorsr   r	   r
   Znumba.core.loweringr   r!   Úlocalsr  r8  Ú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    
                        ç

         ÷