o
    1Æ&iÛc  ã                   @   s¦  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G dd„ dƒZeƒ Zi 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j0d i¥Z1d!e1ej2< d"e1ej3< ej4d#ej5d$ej6d%ej7d&ej8d'ej9d(ej:d)ej;d*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)Ú	BaseLowerc                   @   s   e Zd ZdZdd„ ZdS )Ú
_UndefinedzH
    A sentinel value for undefined variable created by Expr.undef.
    c                 C   s   dS )Nz<undefined>© ©Úselfr   r   ú@C:\wamp64\www\opt\env\Lib\site-packages\numba/core/pylowering.pyÚ__repr__   ó   z_Undefined.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s    r   )Ú
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dBd4d5„Zd6d7„ Z dDd8d9„Z!d:d;„ Z"d<d=„ Z#d>d?„ Z$d@dA„ Z%‡  Z&S )EÚPyLowerc                 C   s   t ƒ | _t ƒ | _d S ©N)ÚsetZ_frozen_stringsÚ
_live_varsr   r   r   r   ÚinitS   s   zPyLower.initc                    s   t t| ƒ ¡  |  ¡  d S r+   )Úsuperr*   Ú	pre_lowerZ
init_pyapir   ©Ú	__class__r   r   r0   Y   s   zPyLower.pre_lowerc                 C   s   d S r+   r   r   r   r   r   Ú
post_lower]   r   zPyLower.post_lowerc                 C   s   |   |¡ d S r+   )Ú	init_vars©r   Úblockr   r   r   Ú	pre_block`   ó   zPyLower.pre_blockc                 C   sD  t |tjƒr|  |¡}|  ||jj¡ d S t |tjƒr?|  |jj¡}|  |j	j¡}|  |j
j¡}| j |||¡}|  |¡ d S t |tjƒra|  |jj¡}|  |j	j¡}| j ||¡}|  |¡ d S t |tjƒrˆ|  |jj¡}|  |j
j¡}| j ||  |j¡|¡}|  |¡ d S t |tjƒr§|  |jj¡}| j ||  |j¡¡}|  |¡ d S t |tjƒrÑ|  |jj¡}|  |jj¡}|  |j
j¡}| j |||¡}|  |¡ d S t |tjƒrù|  |j
j¡}| jrï| j |¡ | j | ¡ d S | j  | j!|¡ d S t |tj"ƒr@|  |j#j¡}	|	j$t%j &d¡kr|	}
n| j '|	¡}
t%j (|
j$d ¡}| j! )d|
|¡}| j*|j+ }| j*|j, }| j! -|||¡ d S t |tj.ƒrU| j*|j }| j! /|¡ d S t |tj0ƒrd|  1|j
¡ d S t |tj2ƒrmd S t |tj3ƒr•|j4d ur‡|  |j4j¡}|  5|¡ nd }| j 6|¡ |  7¡  d S t$|ƒ› d|› }t8|ƒ‚)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   ÚinstrB   r>   rA   ÚokrG   rH   ÚretvalrQ   ZistrueÚzeroÚpredÚtrÚflÚexcÚmsgr   r   r   Ú
lower_instc   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.dispatcherrg   rC   ZunserializeZserialize_object)r   rg   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ƒr%|  |j¡}|  	|¡ |S t|tj
ƒr0|  |¡S t|tjƒr>|  |j|j ¡S t|tjƒrI|  |¡S t|tjƒrë| jjjj |j¡}| j|j }t | j|¡}|dur~|jtjju r~|  	|¡ | j ||¡ ng| j  !|¡}| j "d|| j#¡}| jj$|ddH\}	}
|
 |  	|¡ | j ||¡ W d  ƒ n1 s±w   Y  |	 | j  %|d¡}| j ||¡ W d  ƒ n1 sÑw   Y  W d  ƒ n1 sàw   Y  | j &|¡S t't(|ƒ|ƒ‚)z?
        The returned object must have a new reference
        Nr$   F)ZlikelyrB   ))rB   r:   r   ZConstZFreeVarÚlower_constZVarr@   r?   r[   ÚExprÚ
lower_exprÚGlobalÚlower_globalÚYieldÚlower_yieldZArgÚfunc_irZfunc_idZpysigÚ
parametersÚgetZfnargsrA   r   Zalloca_once_valuerP   ÚdefaultÚinspectÚ	ParameterÚemptyÚstorerC   Úget_typerU   rh   Úif_elseZobject_getattr_stringÚloadÚNotImplementedErrorrR   )r   r]   rB   ÚvalÚparamÚobjZslotZtypobjZ
is_omittedZomittedZpresentr   r   r   r<   Ä   sJ   




ÿ
þý€ü	zPyLower.lower_assignc                 C   s‚   | j j|j }|j|u sJ ‚| j | ¡ t | ||j|j	B ¡}| 
¡  |  |jj¡}| j |¡ | j | j|¡ | ¡  | j ¡ S r+   )rK   Zyield_pointsrA   r]   rM   Zinit_generator_stater   Z
LowerYieldZ	live_varsZweak_live_varsZlower_yield_suspendr@   rB   r?   rC   r[   rN   rO   rP   Zlower_yield_resumeÚ	make_none)r   r]   ZypÚyr|   r   r   r   ro   ñ   s   
zPyLower.lower_yieldFc           	      C   sš   |   |jj¡}|   |jj¡}t|tƒrJ ‚|tv r-t| \}}t| j|ƒ}||||d}nt	 
|j|j¡}|dkr>||}}| j |||¡}|  |¡ |S )N©Úinplacer)   )r@   Úlhsr?   Úrhsr:   ÚstrÚPYTHON_BINOPMAPÚgetattrrC   ÚPYTHON_COMPAREOPMAPrr   Ú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rˆ j||jddS |j dkrrˆ  |jj¡}|jtjkr5ˆ j 	|¡}n6|jtj
krBˆ j |¡}n)|jtjkrZˆ j |¡}ˆ  |¡ ˆ j |¡}n|jtjkrgˆ j |¡}nt|ƒ‚ˆ  |¡ |S |j dkrä‡ fdd	„|jD ƒ}ˆ  |jj¡}ˆ j |¡}|jr¯ˆ 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r ‡ fdd	„|j!D ƒ}ˆ j |¡}ˆ  |¡ |S |j dkr=‡ fdd	„|j!D ƒ}ˆ j "|¡}ˆ  |¡ |S |j dkrsˆ j #|j$¡}ˆ  |¡ |j!D ]\}}ˆ  |j¡}ˆ  |j¡}ˆ j %|||¡}ˆ  |¡ qR|S |j dkr¡‡ fdd	„|j!D ƒ}ˆ j &¡ }ˆ  |¡ |D ]}ˆ j '||¡}ˆ  |¡ q|S |j dkr»ˆ  |jj¡}ˆ j (|¡}ˆ  |¡ |S |j dkr?ˆ  |jj¡}ˆ j )|¡}t* +ˆ j,|¡}ˆ j -d¡}ˆ j, .|¡G\}}| ˆ j /|d|¡ W d   ƒ n	1 súw   Y  | ˆ  0¡  ˆ j /|dˆ j 1¡ ¡ W d   ƒ n	1 sw   Y  W d   ƒ n	1 s,w   Y  ˆ j /|dˆ j |¡¡ |S |j dkrZˆ  |jj¡}ˆ j 2|d¡}ˆ  3|¡ |S |j dkruˆ  |jj¡}ˆ j 2|d¡}ˆ  3|¡ |S |j dkrÄˆ  |jj¡}ˆ j |¡}ˆ  |¡ ˆ j 4|¡}ˆ j5 6t7j8|j9¡}ˆ j, :d||¡}t* ;ˆ j,|¡ ˆ  <t=¡ W d   ƒ |S 1 s½w   Y  |S |j dkræˆ  |jj¡}ˆ  |j>j¡}ˆ j ?||¡}ˆ  |¡ |S |j dkrˆ  |jj¡}ˆ j5 6t7j8|j>¡}ˆ j @|¡} ˆ  | ¡ ˆ j ?|| ¡}ˆ  | ¡ ˆ  |¡ |S |j dkr[ˆ  |jAj¡}!ˆ  |jBj¡}"ˆ  |jCj¡}#ˆ  Dd¡}$ˆ j E|$|"|#f¡}%ˆ  |$¡ ˆ  |%¡ ˆ j ?|!|%¡}ˆ  |¡ |S |j d kroˆ  |jj¡}&ˆ  3|&¡ |&S |j d!krytFd"ƒ‚|j d#kr†t* Gˆ jjH¡S |j d$kr‘ˆ  ItJ¡S t|ƒ‚)%NÚbinopFr   Zinplace_binopTZunaryÚcallc                    ó   g | ]}ˆ   |j¡‘qS r   ©r@   r?   )Ú.0Úar   r   r   Ú
<listcomp>,  ó    z&PyLower.lower_expr.<locals>.<listcomp>c                    s    g | ]\}}|ˆ   |j¡f‘qS r   r“   )r”   ÚkÚvr   r   r   r–   <  s     r‡   Zbuild_tuplec                    r’   r   r“   ©r”   Úitr   r   r   r–   I  r—   Z
build_listc                    r’   r   r“   rš   r   r   r   r–   N  r—   Z	build_mapZ	build_setc                    r’   r   r“   rš   r   r   r   r–   \  r—   ZgetiterZiternexté   r   r9   Z
pair_firstZpair_secondZexhaust_iterr%   ÚgetitemZstatic_getitemZgetsliceÚsliceÚcastÚphizPHI not strippedÚnullZundef)KrŒ   r   r‰   r@   rB   r?   ÚoperatorÚnegrC   Znumber_negativeÚposZnumber_positiveÚnot_Z
object_notrD   Zbool_from_boolÚinvertZnumber_invertr{   rŠ   ÚargsÚfuncZ
tuple_packÚvarargZsequence_tupleZsequence_concatrL   Úkwsr‘   Z	dict_packÚobject_getattrrE   rF   ÚitemsZ	list_packZdict_newÚsizerI   Zset_newZset_addZobject_getiterZ	iter_nextr   Úis_not_nullrP   Ú	tuple_newry   Ztuple_setitemÚcheck_occurredr   Ztuple_getitemr[   Z
tuple_sizeÚcontextZget_constantr   ZintpÚcountrU   Úif_unlikelyZreturn_exceptionÚ
ValueErrorrA   Zobject_getitemZlong_from_ssize_tr>   ÚstartÚstopÚget_builtin_objZcall_function_objargsr	   Úget_null_valueÚpyobjri   Ú
_UNDEFINED)'r   r‹   rB   rŽ   Zargvalsr‰   r§   ÚvarargsÚnew_argsÚretZ	keyvaluesrª   r~   r¬   r˜   r™   rH   r^   r›   ZiterobjÚitemZis_validÚpairZthenZ	otherwiseÚfirstÚsecondÚtupZtup_sizeZexpected_sizeZhas_wrong_sizerA   Zindexobjr>   rµ   r¶   ZslicefnZsliceobjr|   r   r   r   rk     s8  





ÿ











ÿü€ý


ÿ
ÿþ









zPyLower.lower_exprc                 C   s0   | j  |¡}| j  |¡}|  |¡ |  |¡ |S r+   )Zenv_managerZ	add_constZ
read_constrŠ   r[   )r   ÚconstrA   r½   r   r   r   ri   ½  s
   

zPyLower.lower_constc                 C   sF  |   ¡ }| j ||  |¡¡}|  |¡ z|tv r!td| | jd‚W n	 ty+   Y nw t	t
|ƒrz|  |¡}| jj}| j |¡ | j ||  d¡¡}|  ||¡}| jj}	W d  ƒ n1 s_w   Y  | j | jj¡}
|
 ||¡ |
 ||	¡ |
S |}
t | j|  |
¡¡ | j |¡ |  ¡  W d  ƒ |
S 1 sœw   Y  |
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__N)Úget_module_dictrC   Údict_getitemrE   r[   Ú_unsupported_builtinsr   rÄ   Ú	TypeErrorÚhasattrÚbuiltinsÚis_nullrP   Úbasic_blockZif_thenÚbuiltin_lookupr    r¹   Úadd_incomingr   r³   Úraise_missing_global_errorr\   )r   r?   rB   Úmoddictr~   Zobj_is_nullZbbelseÚmodÚbuiltinZbbifr_   r   r   r   rm   Å  sH   
ÿÿÿþ

ÿ
üû

þü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Æ   rC   rÇ   rE   rÎ   )r   r?   rÑ   rÒ   r   r   r   r·   ó  s
   ÿzPyLower.get_builtin_objc              	   C   sê   | j  ||  |¡¡}|  |¡ | jj}t | j|  |¡¡: | j  	||  |¡¡}t | j|  |¡¡ | j  
|¡ |  ¡  W d  ƒ n1 sGw   Y  | jj}W d  ƒ n1 sZw   Y  | 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
        N)rC   rÇ   rE   r[   rP   rÍ   r   r³   rÌ   r«   rÐ   r\   r    r¹   rÏ   )r   rÒ   r?   ZfromdictZbbifdictZfrommodZbbifmodrÓ   r   r   r   rÎ   ú  s   


þ
ø
zPyLower.builtin_lookupc                 C   sP   t  | j| j ¡ ¡}t  | j|¡ |  ¡  W d  ƒ dS 1 s!w   Y  dS )z2
        Return if an exception occurred.
        N)r   r®   rP   rC   Úerr_occurredr³   r\   )r   rÕ   r   r   r   r°     s   ÿ
"ÿzPyLower.check_occurredc                 C   sB   t  | j|  |¡¡ |  ¡  W d  ƒ |S 1 sw   Y  |S )z*
        Return if *obj* is NULL.
        N)r   r³   rP   rÌ   r\   ©r   r~   r   r   r   rŠ   "  s   

ÿýzPyLower.check_errorr   c                 C   s\   t j |j|¡}| j d||¡}t | j|¡ |  ¡  W d  ƒ dS 1 s'w   Y  dS )zI
        Raise an exception if *num* is smaller than *ok_value*.
        r&   N)	rS   r   rT   rR   rP   Zicmp_signedr   r³   r\   )r   ÚnumZok_valuer^   ra   r   r   r   rD   +  s
   
"ÿzPyLower.check_int_statusc                 C   s   t  | j|¡S r+   )r   rÌ   rP   rÖ   r   r   r   rÌ   4  r8   zPyLower.is_nullc                 C   s   |   ¡  | j | j¡ dS )z=
        Return with the currently raised exception.
        N)Úcleanup_varsrN   Z
return_excrP   r   r   r   r   r\   7  s   zPyLower.return_exception_raisedc                 C   s   t | j |¡ƒ| _dS )z8
        Initialize live variables for *block*.
        N)r,   rp   Zget_block_entry_varsr-   r5   r   r   r   r4   >  s   zPyLower.init_varsNc                 C   s(   || j vr| j||d| j |< | j | S )N©Últype)ÚvarmapÚalloca)r   r?   rÚ   r   r   r   Ú_getvarD  s   

zPyLower._getvarc                 C   sv   || j v s	J |ƒ‚| j| }| j |¡}t | j|  |¡¡ | j |¡ |  	¡  W d  ƒ |S 1 s4w   Y  |S )zC
        Load the llvm value of the variable named *name*.
        N)
r-   rÛ   rP   rz   r   r³   rÌ   rC   Zraise_missing_name_errorr\   )r   r?   Úptrr|   r   r   r   r@   I  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Ý   rL   rP   rz   rw   r   r¸   rR   Úpointee©r   r?   rÞ   r   r   r   rX   V  s   
zPyLower.delvarc                 C   sŠ   || j v o| }| j||jd}|r| j |¡}n| j  |¡ |j|jjks3J t|jƒt|jjƒfƒ‚| j ||¡ |rC|  	|¡ dS 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Ý   rR   rP   rz   Úaddrà   r…   rw   rL   )r   rB   r?   ÚclobberZis_redefinerÞ   Úoldr   r   r   r=   d  s   
ÿÿzPyLower.storevarc                 C   s,   | j D ]}|  |¡}|  | j |¡¡ qdS )z)
        Cleanup live variables.
        N)r-   rÝ   rL   rP   rz   rá   r   r   r   rØ   v  s   

þzPyLower.cleanup_varsc                 C   sn   |du r| j  tj¡}| j | j¡ | jj||d}| j t	 
|¡|¡ W d  ƒ |S 1 s0w   Y  |S )zœ
        Allocate a stack slot and initialize it to NULL.
        The default is to allocate a pyobject pointer.
        Use ``ltype`` to override.
        N)r?   )r±   Úget_value_typer   ÚpyobjectrP   Z
goto_blockZentry_blockrÜ   rw   r   r¸   )r   r?   rÚ   rÞ   r   r   r   rÜ   ~  s   
þýzPyLower.allocac                 C   ó
   |   |¡S r+   )rÜ   )r   r?   Zfetyper   r   r   Ú_alloca_var‹  s   
zPyLower._alloca_varc                 C   s   | j  |¡ d S r+   )rC   r[   )r   rB   r   r   r   r[     s   zPyLower.increfc                 C   s,   | j  tj¡}|j|kr| j |¡ dS 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æ   rR   rC   rL   )r   rB   Zlpyobjr   r   r   rL   “  s   
ÿzPyLower.decrefc                 C   rç   )z>
        Freeze a Python string object into the code.
        )ri   )r   Ústringr   r   r   rE   œ  s   
zPyLower._freeze_string)F)r   r+   )'r   r   r   r   ZPyGeneratorLowerZGeneratorLowerr.   r0   r3   r7   rf   r   rh   r<   ro   r   rk   ri   rm   rÆ   r·   rÎ   r°   rŠ   rD   rÌ   r\   r4   rÝ   r@   rX   r=   rØ   rÜ   rè   r[   rL   rE   Ú__classcell__r   r   r1   r   r*   O   sF    X
-
 (+

		


	r*   )?r   rË   r¢   rt   Ú	functoolsr   Zllvmlite.irrS   Z
numba.corer   r   r   r   r   Znumba.core.errorsr   r	   r
   Znumba.core.loweringr   r,   ÚlocalsrÈ   r   rº   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ˆ    
ÿþýüûúùø	÷
öõôòñðïîç

÷