o
    8ήc_                     @   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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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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)set_frozen_strings
_live_varsself r%   </tmp/pip-target-vg8gfxp4/lib/python/numba/core/pylowering.pyinitF   s   zPyLower.initc                    s   t t|   |   d S r   )superr   	pre_lower
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      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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=   r8   r<   okrJ   rK   retvalrV   istrue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)numba.core.dispatcherrv   r>   unserializeserialize_object)r$   rv   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 sw   Y  |	 | j %|d}| j|| W d   n1 sw   Y  W d   n1 sw   Y  | j&|S t't(||)z?
        The returned object must have a new reference
        Nr   F)likelyr=   ))r=   r4   r   ConstFreeVarlower_constVarr;   r9   rh   Expr
lower_exprGloballower_globalYieldlower_yieldArgfunc_irfunc_idpysig
parametersgetfnargsr<   r   alloca_once_valuerT   defaultinspect	Parameteremptystorer>   get_typer\   rz   if_elseobject_getattr_stringloadNotImplementedErrorrW   )r$   rk   r=   valparamobjslottypobj
is_omittedomittedpresentr%   r%   r&   r6      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   )rN   yield_pointsr<   rk   rP   init_generator_stater   
LowerYield	live_varsweak_live_varslower_yield_suspendr;   r=   r9   r>   rh   rR   rS   rT   lower_yield_resume	make_none)r$   rk   ypyr   r%   r%   r&   r      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;   lhsr9   rhsr4   str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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 sw   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|} j56t7j8|j9} j,:d||}t*; j,|  <t= W d    |S 1 sw   Y  |S |j dkr |jj} |j>j} j?||} | |S |j dkr |jj} j56t7j8|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rt*G jjHS t|)$NbinopFr   inplace_binopTunarycallc                       g | ]}  |jqS r%   r;   r9   ).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   build_tuplec                    r   r%   r   r   itr#   r%   r&   r   <  r   
build_listc                    r   r%   r   r   r#   r%   r&   r   A  r   	build_map	build_setc                    r   r%   r   r   r#   r%   r&   r   O  r   getiteriternext   r   r3   
pair_firstpair_secondexhaust_iterr   getitemstatic_getitemgetsliceslicecastphizPHI not strippednull)Ir   r   r   r;   r=   r9   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_concatrO   kwsr   	dict_packobject_getattrrE   rF   items	list_packdict_newsizerL   set_newset_addobject_getiter	iter_nextr   is_not_nullrT   	tuple_newr   tuple_setitemcheck_occurredr   tuple_getitemrh   
tuple_sizecontextget_constantr   intpcountr\   if_unlikelyreturn_exception
ValueErrorr<   object_getitemlong_from_ssize_tr8   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   rK   rl   r   iterobjitemis_validpairthen	otherwisefirstsecondtuptup_sizeexpected_sizehas_wrong_sizer<   indexobjr8   r  r  slicefnsliceobjr   r%   r#   r&   r   	  s4  






























zPyLower.lower_exprc                 C   s0   | j |}| j |}| | | | |S r   )env_manager	add_const
read_constr   rh   )r$   constr<   r  r%   r%   r&   r~     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 sw   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_dictr>   dict_getitemrE   rh   _unsupported_builtinsr   r!  	TypeErrorhasattrbuiltinsis_nullrT   basic_blockif_thenbuiltin_lookupr   r  add_incomingr   r   raise_missing_global_errorrj   )r$   r9   r=   moddictr   obj_is_nullbbelsemodbuiltinbbifrm   r%   r%   r&   r     sH   





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$  rE   r,  )r$   r9   r/  r2  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)r>   r$  rE   rh   rT   r*  r   r   r)  r   r.  rj   r   r  r-  )r$   r2  r9   fromdictbbifdictfrommodbbifmodr3  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   rT   r>   err_occurredr   rj   )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   rT   r)  rj   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)	rX   r   r[   rW   rT   icmp_signedr   r   rj   )r$   numok_valuerl   rp   r%   r%   r&   r@     s
   
"zPyLower.check_int_statusc                 C   s   t | j|S r   )r   r)  rT   r<  r%   r%   r&   r)  #  r2   zPyLower.is_nullc                 C   s   |    | j| j dS )z=
        Return with the currently raised exception.
        N)cleanup_varsrR   
return_excrT   r#   r%   r%   r&   rj   &  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 vr| j||d| j |< | j | S )Nltype)varmapalloca)r$   r9   rD  r%   r%   r&   _getvar3  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"   rE  rT   r   r   r   r)  r>   raise_missing_name_errorrj   )r$   r9   ptrr   r%   r%   r&   r;   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"   removerG  rO   rT   r   r   r   r  rW   pointeer$   r9   rI  r%   r%   r&   rd   E  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.
        rC  N)
r"   rG  rW   rT   r   addrK  r   r   rO   )r$   r=   r9   clobberis_redefinerI  oldr%   r%   r&   r7   S  s   
zPyLower.storevarc                 C   s,   | j D ]}| |}| | j| qdS )z)
        Cleanup live variables.
        N)r"   rG  rO   rT   r   rL  r%   r%   r&   r@  e  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)r9   )r   get_value_typer   pyobjectrT   
goto_blockentry_blockrF  r   r   r  )r$   r9   rD  rI  r%   r%   r&   rF  m  s   
zPyLower.allocac                 C   
   |  |S r   )rF  )r$   r9   fetyper%   r%   r&   _alloca_varz  s   
zPyLower._alloca_varc                 C   s   | j | d S r   )r>   rh   )r$   r=   r%   r%   r&   rh     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   rQ  r   rR  rW   r>   rO   )r$   r=   lpyobjr%   r%   r&   rO     s   
zPyLower.decrefc                 C   rU  )z>
        Freeze a Python string object into the code.
        )r~   )r$   stringr%   r%   r&   rE     s   
zPyLower._freeze_string)F)r   r   )(__name__
__module____qualname__r   PyGeneratorLowerGeneratorLowerr'   r)   r-   r1   ru   r   cached_propertyrz   r6   r   r   r   r~   r   r#  r  r,  r   r   r@   r)  rj   r.   rG  r;   rd   r7   r@  rF  rW  rh   rO   rE   __classcell__r%   r%   r+   r&   r   B   sF    X
-
 $+

		


	r   );__doc__r(  r   r   llvmlite.irrX   
numba.corer   r   r   r   r   numba.core.errorsr   r   r	   numba.core.loweringr
   r    localsr%  rM  submultruedivfloordivr2  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    
	


