B
      ›\‹\  ã            0   @   sª  d Z ddlmZmZmZ ddlmZmZ ddlm  m	Z
 ddlZddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ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j0dej1dej2d ej3d!iZ4esBd"e4ej5< d#e4ej6< er\d$e4ej7< d%e4ej8< ej9d&ej:d'ej;d(ej<d)ej=d*ej>d+ej?d,ej@d-ejAd.i	ZBG d/d0„ d0eƒZCdS )1z*
Lowering implementation for object mode.
é    )Úprint_functionÚdivisionÚabsolute_import)ÚTypeÚConstantNé   )ÚcgutilsÚ
generatorsÚirÚtypesÚutils)ÚForbiddenConstruct)Ú	BaseLower)ÚbuiltinsÚHAS_MATMUL_OPERATORÚIS_PY3)Ú
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_divideF)r   T)Únumber_matrix_multiplyF)r   Tz==z!=ú<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
dd„ Z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d„ Zd d!„ Zd?d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd@d,d-„Zd.d/„ Zd0d1„ ZdAd2d3„Zd4d5„ ZdBd6d7„Zd8d9„ Z d:d;„ Z!d<d=„ Z"‡  Z#S )CÚPyLowerc             C   s   t ƒ | _t ƒ | _d S )N)ÚsetZ_frozen_stringsÚ
_live_vars)Úself© r(   ú/lib/python3.7/site-packages/numba/pylowering.pyÚinitJ   s    zPyLower.initc                s<   t t| ƒ ¡  |  ¡  ddlm} | j | j |¡¡| _	d S )Nr   )Ú
OmittedArg)
Úsuperr$   Ú	pre_lowerZ
init_pyapiZ
dispatcherr+   ÚpyapiZunserializeZserialize_objectÚomitted_typobj)r'   r+   )Ú	__class__r(   r)   r-   P   s
    zPyLower.pre_lowerc             C   s   d S )Nr(   )r'   r(   r(   r)   Ú
post_lowerX   s    zPyLower.post_lowerc             C   s   |   |¡ d S )N)Ú	init_vars)r'   Úblockr(   r(   r)   Ú	pre_block[   s    zPyLower.pre_blockc             C   s*  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 ||¡}|  |¡ ndt |tjƒr|  |jj¡}|  |j
j¡}| j ||  |j¡|¡}|  |¡ nt |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!|¡ n*t |tj"ƒr†|  |j#j¡}	|	j$t% &d¡kr0|	}
n| j '|	¡}
t(j) *|
j$¡}| j! +t(j,|
|¡}| j-|j. }| j-|j/ }| j! 0|||¡ n t |tj1ƒr®| j-|j }| j! 2|¡ nxt |tj3ƒrÊ|  4|j
¡ n\t |tj5ƒr|j6d k	rþ|  |j6j¡}|  7|¡ nd }| j 8|¡ |  9¡  nt:t$|ƒ|ƒ‚d S )Nr   );Ú
isinstancer
   ZAssignÚlower_assignÚstorevarÚtargetÚnameZSetItemÚloadvarÚindexÚvaluer.   Z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Útyper   ÚintZobject_istrueÚlcr   ZnullÚicmpÚICMP_NEZblkmapZtruebrZfalsebrZcbranchZJumpÚbranchZDelÚdelvarZRaiseZ	exceptionÚincrefZraise_objectÚreturn_exception_raisedÚNotImplementedError)r'   Úinstr<   r8   r;   Úokr@   rA   ÚretvalrI   ZistrueZzeroÚpredZtrZflÚexcr(   r(   r)   Ú
lower_inst^   s|    


zPyLower.lower_instc       
   
   C   sj  |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ƒrX| j|j }| j |¡}t | j|¡}| j d|| j¡}| jj|dd^\}}	|	 |  	|¡ | j ||¡ W dQ R X |" | j |d¡}| j ||¡ W dQ R X W dQ R X | j |¡S tt|ƒ|ƒ‚dS )z?
        The returned object must have a new reference
        z==F)ZlikelyNr<   ) r<   r5   r
   ZConstZFreeVarÚlower_constZVarr:   r9   rQ   ZExprÚ
lower_exprZGlobalÚlower_globalZYieldÚlower_yieldZArgZfnargsr;   r.   Zget_typer   Zalloca_once_valuerH   Zicmp_unsignedr/   Úif_elseÚstoreZobject_getattr_stringÚloadrS   rJ   )
r'   rT   r<   ÚvalÚobjZtypobjZslotZ
is_omittedZomittedZpresentr(   r(   r)   r6   ²   s8    




"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 )N)rC   Zyield_pointsr;   rT   ÚAssertionErrorrE   Zinit_generator_stater	   Z
LowerYieldZ	live_varsZweak_live_varsZlower_yield_suspendr:   r<   r9   r.   rQ   rF   rG   rH   Zlower_yield_resumeÚ	make_none)r'   rT   ZypÚyra   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:   Úlhsr9   Úrhsr5   Ústrrc   ÚPYTHON_BINOPMAPÚgetattrr.   ÚPYTHON_COMPAREOPMAPÚgetÚfnZobject_richcompareÚcheck_error)	r'   ÚexprÚoprf   rg   rh   Úfnamern   Ú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rlˆ j 	|¡}n~|jtj
kr†ˆ j |¡}nd|jtjkrÈˆ j |¡}ˆ  |¡ ˆ j |ˆ j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r`ˆ j |ˆ  |jj¡¡}ˆ  |¡ |}|jszˆ j ||d ¡}	n:‡ fd
d	„|jD ƒ}
ˆ j |
¡}ˆ j |||¡}	ˆ  |¡ ˆ  |¡ ˆ  |	¡ |	S |j dkr
ˆ  |jj¡}ˆ j  |ˆ  !|j"¡¡}ˆ  |¡ |S |j dkrD‡ fdd	„|j#D ƒ}ˆ j |¡}ˆ  |¡ |S |j dkr~‡ fdd	„|j#D ƒ}ˆ j $|¡}ˆ  |¡ |S |j dkrîˆ j %|j&¡}ˆ  |¡ xF|j#D ]<\}}ˆ  |j¡}ˆ  |j¡}ˆ j '|||¡}ˆ  |¡ qªW |S |j dkrN‡ fdd	„|j#D ƒ}ˆ j (¡ }ˆ  |¡ x&|D ]}ˆ j )||¡}ˆ  |¡ q(W |S |j dkr‚ˆ  |jj¡}ˆ j *|¡}ˆ  |¡ |S |j dkrHˆ  |jj¡}ˆ j +|¡}t, -ˆ j|¡}ˆ j .d¡}ˆ j /|¡X\}}| ˆ j 0|d|¡ W d Q R X |$ ˆ  1¡  ˆ j 0|dˆ j 2¡ ¡ W d Q R X W d Q R X ˆ j 0|dˆ j 3|¡¡ |S |j dkr~ˆ  |jj¡}ˆ j 4|d¡}ˆ  5|¡ |S |j dkr´ˆ  |jj¡}ˆ j 4|d¡}ˆ  5|¡ |S |j dkr<ˆ  |jj¡}ˆ j 6|¡}ˆ  |¡ ˆ j 7|¡}ˆ j8 9t:j;|j<¡}ˆ j =t>j?||¡}t, @ˆ j|¡ ˆ  AtB¡ W d Q R X |S |j dkr€ˆ  |jj¡}ˆ  |jCj¡}ˆ j D||¡}ˆ  |¡ |S |j dkrèˆ  |jj¡}ˆ j8 9t:j;|jC¡}ˆ j E|¡} ˆ  | ¡ ˆ j D|| ¡}ˆ  | ¡ ˆ  |¡ |S |j dkrjˆ  |jFj¡}!ˆ  |jGj¡}"ˆ  |jHj¡}#ˆ  Id¡}$ˆ j J|$|"|#f¡}%ˆ  |$¡ ˆ  |%¡ ˆ j D|!|%¡}ˆ  |¡ |S |j dkr’ˆ  |jj¡}&ˆ  5|&¡ |&S t|ƒ‚d S ) NZbinopF)rf   Zinplace_binopTZunaryÚcallc                s   g | ]}ˆ   |j¡‘qS r(   )r:   r9   )Ú.0Úa)r'   r(   r)   ú
<listcomp>  s    z&PyLower.lower_expr.<locals>.<listcomp>c                s    g | ]\}}|ˆ   |j¡f‘qS r(   )r:   r9   )rv   ÚkÚv)r'   r(   r)   rx   #  s    rk   Zbuild_tuplec                s   g | ]}ˆ   |j¡‘qS r(   )r:   r9   )rv   Úit)r'   r(   r)   rx   0  s    Z
build_listc                s   g | ]}ˆ   |j¡‘qS r(   )r:   r9   )rv   r{   )r'   r(   r)   rx   5  s    Z	build_mapZ	build_setc                s   g | ]}ˆ   |j¡‘qS r(   )r:   r9   )rv   r{   )r'   r(   r)   rx   C  s    ZgetiterZiternexté   r   r   Z
pair_firstZpair_secondZexhaust_iterÚgetitemZstatic_getitemZgetsliceÚsliceÚcast)Krq   rt   rn   r:   r<   r9   ÚoperatorÚnegr.   Znumber_negativeÚposZnumber_positiveÚnot_Z
object_notr=   rH   ZzextZlongZbool_from_longÚinvertZnumber_invertrS   ro   ÚargsÚfuncZ
tuple_packZvarargr   rD   Úkwsru   Z	dict_packÚobject_getattrr>   r?   ÚitemsZ	list_packZdict_newÚsizerB   Zset_newZset_addZobject_getiterZ	iter_nextr   Úis_not_nullÚ	tuple_newr^   Ztuple_setitemÚcheck_occurredrd   Zbool_from_boolZtuple_getitemrQ   Zsequence_tupleZ
tuple_sizeÚcontextZget_constantr   ZintpÚcountrM   rL   rN   Úif_unlikelyZreturn_exceptionÚ
ValueErrorr;   Zobject_getitemZlong_from_ssize_tr8   ÚstartÚstopÚget_builtin_objZcall_function_objargs)'r'   rp   r<   rs   ZlongvalZargvalsrn   r…   Znew_argsÚretZ	keyvaluesr‡   rb   r‰   ry   rz   rA   rU   r{   ZiterobjÚitemZis_validZpairZthenZ	otherwiseÚfirstÚsecondÚtupZtup_sizeZexpected_sizeZhas_wrong_sizer;   Zindexobjr8   r’   r“   ZslicefnZsliceobjra   r(   )r'   r)   r[   ý   s   















*












zPyLower.lower_exprc             C   s0   | j  |¡}| j  |¡}|  |¡ |  |¡ |S )N)Zenv_managerZ	add_constZ
read_constro   rQ   )r'   Zconstr;   r•   r(   r(   r)   rZ   š  s
    

zPyLower.lower_constc          	   C   s  |   ¡ }| j ||  |¡¡}|  |¡ y|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 dQ R X | j | jj¡}
|
 ||¡ |
 ||	¡ n8|}
t | j|  |
¡¡ | j |¡ |  ¡  W d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__N)Úget_module_dictr.   Údict_getitemr>   rQ   Ú_unsupported_builtinsr   rš   Ú	TypeErrorÚhasattrr   Úis_nullrH   Úbasic_blockZif_thenÚbuiltin_lookupÚphiÚpyobjÚadd_incomingr   r   Úraise_missing_global_errorrR   )r'   r9   r<   Úmoddictrb   Zobj_is_nullZbbelseÚmodÚbuiltinZbbifrV   r(   r(   r)   r\   ¢  s2    


zPyLower.lower_globalc             C   s   | j jS )N)Zenv_bodyÚglobals)r'   r(   r(   r)   rœ   Í  s    zPyLower.get_module_dictc             C   s(   |   ¡ }| j ||  d¡¡}|  ||¡S )Nr›   )rœ   r.   r   r>   r£   )r'   r9   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 dQ R X | jj}W d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
        N)r.   r   r>   rQ   rH   r¢   r   r   r¡   rˆ   r§   rR   r¤   r¥   r¦   )r'   r©   r9   ZfromdictZbbifdictZfrommodZbbifmodrª   r(   r(   r)   r£   ×  s    

zPyLower.builtin_lookupc          	   C   s:   t  | j| j ¡ ¡}t  | j|¡ |  ¡  W dQ R X dS )z2
        Return if an exception occurred.
        N)r   r‹   rH   r.   Úerr_occurredr   rR   )r'   r¬   r(   r(   r)   r   õ  s    zPyLower.check_occurredc          	   C   s,   t  | j|  |¡¡ |  ¡  W dQ R X |S )z*
        Return if *obj* is NULL.
        N)r   r   rH   r¡   rR   )r'   rb   r(   r(   r)   ro   ÿ  s    zPyLower.check_errorr   c          	   C   sH   t j |j|¡}| j t j||¡}t | j|¡ |  	¡  W dQ R X dS )zI
        Raise an exception if *num* is smaller than *ok_value*.
        N)
rL   r   rK   rJ   rH   rM   ZICMP_SLTr   r   rR   )r'   ZnumZok_valuerU   rW   r(   r(   r)   r=     s    zPyLower.check_int_statusc             C   s   t  | j|¡S )N)r   r¡   rH   )r'   rb   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)   rR     s    zPyLower.return_exception_raisedc             C   s   t | j |¡ƒ| _dS )z8
        Initialize live variables for *block*.
        N)r%   Zfunc_irZget_block_entry_varsr&   )r'   r3   r(   r(   r)   r2     s    zPyLower.init_varsNc             C   s(   || j kr| j||d| j |< | j | S )N)Últype)ÚvarmapÚalloca)r'   r9   r®   r(   r(   r)   Ú_getvar!  s    
zPyLower._getvarc          	   C   s`   || j kst|ƒ‚| j| }| j |¡}t | j|  |¡¡ | j 	|¡ |  
¡  W dQ R X |S )zC
        Load the llvm value of the variable named *name*.
        N)r&   rc   r¯   rH   r`   r   r   r¡   r.   Zraise_missing_name_errorrR   )r'   r9   Úptrra   r(   r(   r)   r:   &  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   r`   r_   r   Úget_null_valuerJ   Úpointee)r'   r9   r²   r(   r(   r)   rP   3  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   r`   Úaddrµ   rc   ri   r_   rD   )r'   r<   r9   ZclobberZis_redefiner²   Úoldr(   r(   r)   r7   A  s    zPyLower.storevarc             C   s0   x*| j D ] }|  |¡}|  | j |¡¡ qW dS )z)
        Cleanup live variables.
        N)r&   r±   rD   rH   r`   )r'   r9   r²   r(   r(   r)   r­   S  s    
zPyLower.cleanup_varsc          	   C   sX   |dkr| j  tj¡}| j | j¡* | jj||d}| j t	 
|¡|¡ W d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)r9   )rŽ   Úget_value_typer   ÚpyobjectrH   Z
goto_blockZentry_blockr°   r_   r   r´   )r'   r9   r®   r²   r(   r(   r)   r°   [  s    zPyLower.allocac             C   s   | j  |¡ d S )N)r.   rQ   )r'   r<   r(   r(   r)   rQ   h  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   k  s    
zPyLower.decrefc             C   s
   |   |¡S )z>
        Freeze a Python string object into the code.
        )rZ   )r'   Ústringr(   r(   r)   r>   t  s    zPyLower._freeze_string)F)r   )N)F)N)$Ú__name__Ú
__module__Ú__qualname__r	   ZPyGeneratorLowerZGeneratorLowerr*   r-   r1   r4   rY   r6   r]   rt   r[   rZ   r\   rœ   r”   r£   r   ro   r=   r¡   rR   r2   r±   r:   rP   r7   r­   r°   rQ   rD   r>   Ú__classcell__r(   r(   )r0   r)   r$   F   s>   T&
 +
	
	


	r$   )DÚ__doc__Z
__future__r   r   r   Zllvmlite.llvmpy.corer   r   ZllvmpyZcorerL   r€   Ú r   r	   r
   r   r   Úerrorsr   Zloweringr   r   r   r   r%   Úlocalsrž   r¶   ÚsubÚmulÚtruedivÚfloordivr©   ÚpowÚlshiftÚrshiftÚand_Úor_ÚxorÚiaddÚisubÚimulÚitruedivÚ	ifloordivÚimodÚipowÚilshiftÚirshiftÚiandÚiorÚixorrj   ZdivZidivÚmatmulÚimatmulÚeqÚneÚltÚleÚgtÚgeÚis_Úis_notÚcontainsrl   r$   r(   r(   r(   r)   Ú<module>   sb   






