o
    ۾i;a                     @   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   I/home/ubuntu/.local/lib/python3.10/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)set_frozen_strings
_live_varsr   r   r   r   initS   s   zPyLower.initc                    s   t t|   |   d S r+   )superr*   	pre_lower
init_pyapir   	__class__r   r   r1   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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   instrE   r@   rD   okrR   rS   retvalr^   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)numba.core.dispatcherr~   rF   unserializeserialize_object)r   r~   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)likelyrE   ))rE   r<   r   ConstFreeVarlower_constVarrC   rA   rp   Expr
lower_exprGloballower_globalYieldlower_yieldArgfunc_irfunc_idpysig
parametersgetfnargsrD   r   alloca_once_valuer\   defaultinspect	ParameteremptystorerF   get_typerd   r   if_elseobject_getattr_stringloadNotImplementedErrorr_   )r   rs   rE   valparamobjslottypobj
is_omittedomitted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+   )rV   yield_pointsrD   rs   rX   init_generator_stater   
LowerYield	live_varsweak_live_varslower_yield_suspendrC   rE   rA   rF   rp   rZ   r[   r\   lower_yield_resume	make_none)r   rs   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)   )rC   lhsrA   rhsr<   strPYTHON_BINOPMAPgetattrrF   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 |j d$kr ItJS t|)%NbinopFr   inplace_binopTunarycallc                       g | ]}  |jqS r   rC   rA   ).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   I  r   
build_listc                    r   r   r   r   r   r   r   r   N  r   	build_map	build_setc                    r   r   r   r   r   r   r   r   \  r   getiteriternext   r   r;   
pair_firstpair_secondexhaust_iterr%   getitemstatic_getitemgetsliceslicecastphizPHI not strippednullundef)Kr   r   r   rC   rE   rA   operatornegrF   number_negativeposnumber_positivenot_
object_notrH   bool_from_boolinvertnumber_invertr   r   argsfunc
tuple_packvarargsequence_tuplesequence_concatrW   kwsr   	dict_packobject_getattrrM   rN   items	list_packdict_newsizerT   set_newset_addobject_getiter	iter_nextr   is_not_nullr\   	tuple_newr   tuple_setitemcheck_occurredr   tuple_getitemrp   
tuple_sizecontextget_constantr   intpcountrd   if_unlikelyreturn_exception
ValueErrorrD   object_getitemlong_from_ssize_tr@   startstopget_builtin_objcall_function_objargsr	   get_null_valuepyobjr   
_UNDEFINED)'r   r   rE   r   argvalsr   r   varargsnew_argsret	keyvaluesr   r   r   r   r   rS   rt   r   iterobjitemis_validpairthen	otherwisefirstsecondtuptup_sizeexpected_sizehas_wrong_sizerD   indexobjr@   r  r  slicefnsliceobjr   r   r   r   r     s8  































zPyLower.lower_exprc                 C   s0   | j |}| j |}| | | | |S r+   )env_manager	add_const
read_constr   rp   )r   constrD   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_dictrF   dict_getitemrM   rp   _unsupported_builtinsr   r+  	TypeErrorhasattrbuiltinsis_nullr\   basic_blockif_thenbuiltin_lookupr   r  add_incomingr   r  raise_missing_global_errorrr   )r   rA   rE   moddictr   obj_is_nullbbelsemodbuiltinbbifru   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-  rF   r.  rM   r6  )r   rA   r9  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)rF   r.  rM   rp   r\   r4  r   r  r3  r   r8  rr   r   r  r7  )r   r<  rA   fromdictbbifdictfrommodbbifmodr=  r   r   r   r6    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   r\   rF   err_occurredr  rr   )r   rE  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  r\   r3  rr   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)	r`   r   rc   r_   r\   icmp_signedr   r  rr   )r   numok_valuert   rx   r   r   r   rH   +  s
   
"zPyLower.check_int_statusc                 C   s   t | j|S r+   )r   r3  r\   rF  r   r   r   r3  4  r:   zPyLower.is_nullc                 C   s   |    | j| j dS )z=
        Return with the currently raised exception.
        N)cleanup_varsrZ   
return_excr\   r   r   r   r   rr   7  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.   r7   r   r   r   r6   >  s   zPyLower.init_varsNc                 C   s(   || j vr| j||d| j |< | j | S )Nltype)varmapalloca)r   rA   rN  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.   rO  r\   r   r   r  r3  rF   raise_missing_name_errorrr   )r   rA   ptrr   r   r   r   rC   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.   removerQ  rW   r\   r   r   r   r  r_   pointeer   rA   rS  r   r   r   rl   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.
        rM  N)
r.   rQ  r_   r\   r   addrU  r   r   rW   )r   rE   rA   clobberis_redefinerS  oldr   r   r   r?   d  s   
zPyLower.storevarc                 C   s,   | j D ]}| |}| | j| qdS )z)
        Cleanup live variables.
        N)r.   rQ  rW   r\   r   rV  r   r   r   rJ  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)rA   )r  get_value_typer   pyobjectr\   
goto_blockentry_blockrP  r   r   r  )r   rA   rN  rS  r   r   r   rP  ~  s   
zPyLower.allocac                 C   
   |  |S r+   )rP  )r   rA   fetyper   r   r   _alloca_var  s   
zPyLower._alloca_varc                 C   s   | j | d S r+   )rF   rp   )r   rE   r   r   r   rp     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\  r_   rF   rW   )r   rE   lpyobjr   r   r   rW     s   
zPyLower.decrefc                 C   r_  )z>
        Freeze a Python string object into the code.
        )r   )r   stringr   r   r   rM     s   
zPyLower._freeze_string)F)r   r+   )'r   r   r   r   PyGeneratorLowerGeneratorLowerr/   r1   r5   r9   r}   r   r   r>   r   r   r   r   r   r-  r  r6  r   r   rH   r3  rr   r6   rQ  rC   rl   r?   rJ  rP  ra  rp   rW   rM   __classcell__r   r   r3   r   r*   O   sF    X
-
 (+

		


	r*   )?r   r2  r   r   	functoolsr   llvmlite.irr`   
numba.corer   r   r   r   r   numba.core.errorsr   r	   r
   numba.core.loweringr   r,   localsr/  r   r  rW  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    
	


