U
    ,‰dÖ_  ã                0   @   s`  d Z ddlZddlZddl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j.< de-ej/< ej0d ej1d!ej2d"ej3d#ej4d$ej5d%ej6d&ej7d'ej8d(i	Z9G d)d*„ d*eƒZ:dS )+z*
Lowering implementation for object mode.
é    N)Ú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j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$   ú9/tmp/pip-unpacked-wheel-eu7e0c37/numba/core/pylowering.pyÚinitF   s    zPyLower.initc                    s   t t| ƒ ¡  |  ¡  d S r   )Úsuperr   Ú	pre_lowerZ
init_pyapir"   ©Ú	__class__r$   r%   r(   L   s    zPyLower.pre_lowerc                 C   s   d S r   r$   r"   r$   r$   r%   Ú
post_lowerP   s    zPyLower.post_lowerc                 C   s   |   |¡ d S r   )Ú	init_vars©r#   Úblockr$   r$   r%   Ú	pre_blockS   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   Z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_setitemZ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ÚbranchZDelÚdelvarZPopBlockZRaiseÚ	exceptionÚincrefZraise_objectÚreturn_exception_raisedr	   )r#   Úinstr8   r4   r7   Úokr=   r>   ÚretvalrF   ZistrueZzeroÚpredÚtrÚflÚexcÚmsgr$   r$   r%   Ú
lower_instV   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.dispatcherrY   r9   ZunserializeZserialize_object)r#   rY   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likelyr8   ))r8   r1   r   ZConstZFreeVarÚlower_constZVarr6   r5   rN   ZExprÚ
lower_exprZGlobalÚlower_globalZYieldÚlower_yieldZArgÚfunc_irZfunc_idZpysigÚ
parametersÚgetZfnargsr7   r   Zalloca_once_valuerE   ÚdefaultÚinspectÚ	ParameterÚemptyÚstorer9   Úget_typerJ   rZ   Úif_elseZobject_getattr_stringÚloadÚNotImplementedErrorrG   )r#   rP   r8   ÚvalÚparamÚobjZslotZtypobjZ
is_omittedZomittedZpresentr$   r$   r%   r2   ·   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   )r@   Zyield_pointsr7   rP   ÚAssertionErrorrB   Zinit_generator_stater   Z
LowerYieldZ	live_varsZweak_live_varsZlower_yield_suspendr6   r8   r5   r9   rN   rC   rD   rE   Zlower_yield_resumeÚ	make_none)r#   rP   ZypÚyrk   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   )r6   Úlhsr5   Úrhsr1   Ústrrn   ÚPYTHON_BINOPMAPÚgetattrr9   ÚPYTHON_COMPAREOPMAPra   ÚfnZobject_richcompareÚcheck_error)	r#   ÚexprÚoprr   rs   rt   Úfnamery   Ú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binopFrq   Zinplace_binopTZunaryÚcallc                    s   g | ]}ˆ   |j¡‘qS r$   ©r6   r5   )Ú.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„   /  s     rw   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„   A  s     Z	build_mapZ	build_setc                    s   g | ]}ˆ   |j¡‘qS r$   r   r‡   r"   r$   r%   r„   O  s     ZgetiterZiternexté   r   r0   Z
pair_firstZpair_secondZexhaust_iterr   ÚgetitemZstatic_getitemZgetsliceÚsliceÚcastÚphizPHI not strippedÚnull)Ir|   r   ry   r6   r8   r5   ÚoperatorÚnegr9   Znumber_negativeÚposZnumber_positiveÚnot_Z
object_notr:   Zbool_from_boolÚinvertZnumber_invertrj   rz   ÚargsÚfuncZ
tuple_packÚvarargZsequence_tupleZsequence_concatrA   Úkwsr€   Z	dict_packÚobject_getattrr;   r<   ÚitemsZ	list_packZdict_newÚsizer?   Zset_newZset_addZobject_getiterZ	iter_nextr   Úis_not_nullrE   Ú	tuple_newrh   Ztuple_setitemÚcheck_occurredro   Ztuple_getitemrN   Ú
tuple_sizeÚcontextZget_constantr   ZintpÚcountrJ   Úif_unlikelyZreturn_exceptionÚ
ValueErrorr7   Zobject_getitemZlong_from_ssize_tr4   ÚstartÚstopÚget_builtin_objZcall_function_objargsr   Úget_null_valueÚpyobj)'r#   r{   r8   r~   Zargvalsry   r”   ÚvarargsÚnew_argsÚretZ	keyvaluesr—   rm   r™   r…   r†   r>   rQ   rˆ   ZiterobjÚitemZis_validÚpairZthenZ	otherwiseÚfirstÚsecondÚtupZtup_sizeZexpected_sizeZhas_wrong_sizer7   Zindexobjr4   r£   r¤   ZslicefnZsliceobjrk   r$   r"   r%   r\   	  s(   




ÿ











*


 ÿ









zPyLower.lower_exprc                 C   s0   | j  |¡}| j  |¡}|  |¡ |  |¡ |S r   )Zenv_managerZ	add_constZ
read_constrz   rN   )r#   Úconstr7   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_dictr9   Údict_getitemr;   rN   Ú_unsupported_builtinsr   r±   Ú	TypeErrorÚhasattrÚbuiltinsÚis_nullrE   Úbasic_blockZif_thenÚbuiltin_lookupr   r§   Úadd_incomingr   r¡   Úraise_missing_global_errorrO   )r#   r5   r8   Úmoddictrm   Zobj_is_nullZbbelseÚmodÚbuiltinZbbifrR   r$   r$   r%   r]   ´  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³   r9   r´   r;   r»   )r#   r5   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
        )r9   r´   r;   rN   rE   rº   r   r¡   r¹   r˜   r½   rO   r   r§   r¼   )r#   r¿   r5   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›   rE   r9   Úerr_occurredr¡   rO   )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¡   rE   r¹   rO   ©r#   rm   r$   r$   r%   rz     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)	rH   r   rI   rG   rE   Zicmp_signedr   r¡   rO   )r#   ÚnumZok_valuerQ   rS   r$   r$   r%   r:     s    zPyLower.check_int_statusc                 C   s   t  | j|¡S r   )r   r¹   rE   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_varsrC   Z
return_excrE   r"   r$   r$   r%   rO   &  s    zPyLower.return_exception_raisedc                 C   s   t | j |¡ƒ| _dS )z8
        Initialize live variables for *block*.
        N)r    r_   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#   r5   rÇ   r$   r$   r%   Ú_getvar3  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!   rn   rÈ   rE   ri   r   r¡   r¹   r9   Zraise_missing_name_errorrO   )r#   r5   Úptrrk   r$   r$   r%   r6   8  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Ê   rA   rE   ri   rf   r   r¦   rG   Úpointee©r#   r5   rË   r$   r$   r%   rL   E  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Ê   rG   rE   ri   ÚaddrÍ   rn   ru   rf   rA   )r#   r8   r5   ÚclobberZis_redefinerË   Úoldr$   r$   r%   r3   S  s    
ÿzPyLower.storevarc                 C   s,   | j D ] }|  |¡}|  | j |¡¡ qdS )z)
        Cleanup live variables.
        N)r!   rÊ   rA   rE   ri   rÎ   r$   r$   r%   rÅ   e  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)r5   )rŸ   Úget_value_typer   ÚpyobjectrE   Z
goto_blockZentry_blockrÉ   rf   r   r¦   )r#   r5   rÇ   rË   r$   r$   r%   rÉ   m  s    zPyLower.allocac                 C   s
   |   |¡S r   )rÉ   )r#   r5   Zfetyper$   r$   r%   Ú_alloca_varz  s    zPyLower._alloca_varc                 C   s   | j  |¡ d S r   )r9   rN   )r#   r8   r$   r$   r%   rN     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Ó   rG   r9   rA   )r#   r8   Zlpyobjr$   r$   r%   rA   ‚  s    
zPyLower.decrefc                 C   s
   |   |¡S )z>
        Freeze a Python string object into the code.
        )r[   )r#   Ústringr$   r$   r%   r;   ‹  s    zPyLower._freeze_string)F)r   )N)F)N)(Ú__name__Ú
__module__Ú__qualname__r   ZPyGeneratorLowerZGeneratorLowerr&   r(   r+   r/   rX   r   Úcached_propertyrZ   r2   r^   r   r\   r[   r]   r³   r¥   r»   r   rz   r:   r¹   rO   r,   rÊ   r6   rL   r3   rÅ   rÉ   rÔ   rN   rA   r;   Ú__classcell__r$   r$   r)   r%   r   B   sD   X
-
 $+
	
	


	r   );Ú__doc__r¸   r   rc   Zllvmlite.irrH   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Úixorrv   ÚmatmulÚimatmulÚeqÚneÚltÚleÚgtÚgeÚis_Úis_notÚcontainsrx   r   r$   r$   r$   r%   Ú<module>   sž   
                        ç

         ÷