o
    ۾i                    @   s  d dl mZm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
 d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ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% d d
l&m'Z' d dl(m)Z) eddZ*G dd de+Z,G dd de,Z-dd Z.dS )    )
namedtupledefaultdictN)partial)Constant	IRBuilder)typingutilstypesir	debuginfofuncdesc
generatorsconfigir_utilscgutilsremoverefctpasstargetconfig)LoweringErrornew_error_contextTypingErrorLiteralTypingErrorUnsupportedErrorNumbaDebugInfoWarning)default_mangler)Environment)compute_use_defsmust_use_alloca)get_func_body_first_lineno)get_registered_loc_notify_VarArgItem)varargindexc                   @   s   e Zd ZdZd8ddZedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zd8ddZd9ddZd9d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d0ejd1dfd2d3Zd4d5 Zd6d7 ZdS );	BaseLowerz
    Lower IR to LLVM
    Nc                 C   s   || _ || _t|j | _|| _|j| _|| _t	j
 | _| j | jj| _t| j| _i | _i | _i | _t| j | _d| _|j| j| jd| _| jjrU| jjntj}|   | _!| jj"}|| j|jj#||d| _t$ | _%| &  d S )N)environmentfndesc)modulefilepathcgctxdirectives_only)'libraryr%   r   	SortedMapblocksitemsfunc_irgenerator_infometadatar   ConfigStacktop_or_noneflagscreate_ir_moduleunique_namer&   r   from_fndescenvblkmappending_phisvarmapminkeysfirstblkloc	subtargetcontextenable_debuginfo	DIBuilderr   DummyDIBuilder_compute_def_locationdefn_locdbg_directives_onlyfilenamer   _loc_notify_registryinit)selfr@   r*   r%   r.   r0   dibuilderclsr)    rL   G/home/ubuntu/.local/lib/python3.10/site-packages/numba/core/lowering.py__init__   s<   

zBaseLower.__init__c                 C   s   | j jS N)r@   	call_convrJ   rL   rL   rM   rP   O   s   zBaseLower.call_convc                 C   s   d S rO   rL   rQ   rL   rL   rM   rI   S   s   zBaseLower.initc                 C   sF   | j durdS | j| j| _ | j| j| _| jj| _| jj| _dS )ze
        Init the Python API and Environment Manager for the function being
        lowered.
        N)	pyapir@   get_python_apibuilderget_env_managerenv_managerenv_bodyenv_ptrenvargrQ   rL   rL   rM   
init_pyapiV   s   

zBaseLower.init_pyapic                 C   sx   | j j| j jjd }| jjr:| j jj}t|}|d ur*|d }| j j|}|S d| j jj d}t	
t| |S )N   z$Could not find source for function: z+. Debug line information may be inaccurate.)r.   r>   with_linenoliner@   rA   func_idfuncr   warningswarnr   )rJ   rE   fnoptional_lnooffsetmsgrL   rL   rM   rD   d   s   
zBaseLower._compute_def_locationc                 C   sn   d| _ | jj| jj| jj| jj| jj| j	j
d | jjj}| jjo%| jj }|r3d|vr5|d dS dS dS )z4
        Called before lowering all blocks.
        N)functionqualnameargnamesargtypesr]   alwaysinlinenoinline)rR   r   mark_subprogramrT   rf   r%   rg   argsri   rE   r]   
attributesr3   rF   add)rJ   rn   
full_debugrL   rL   rM   	pre_lowerw   s   
	zBaseLower.pre_lowerc                 C   s"   | j   | jD ]}|  qdS )z5
        Called after all blocks are lowered
        N)r   finalizerH   close)rJ   notifyrL   rL   rM   
post_lower   s   


zBaseLower.post_lowerc                 C      dS )z1
        Called before lowering a block.
        NrL   rJ   blockrL   rL   rM   	pre_block       zBaseLower.pre_blockc                 C   rv   )z0
        Called after lowering a block.
        NrL   rw   rL   rL   rM   
post_block   rz   zBaseLower.post_blockc                 C   s$   | j j| j||||| jjjd d S )Nr>   	func_name)rP   return_dynamic_user_excrT   r.   r^   r}   )rJ   	exc_classexc_argsnb_typesr>   rL   rL   rM   return_dynamic_exception   s   


z"BaseLower.return_dynamic_exceptionc                 C   "   | j j| j|||| jjjd dS )z+Propagate exception to the caller.
        r|   N)rP   return_user_excrT   r.   r^   r}   rJ   r   r   r>   rL   rL   rM   return_exception      

zBaseLower.return_exceptionc                 C   r   )z5Set exception state in the current function.
        r|   N)rP   set_static_user_excrT   r.   r^   r}   r   rL   rL   rM   set_exception   r   zBaseLower.set_exceptionc                 C   s"   | j | j}| j | j| dS )z7Emit a pointer to hold the Environment object.
        N)r@   get_env_namer%   declare_env_globalr&   )rJ   envnamerL   rL   rM   emit_environment_object   s   z!BaseLower.emit_environment_objectc                 C   s   |    | jd u rd | _| | j n!| | | _| jj| _| j|  | j|  | jj	r4| j
|  tjr?t| j| j | jjrS| jd u rStj| j| j| jd | j| j| j | j| j d S )N)r@   r%   )r   r/   genlowerlower_normal_functionr%   GeneratorLowergentypelower_init_funclower_next_funchas_finalizerlower_finalize_funcr   	DUMP_LLVMr   	dump_llvmr&   r@   
enable_nrtr   remove_unnecessary_nrt_usagerf   post_loweringr*   add_ir_modulerQ   rL   rL   rM   lower   s&   

zBaseLower.lowerc                 C   s    | j | j| jj| j| _| jS rO   )rP   decode_argumentsrT   r%   ri   rf   fnargsrQ   rL   rL   rM   extract_function_arguments   s
   
z$BaseLower.extract_function_argumentsc                 C   sl   |  | |   |  }t| j | j| | j| j| j	  W d   dS 1 s/w   Y  dS )z/
        Lower non-generator *fndesc*.
        N)
setup_functionr   lower_function_bodyr   suspend_emissionrT   position_at_endbranchr8   r=   )rJ   r%   entry_block_tailrL   rL   rM   r      s   
"zBaseLower.lower_normal_functionc                 C   s   | j D ]}d| }| j|| j|< q|   | jj}| d| j	j
 t| j  D ]\}}| j| }| j| | d|  | | q,|   |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0}z# lower block: )r,   rf   append_basic_blockr8   rq   rT   basic_blockdebug_printformatr%   r5   sortedr-   r   lower_blockru   )rJ   rd   bnamer   rx   bbrL   rL   rM   r      s   

zBaseLower.lower_function_bodyc              	   C   sv   |  | |jD ]+}|j| _tt| jd}td|| j|d | | W d   n1 s.w   Y  q| | dS )z(
        Lower the given block.
        r>   zlowering "{inst}" at {loc})instr>   errcls_N)ry   bodyr>   r   r   r   
lower_instr{   )rJ   rx   r   defaulterrclsrL   rL   rM   r   
  s   

zBaseLower.lower_blockFc                 C   sH   | j r| jj| j| j j| j| j|d | jj| j| j| j| j|d dS )zP
        Create CPython wrapper(s) around this function (or generator).
        )release_gilN)r   r@   create_cpython_wrapperr*   gendescr7   call_helperr%   )rJ   r   rL   rL   rM   r     s   

z BaseLower.create_cpython_wrapperc                 C   s,   | j rtd| j| j| j| j| j dS )z8
        Create C wrapper around this function.
        z(generator as a first-class function typeN)r   r   r@   create_cfunc_wrapperr*   r%   r7   r   rQ   rL   rL   rM   r   $  s
   zBaseLower.create_cfunc_wrapperc                 C   sl   | j | j|| _| jjr| jj}d|vr|d |d | jd| _	t
| j	| _| j| j| _d S )Nrj   optnonerk   entry)r@   declare_functionr&   rf   r3   dbg_optnonern   ro   r   entry_blockr   rT   rP   init_call_helperr   )rJ   r%   attrsetrL   rL   rM   r   -  s   

zBaseLower.setup_functionc                 C   s   | j j| S rO   )r%   typemap)rJ   varnamerL   rL   rM   typeof9  s   zBaseLower.typeofr>   returnc                 C   s   | j D ]}|| qdS )z[Called when a new instruction with the given `loc` is about to be
        lowered.
        N)rH   rt   )rJ   r>   
notify_objrL   rL   rM   
notify_loc<  s   
zBaseLower.notify_locc                 C   s.   t jr| j| jd| jj d|  d S d S )Nz
DEBUGJIT [z]: )r   	DEBUG_JITr@   r   rT   r%   rg   )rJ   re   rL   rL   rM   r   C  s
   zBaseLower.debug_printc                 C   s\   t || jj| f}| j | |f}tjt j	g|R  }| j
t|}|| j| dS )zHelper to emit ``print(msg, varname)`` for debugging.

        Parameters
        ----------
        msg : str
            Literal string to be printed.
        varname : str
            A variable name whose value will be printed.
        N)r	   literalr%   r   r@   get_dummy_valueloadvarr   	signaturenoneget_functionprintrT   )rJ   re   r   argtysrm   sigimplrL   rL   rM   print_variableH  s   
zBaseLower.print_variablerO   )NN)F) __name__
__module____qualname____doc__rN   propertyrP   rI   rZ   rD   rq   ru   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   Locr   r   r   rL   rL   rL   rM   r"      s8    
1




	r"   c                       sN  e Zd ZejZ fddZedd 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 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& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$dLd@dAZ%dBdC Z&dDdE Z'dLdFdGZ(dHdI Z)dJdK Z*  Z+S )MLowerc                    s   t    |   d S rO   )superrI   _find_singly_assigned_variablerQ   	__class__rL   rM   rI   c  s   
z
Lower.initc                 C   s    | j du rdS | j jo| j j S )a  Flags that the SROA like optimisation that Numba performs (which
        prevent alloca and subsequent load/store for locals) should be disabled.
        Currently, this is conditional solely on the presence of a request for
        the emission of debug information.NF)r3   r   rF   rQ   rL   rL   rM   _disable_sroa_like_opth  s   
zLower._disable_sroa_like_optc                    s  | j }|j}t }| j jjst|}t|}tt}|j	 D ]\}}|D ]	 |  
| q%qtt}	|j	 D ]\}}|D ]	 |	  
| q?q9|D ]8  |vrt|  dkrt|	  dkr|  \}
| j|
 tj} fdd|D }t|dkr|
  qL|| _i | _d S )Nr[   r   c                    s   g | ]
}|j j kr|qS rL   )targetname).0stmtvarrL   rM   
<listcomp>  s    z8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r.   r,   setr^   is_generatorr   r   r   defmapr-   ro   usemaplen
find_instsr
   Assign_singly_assigned_vars_blk_local_varmap)rJ   r.   r,   savuse_defsalloca_varsvar_assign_mapblkvlvar_use_mapdefblkassign_stmtsassignsrL   r   rM   r   s  s6   



z$Lower._find_singly_assigned_variablec                    s  ddl m} tt| | || _|| jkrQ| j| j }| j	| t
 }| j D ]}|tjD ]}|j|vr?||j q2q*|D ]}| |}| || qC|jddD ]3}ttj| j|j}	|	d urt|	tjr|	j|ju rt|jtjr| j|jj }
d|
i| j_  d S qWd S )Nr   )ehcall)opr   )!numba.core.unsafer   r   r   ry   _cur_ir_blockr=   r8   rT   r   r   r,   valuesr   r
   Delvaluero   r   _alloca_var
find_exprsr   guardget_definitionr.   r_   
isinstanceGlobalexception_check
terminatorBranchtruebr_in_try_block)rJ   rx   r   r   	all_namesxr   fetyper   defn	targetblkr   rL   rM   ry     s8   


zLower.pre_blockc                 C   s"   z| j `W d S  ty   Y d S w rO   )rT   r
  AttributeErrorrw   rL   rL   rM   r{     s
   zLower.post_blockc              	   C   s|  | j | j| jj | | j | t| t|t	j
rO| |jj}| ||}d }t|jt	jrC| j | j| jj |jjd }| j||jj|d d S t|t	jr| |jj}| j|j }| j|j }| |jj}| j| j||tj}	|	jtj	 dksJ d|	j | j!|	|| d S t|t	j"r| j|j }
| j#|
 d S t|t	j$r| j%r| j&'|  d S | |jj}| |jj}| j(j)}t|tj*r| j+,| j||| d S ||ksJ d-||| j.| j||}| j+/| j| d S t|t	j0rd S t|t	j1rd| j(j2| }|d usJ z	| j3d|}W n t4y7   | 5|j|j6|j| Y S w | |jj}
| |jj}| |jj}| j| j|||j7d }|| j|
|j|fS t|t	j8rr| 9| d S t|t	j:r| j(j2| }|d usJ | 5|j|j|j|S t|t	j;r| j(j2| }|d usJ | 5|j<|j=|j|S t|t	j>r| |jj}
| |jj}| |jj}| |jj}| j(j2| }|d usJ t?j@}| jjAB|}|C| jjA|j7i }| j3||}||j7d ksJ | j| j|||j7d }|| j|
|fS t|t	jDr)| E|j d S t|t	jFr| |jj}
| |jj}| j(j2| }| |jj}| |jj}|d usYJ |j7d |kscJ | jG|jH|}| j| j|||j7d }|| j|
|fS t|t	jIr| J| d S t|t	jKr| L| d S t|t	jMr| N| d S t|t	jOr| P| d S t4t|)Nr[   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'static_setitem   r   )Qr   mark_locationrT   r>   r]   r   r   strr  r
   r   r   r   r   lower_assignr   ArgrE   r!   storevarr  r   condr8   r	  falsebrr@   castr	   booleantypellvmliteIntTypecbranchJumpr   Returnr/   r   return_from_generatorr%   restypeOptionalrP   return_optional_valuer   get_return_valuereturn_valuePopBlockStaticSetItem	calltypesr   NotImplementedErrorlower_setitem	index_varrm   Printlower_printSetItemStoreMapdctkeyDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typer   delvarSetAttrget_setattrattrDynamicRaiselower_dynamic_raiseDynamicTryRaiselower_try_dynamic_raiseStaticRaiselower_static_raiseStaticTryRaiselower_static_try_raise)rJ   r   tyvalr  r  trflcondtypredr   otyretvalr   r   r   valuetyr!   targettyindextyr   fnopcallsigrL   rL   rM   r     s   

zLower.lower_instc                 C   s  |  |j}|  |j}|  |j}| |j}| |j}	| |j}
tj}| jj|}|| jj|j	i }| j
||}t|tjrQ| j| j|||j}ntj}||||j	d ksaJ | j| j||
|j	d }| j| j||	|j	d }|| j|||fS )Nr   r[   r  )r   r   r   r6  setitemr@   r8  r9  r:  rm   r   r  r	   r%  r  rT   r  	unliteral)rJ   
target_varr.  	value_varr   r   r   r!   rP  rO  rQ  r   rR  rS  r   ulrL   rL   rM   r-  S  s2   zLower.lower_setitemc                 C   s   |  | d S rO   )rF  rJ   r   rL   rL   rM   rB  r  s   zLower.lower_try_dynamic_raisec                 C   s   |j }g }g }|D ])}t|tjr$| |j}| |j}| || nd }|}|| || q	| j	|j
t|t|| jd d S Nr   )r   r  r
   Varr   r   r   increfappendr   r   tupler>   )rJ   r   r   rm   r   exc_argtyprH  rL   rL   rM   r@  w  s   


zLower.lower_dynamic_raisec                 C   8   |j d u r| jd | jd d S | j|j |j| jd d S rZ  )r   r   r>   r   rY  rL   rL   rM   rD       
zLower.lower_static_raisec                 C   ra  rZ  )r   r   r>   r   rY  rL   rL   rM   rF    rb  zLower.lower_static_try_raisec                 C   s  |j }t|tjtjtjfr | j| j||j }| 	|| |S t|tj
r,| ||S t|tjrP| |j}| |j}| j| j|||}| 	|| |S t|tjrt| jN | d|j }t|tjr|j }| jj}	|	|}
| j| j|
|}| j| j||
|}n| j|j }| j| j|||}| 	|| |W  d    S 1 sw   Y  nt|tjr| ||}| 	|| |S tt||)Nzarg.)r   r  r
   Constr  FreeVarr@   get_constant_genericrT   r\  Expr
lower_exprr[  r   r   r   r  r  r   r   r	   Omittedr8  !resolve_value_type_prefer_literalr   r!   Yieldlower_yieldr,  r  )rJ   rG  r   r   resrH  rM  argtypyvaltyctxvaltyconstrL   rL   rM   r    sH   
"zLower.lower_assignc           
      C   s   | j j|j }|j|u sJ t| ||j}|  | |j	j
}| |j	j
}| jj}| j| j|||}| j| j||}	| j| j|	 |  | j| j|d S rO   )r/   yield_pointsr!   r   r   
LowerYield	live_varslower_yield_suspendr   r   r   r   r   
yield_typer@   r  rT   r'  rP   r(  lower_yield_resumere  )
rJ   rettyr   ypyrH  r`  actual_rettypyretrN  rL   rL   rM   rk    s   zLower.lower_yieldc                    sf  j j  |j}|j}|j}|j}|j}|j}		|j}	|j}j
j| j j||jd }j j||	jd }fdd}
 fdd}|t|t|f||f}|d urp|
|S |t||	f||f}|d ur|
|S ||t|f||f}|d ur|
|S  j jji }j  |}|j||f}|
|S )Nr   r[   c                    s   j j| j S rO   )r@   r  rT   return_type)rl  )restyrJ   r   rL   rM   cast_result  s   z&Lower.lower_binop.<locals>.cast_resultc                    s   t dd |D rd S zt tjr jj| i }n
tjj	g| R  }W n
 t
y1   Y d S w zj |}|j|W S  tyJ   Y d S w )Nc                 s   s    | ]}|t ju V  qd S rO   )r
   	UNDEFINEDr   arL   rL   rM   	<genexpr>  s    z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr  r	   Functionr:  r@   r8  r   r   r}  r   r   rT   r,  )tysrm   
static_sigstatic_impl)r   rJ   r   rL   rM   try_static_impl  s$   
z*Lower.lower_binop.<locals>.try_static_impl)r@   r8  r9  lhsrhs
static_lhs
static_rhsr   r   r   r%   r+  r  rT   rm   _lit_or_omittedr:  r   )rJ   r~  exprr   r  r  r  r  ltyrtyr  r  rl  r   r   rL   )r   r~  rJ   r   rM   lower_binop  sH   

zLower.lower_binopc                    s     |j}  |j}tj} jj|}	|	 jj|ji }
 j	|	|
}||f} 
|j 
|jf} fddt|||jD }| j|} j j||j|S )Nc                    s&   g | ]\}}} j  j|||qS rL   r@   r  rT   )r   avatftrQ   rL   rM   r   8      z'Lower.lower_getitem.<locals>.<listcomp>)r   r   r6  getitemr@   r8  r9  r:  rm   r   r   ziprT   r  r}  )rJ   r~  r  r   r!   r   basevalindexvalr   rR  rS  r   argvalsargtypscastvalsrl  rL   rQ   rM   lower_getitem*  s,   


zLower.lower_getitemc                 C   sf   t |tr| |jj|j }| j| |jj|j}n| |j}| |j}| j	
| j|||S )zh
        Cast a Numba IR variable to the given Numba type, returning a
        low-level value.
        )r  r   r   r    r   r!   rT   extract_valuer   r@   r  )rJ   r   rG  vartyrH  rL   rL   rM   	_cast_var@  s   
zLower._cast_varc                    s   r  j}t|tjsJ |fddtt|D  }j}|d u r>|r/td|f  fddt	|j
D }|S  fdd}	 fdd}
 fd	d
}t||t||	|
|}|S )Nc                    s   g | ]}t  |qS rL   )r   r   i)r    rL   rM   r   T  s    z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                       g | ]
\}}  ||qS rL   r  r   r   sigtyrQ   rL   rM   r   ]      c                    s     |j|  S rO   )r  rm   )r!   paramr   rJ   r   rL   rM   normal_handler`  s   z,Lower.fold_call_args.<locals>.normal_handlerc                    s    j  jj|  |S rO   )r@   re  rT   rm   )r!   r  defaultr  rL   rM   default_handlerc  s   z-Lower.fold_call_args.<locals>.default_handlerc                    sD   j |  }t|tjsJ | fddt||D }t j|S )Nc                    r  rL   r  r  rQ   rL   rM   r   j  r  zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)rm   r  r	   	BaseTupler  r   make_anonymous_structrT   )r!   r  vars
stararg_tyr   r  rL   rM   stararg_handlerg  s   

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r  r	   r  ranger   pysigr,  r  rm   r   fold_argumentsdict)rJ   fntyr   pos_argsr    kw_args	tp_varargr  r  r  r  r  rL   )rJ   r   r    rM   fold_call_argsN  s4   


zLower.fold_call_argsc                 C   s   | j j| }|jtjksJ | jjt}t	|j
}t	|j
}tt|D ]}||jv r=|j| }t|tr=t|||< q%tj|jg|R  }|j|jd}| ||||ji }	| jt|}
|
| j|	 dS )z$
        Lower a ir.Print()
        )r  N)r%   r+  r}  r	   r   r@   r8  r9  r   listrm   r  r   constsr  r  r   r   r   replacer  r  r    r   rT   )rJ   r   r   r  pos_tysr  r  rn  	fixed_sigr  r   rL   rL   rM   r0  u  s    




zLower.lower_printc                 C   s   | j j| }| d| t|jtjr| j	 S | 
|jj}t|tjr/| |||}n?t|tjr=| |||}n1t|tjrK| |||}n#t|tjrY| |||}nt|tjrg| |||}n| |||}|d u r|jtjkr~| j	 }ntd| jd| j| j||j|S )Nz# lower_call: expr = {0}z2non-void function returns None from implementation)re   r>   )r%   r+  r   r   r  r}  r	   Phantomr@   r   r   r_   r   ObjModeDispatcher_lower_call_ObjModeDispatcherExternalFunction_lower_call_ExternalFunctionExternalFunctionPointer#_lower_call_ExternalFunctionPointerRecursiveCall_lower_call_RecursiveCallFunctionType_lower_call_FunctionType_lower_call_normalvoidr   r>   r  rT   )rJ   r~  r  r   r  rl  rL   rL   rM   
lower_call  s8   
zLower.lower_callc              
      s  ddl m}     j }dd |jD } fdd|D } fdd|D }t||D ]
\}	}
 |
|	 q. fddt||D }| j||} j	||}t
 j|} j|\}}|  |D ]} j| qj j|  j j W d    n1 sw   Y  |[  j|jj|}|j} j| |D ]} j| qt|jr|   j|  j|j  j j W d    n1 sw   Y  |W  d    W  d    S 1 sw   Y  W d    d S 1 sw   Y  d S )Nr   )ObjModeUtilsc                 S   s   g | ]}|j qS rL   r   r  rL   rL   rM   r     s    z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                       g | ]}  |qS rL   )r   r  rQ   rL   rM   r         c                    r  rL   )r   r  rQ   rL   rM   r     r  c                    s"   g | ]\}} j || jqS rL   )rR   from_native_valuerV   )r   atypavalrQ   rL   rM   r     s
    
)numba.core.pythonapir  rZ   rR   
gil_ensurerm   r  r\  load_dispatchercall_function_objargsr   is_nullrT   if_elsedecrefgil_releaserP   
return_excto_native_value
dispatcheroutput_typesr   callablecleanupif_thenis_error)rJ   r  r  r   r  	gil_staterh   ri   	argvaluesvrG  argobjscalleeret_objhas_exceptionthenorelseobjnativeoutputrL   rQ   rM   r    sR   


"z#Lower._lower_call_ObjModeDispatcherc                 C   sb   |  d | |||j|j|j}t|j|jj	|jj}| j
| jj|}| j
| j||j|S )Nz# external function)r   r  rm   r    kwsr   ExternalFunctionDescriptorsymbolr   r}  r@   declare_external_functionrT   r&   call_external_functionri   )rJ   r  r  r   r  r%   r_   rL   rL   rM   r    s   
z"Lower._lower_call_ExternalFunctionc                 C   s  |  d | |||j|j|j}| |jj}|jry| 	  | j
 }g }g }t|jj|j|D ])\}	}
}|	tjkrU| |
| | j
|
|| j}|| || q1|| q1| j| j|||j}|D ]}| j
| qh| j
| |S | j| j|||j}|S )Nz## calling external function pointer)r   r  rm   r    r  r   r_   r   requires_gilrZ   rR   r  r  r   r	   ffi_forced_objectr\  r  rV   r]  r@   call_function_pointerrT   cconvr  r  )rJ   r  r  r   r  pointerr  
newargvalspyvalsexptypgottypr  r  rl  rL   rL   rM   r  
  s@   



z)Lower._lower_call_ExternalFunctionPointerc           
      C   s   |  |||j|j|j}||j}| jjpt}| jj	}||j
|j||jd}| jjj|r<| j| j| j||}	|	S | j| j|||}	|	S )N)abi_tagsuid)r  rm   r    r  get_overloadsr@   manglerr   r%   r  rg   r  rT   rf   r   
startswithcall_internalcall_unresolved)
rJ   r  r  r   r  rec_ovr  r  mangled_namerl  rL   rL   rM   r  7  s$   

zLower._lower_call_RecursiveCallc                 C   sf   |  d t|}||std| dt| | |||j|j|j	}| 
|j|jj||S )Nz## calling first-class function typez%mismatch of function types: expected z	 but got )r   r	   rU  check_signaturer   r  r  rm   r    r  )_Lower__call_first_class_function_pointerftyper_   r   )rJ   r  r  r   r   r  rL   rL   rM   r  L  s    


zLower._lower_call_FunctionTypec              
   C   s  | j }| j}| |}t| ||||d}|j}	d| |	_|}
t||
	|j
}|jt||	dd}|\}}| | |||}|||}||| W d   n1 s]w   Y  |K |
j|j
|j }||	|}|
j|||j
|j|\}}t||j |j|| W d   n1 sw   Y  ||| W d   n1 sw   Y  W d   n1 sw   Y  ||S )a  
        Calls a first-class function pointer.

        This function is responsible for calling a first-class function pointer,
        which can either be a JIT-compiled function or a Python function. It
        determines if a JIT address is available, and if so, calls the function
        using the JIT address. Otherwise, it calls the function using a function
        pointer obtained from the `__get_first_class_function_pointer` method.

        Args:
            ftype: The type of the function.
            fname: The name of the function.
            sig: The signature of the function.
            argvals: The argument values to pass to the function.

        Returns:
            The result of calling the function.
        r   jit_addr_of_FlikelyN)r@   rT   r   r   create_struct_proxyr   jit_addrr   alloca_onceget_value_typer}  r  r  (_Lower__get_first_class_function_pointerr   storerP   get_function_typerm   
as_pointerbitcastcall_functionif_unlikelyr  return_status_propagateload)rJ   r  fnamer   r  r@   rT   fstructstructr  ctxres_slotif_jit_addr_is_nullr  r  func_ptrrl  lltystatusrL   rL   rM   #__call_first_class_function_pointer[  sV   




z)Lower.__call_first_class_function_pointerc              
   C   s  ddl m} | j|}| |}| jj|dd| d}tj| j|d| d}| jj	t
| j|dd\}	}
|	o |   | j }| jj|dd	| d}|| j| j||d
d}| jjt
| j|dd | jt| df| jd W d    n1 s~w   Y  | j|}| j| j||| | j| | j| W d    n1 sw   Y  |
 | j| j||| W d    n1 sw   Y  W d    n1 sw   Y  | j|S )Nr   )lower_get_wrapper_addressz
addr_of_%sr  z
fptr_of_%sFr  r[   zpyaddr_of_%signore)failure_modez function address is null)r   r>   ) numba.experimental.function_typer(  r@   r  r   rT   r  r   r  r  r  rZ   rR   r  r  r   RuntimeErrorr>   long_as_voidptrr  r  r  r  r  )rJ   r  r  r   r(  r%  r  addrfptrr  r  r  pyaddraddr1addr2rL   rL   rM   "__get_first_class_function_pointer  sZ   




z(Lower.__get_first_class_function_pointerc                 C   s   |  d| |  d| t|tjr|jj}n| |||j|j|j	}|j
}|d urCddlm} ||}|jj}|||}	n| j||}	|jr[| |jj}
|
gt| }|	| j|| j}|S )Nz# calling normal function: {0}z# signature: {0}r   )resolve_dispatcher_from_str)r   r   r  r	   r  r_   rm   r  r    r  r   numba.core.target_extensionr4  targetdescrtarget_contextr   r@   recvrr   r   r  rT   r>   )rJ   r  r  r   r  tnamer4  disphw_ctxr   the_selfrl  rL   rL   rM   r    s&   
zLower._lower_call_normalc           (   
      s	  |j dkr ||jS |j dkr,|jj}|jr$ ||jS  ||jS |j dkru|j	j}|j	j}j
j|j}jj| }j
||}j
j|||jd }|j|g}	j
j|	|j }	|	S |j dkr |}	|	S |j dkr|j	j}|j	j}
j
j||
}	 |	 |	S |j dkrʈ|j	j}|j	j}
j
j||
}	 |	 |	S |j dv r|j	j}|j	j}
jj| }j
|j |}|j\}j
j||
|}|j|f}	j
j|	|j }	|	S |j d	kr|j	j}|j	j}
t|
tjr7j
j||
|
j}|
j}
t|
tjrM|
 ksEJ |
| |S |
jj}j
 }t |tj!}t"#|
j|
}j
d
|}t"#||
j}j
d|}|j|f}t$|j%D ]H}|j|f}j
j||}t&'jj(| j)t*j+d W d    n	1 sw   Y  j
j||}j,|||}q|j|f}j
j||}t&'j| j)t*j+d W d    n	1 sw   Y  -|
j| |S |j dkrr|j	j}|j	j}
t tj.r@j
j||
 j/}j
0j| j/}	 |	 |	S j
1|
|j2}j
j3|
|j2}|d u r[j
4 S |j
j|
||j2}	j
j|	| }	|	S |j dkrt"# |j	jt5|j6}zj
d|}|j|j	j|j6fW S  t7y   |j8d u r jj| }9 ||j	|j8| Y S w |j dkrt"# |j	j|j6j}j
d|}|j|j	j|j6jfS |j dkrjj| }9 ||j	|j6|S |j dkr?fdd|j:D }fdd|j:D }fddt;| |D }j
<j |} | |S |j dkrfdd|j:D }fdd|j:D }t tj=rfddt;| j|D }j
<jt> j|} | |S  fddt;||D }j
?j |S |j dkr|j:d d d }fdd|D }fdd|D } fddt;||D }j
@j |S |j d kr*|j:}g g }} g g }!}"|D ]1\}#}$|#j}%|#j}&|$j}|$j}'|A|% | A| |!A|& |"A|' qj
Bj tCt;|!|"tCt;|| S |j d!krP|j	j}|j	j}
j
j||
 } | |S |j d"krZtDd#|j d$krfj
E S |j d%krrj
E S |j j
jFv rj
jF|j  |}	|	S t7|)&Nbinopinplace_binopunaryr   r   
pair_firstpair_second)getiteriternextexhaust_iterrB  rC  r   getattrstatic_getitemtyped_getitemr  build_tuplec                       g | ]}  |jqS rL   r   r   r  rQ   rL   rM   r         z$Lower.lower_expr.<locals>.<listcomp>c                    rI  rL   r   r   r  rQ   rL   rM   r     rK  c                    &   g | ]\}}} j  j|||qS rL   r  r   rH  totyfromtyrQ   rL   rM   r     r  
build_listc                    rI  rL   rJ  r  rQ   rL   rM   r     rK  c                    rI  rL   rL  r  rQ   rL   rM   r     rK  c                    rM  rL   r  rN  rQ   rL   rM   r     r  c                    &   g | ]\}}j j|| jqS rL   r@   r  rT   dtyper   rH  rP  r~  rJ   rL   rM   r     
    	build_setr#   c                    rI  rL   rJ  r  rQ   rL   rM   r     rK  c                    rI  rL   rL  r  rQ   rL   rM   r     rK  c                    rR  rL   rS  rU  rV  rL   rM   r     rW  	build_mapr  phizPHI not strippednullundef)Gr   r  rb   r   r  r   mutableimmutable_fnr   r   r@   r8  r9  r%   r+  r   r  rT   rm   r}  r  r@  r\  rA  r  r	   r%  r  r  iterator_typerv  get_constant_undefPairr  r   r   r  countr   r  not_r   
ValueErrorr>   insert_valuer  BoundFunctionthisget_bound_functionget_getattrr>  resolve_getattrr   r  r!   r,  r.  r  r-   r  
make_tupleLiteralListTuplerQ  rX  r]  rY  r  r   get_constant_nullspecial_ops)(rJ   r~  r  r  rH  r`  func_tyr   r   rl  rG  ftycastvalitemtytuppairtygetiter_siggetiter_impliternext_sigiternext_impliterobjr  pairis_validitemcastedattrtyitemvalsitemtysr  r-   r<   r   	key_typesvalue_typeskr  r4  keytypevaltyperL   rV  rM   rg    s  






















zLower.lower_exprc                 C   s<   || j v rdS || jvs| jr| ||}|| j |< dS dS )zT
        Ensure the given variable has an allocated stack slot (if needed).
        N)r:   r   r   alloca)rJ   r   r  ptrrL   rL   rM   r     s   

zLower._alloca_varc                 C   sH   | j s|| jvs
J || jvsJ || jvr| || | | j| S )z=
        Get a pointer to the given variable's slot.
        )r   r   r   r:   r   r   )rJ   r   rL   rL   rM   getvar  s   

zLower.getvarc                 C   sx   || j v r| js| j | S | |}|| jjv r6t| j | j|W  d   S 1 s/w   Y  dS | j|S )z2
        Load the given variable's value.
        N)	r   r   r  r.   	arg_namesr   r   rT   r  )rJ   r   r  rL   rL   rM   r     s   


$zLower.loadvarNc              
   C   s&  |  |}| || || jv r| js|| j|< dS |du r)| |}| || | |}|j|jj	krBdj
||||d}t||durt| j | j|| W d   n1 s^w   Y  | j}| j|}	| j|	}
| jj| }| jj| j|||	|
|j||d dS | j|| dS )z:
        Store the value into the given variable.
        NzNStoring {value.type} to ptr of {ptr.type.pointee} ('{name}'). FE type {fetype})r   r  r  r   )r   lltypesizer]   	datamodelr  )r   r   r   r   r   r   r  r  r  pointeer   AssertionErrorr   r   rT   r  rE   r@   r  get_abi_sizeofdata_model_managermark_variabler]   )rJ   r   r   r  r  oldr  re   r>   r  sizeofr  rL   rL   rM   r    s@   




zLower.storevarc                 C   s   |  |}|| jvr| js|| jv r| j| | || || jv r3| js3| j| }| || dS | |}| || j	| | j
t|jjd| dS )z,
        Delete the given variable.
        N)r   r   r   r   discardr   r  r  rT   r  r  r   r  r  )rJ   r   r  llvalr  rL   rL   rM   r;  *  s   




zLower.delvarc                 C   s(   | j |}| j j| }| j|||dS )N)r  )r@   r  r  alloca_lltype)rJ   r   r  r  r  rL   rL   rM   r  C  s   zLower.allocac              	   C   s`   | d }tj| j||dd}|r.|| jjvr.| j|}| jj	| j||||| j
j|d |S )N$F)r   zfill)r   r  r  r]   r  )r  r   r  rT   r.   r  r@   r  r   r  r>   r]   )rJ   r   r  r  
is_uservaraptrr  rL   rL   rM   r  H  s   
zLower.alloca_lltypec                 C   s$   | j jsd S | j j| j|| d S rO   )r@   r   nrtr\  rT   rJ   r`  rH  rL   rL   rM   r\  \  s   zLower.increfc                 C   sR   | j jsd S t| j | j j| j|| W d    d S 1 s"w   Y  d S rO   )r@   r   r   r   rT   r  r  r  rL   rL   rM   r  b  s
   "zLower.decrefrO   ),r   r   r   r   r   rI   r   r   r   ry   r{   r   r-  rB  r@  rD  rF  r  rk  r  r  r  r  r0  r  r  r  r  r  r  r  r  r  rg  r   r  r   r  r;  r  r  r\  r  __classcell__rL   rL   r   rM   r   `  sT    

'& 2F'*@-;( s
.
r   c                 C   s*   zt | W S  ty   t |  Y S w )zjReturns a Literal instance if the type of value is supported;
    otherwise, return `Omitted(value)`.
    )r	   r   r   rh  r  rL   rL   rM   r  m  s
   r  )/collectionsr   r   r6  r`   	functoolsr   llvmlite.irr  r   r   
numba.corer   r   r	   r
   r   r   r   r   r   r   r   r   numba.core.errorsr   r   r   r   r   r   numba.core.funcdescr   numba.core.environmentr   numba.core.analysisr   r   numba.misc.firstlinefinderr   numba.misc.coverage_supportr   r   objectr"   r   r  rL   rL   rL   rM   <module>   s:    8 
  I          