o
    1&i7                    @   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filepathZcgctxdirectives_only)'libraryr%   r   Z	SortedMapblocksitemsfunc_irgenerator_infometadatar   ZConfigStackZtop_or_noneflagsZcreate_ir_moduleunique_namer&   r   Zfrom_fndescenvblkmapZpending_phisvarmapminkeysfirstblklocZ	subtargetcontextenable_debuginfoZ	DIBuilderr   ZDummyDIBuilder_compute_def_locationdefn_locdbg_directives_onlyfilenamer   _loc_notify_registryinit)selfr8   r)   r%   r,   r.   Zdibuilderclsr(    rA   >C:\wamp64\www\opt\env\Lib\site-packages\numba/core/lowering.py__init__   s<   

zBaseLower.__init__c                 C   s   | j jS N)r8   	call_convr@   rA   rA   rB   rE   O   s   zBaseLower.call_convc                 C   s   d S rD   rA   rF   rA   rA   rB   r?   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)	pyapir8   Zget_python_apibuilderZget_env_managerenv_managerZenv_bodyZenv_ptrZenvargrF   rA   rA   rB   
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,   r7   Zwith_linenoliner8   r9   func_idfuncr   warningswarnr   )r@   r;   fnZoptional_lnooffsetmsgrA   rA   rB   r:   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argtypesrL   alwaysinlinenoinline)rG   r   Zmark_subprogramrH   rT   r%   rU   argsrW   r;   rL   
attributesr/   r<   add)r@   r[   Z
full_debugrA   rA   rB   	pre_lowerw   s   
	zBaseLower.pre_lowerc                 C   s"   | j   | jD ]}|  qdS )z5
        Called after all blocks are lowered
        N)r   finalizer>   close)r@   notifyrA   rA   rB   
post_lower   s   


zBaseLower.post_lowerc                 C      dS )z1
        Called before lowering a block.
        NrA   r@   blockrA   rA   rB   	pre_block       zBaseLower.pre_blockc                 C   rb   )z0
        Called after lowering a block.
        NrA   rc   rA   rA   rB   
post_block   rf   zBaseLower.post_blockc                 C   s$   | j j| j||||| jjjd d S )Nr7   	func_name)rE   Zreturn_dynamic_user_excrH   r,   rM   ri   )r@   	exc_classexc_argsnb_typesr7   rA   rA   rB   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.
        rh   N)rE   Zreturn_user_excrH   r,   rM   ri   r@   rj   rk   r7   rA   rA   rB   return_exception      

zBaseLower.return_exceptionc                 C   rn   )z5Set exception state in the current function.
        rh   N)rE   Zset_static_user_excrH   r,   rM   ri   ro   rA   rA   rB   set_exception   rq   zBaseLower.set_exceptionc                 C   s"   | j | j}| j | j| dS )z7Emit a pointer to hold the Environment object.
        N)r8   Zget_env_namer%   Zdeclare_env_globalr&   )r@   envnamerA   rA   rB   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)r8   r%   )rt   r-   genlowerlower_normal_functionr%   GeneratorLowergentypeZlower_init_funcZlower_next_funcZhas_finalizerZlower_finalize_funcr   Z	DUMP_LLVMr   Z	dump_llvmr&   r8   
enable_nrtr   Zremove_unnecessary_nrt_usagerT   Zpost_loweringr)   Zadd_ir_modulerF   rA   rA   rB   lower   s&   

zBaseLower.lowerc                 C   s    | j | j| jj| j| _| jS rD   )rE   Zdecode_argumentsrH   r%   rW   rT   fnargsrF   rA   rA   rB   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_emissionrH   position_at_endbranchr2   r6   )r@   r%   entry_block_tailrA   rA   rB   rv      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*   rT   append_basic_blockr2   r]   rH   Zbasic_blockdebug_printformatr%   r0   sortedr+   r   lower_blockra   )r@   rR   Zbnamer   rd   bbrA   rA   rB   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.
        r7   zlowering "{inst}" at {loc})instr7   Zerrcls_N)re   bodyr7   r   r   r   
lower_instrg   )r@   rd   r   ZdefaulterrclsrA   rA   rB   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)ru   r8   create_cpython_wrapperr)   Zgendescr1   call_helperr%   )r@   r   rA   rA   rB   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)ru   r   r8   create_cfunc_wrapperr)   r%   r1   r   rF   rA   rA   rB   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 )NrX   ZoptnonerY   entry)r8   Zdeclare_functionr&   rT   r/   Zdbg_optnoner[   r\   r   Zentry_blockr   rH   rE   Zinit_call_helperr   )r@   r%   ZattrsetrA   rA   rB   r}   -  s   

zBaseLower.setup_functionc                 C   s   | j j| S rD   )r%   typemap)r@   varnamerA   rA   rB   typeof9  s   zBaseLower.typeofr7   returnc                 C   s   | j D ]}|| qdS )z[Called when a new instruction with the given `loc` is about to be
        lowered.
        N)r>   r`   )r@   r7   Z
notify_objrA   rA   rB   
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   Z	DEBUG_JITr8   r   rH   r%   rU   )r@   rS   rA   rA   rB   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   r8   get_dummy_valueloadvarr   	signaturenoneget_functionprintrH   )r@   rS   r   ZargtysrZ   sigimplrA   rA   rB   print_variableH  s   
zBaseLower.print_variablerD   )NN)F) __name__
__module____qualname____doc__rC   propertyrE   r?   rJ   r:   r]   ra   re   rg   rm   rp   rr   rt   rz   r|   rv   r~   r   r   r   r}   r   r
   ZLocr   r   r   rA   rA   rA   rB   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 rD   )superr?   _find_singly_assigned_variablerF   	__class__rA   rB   r?   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)r/   r   r<   rF   rA   rA   rB   _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 )NrK   r   c                    s   g | ]
}|j j kr|qS rA   )targetname).0stmtvarrA   rB   
<listcomp>  s    z8Lower._find_singly_assigned_variable.<locals>.<listcomp>)r,   r*   setrM   Zis_generatorr   r   r   Zdefmapr+   r\   Zusemaplen
find_instsr
   Assign_singly_assigned_vars_blk_local_varmap)r@   r,   r*   ZsavZuse_defsZalloca_varsZvar_assign_mapZblkZvlZvar_use_mapZdefblkZassign_stmtsZassignsrA   r   rB   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   )!Znumba.core.unsafer   r   r   re   Z_cur_ir_blockr6   r2   rH   r   r   r*   valuesr   r
   Delvaluer\   r   _alloca_varZ
find_exprsr   guardZget_definitionr,   rN   
isinstanceGlobalZexception_check
terminatorBranchtruebr_in_try_block)r@   rd   r   r   Z	all_namesxr   fetyper   ZdefnZ	targetblkr   rA   rB   re     s8   


zLower.pre_blockc                 C   s"   z| j `W d S  ty   Y d S w rD   )rH   r   AttributeErrorrc   rA   rA   rB   rg     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|)NrK   )argidxzcond is not i1: %sz)type '{}' does not match return type '{}'Zstatic_setitem   r   )Qr   Zmark_locationrH   r7   rL   r   r   strr   r
   r   r   r   r   lower_assignr   Argr;   r!   storevarr   r   condr2   r   Zfalsebrr8   castr	   booleantypellvmliteZIntTypeZcbranchZJumpr   Returnr-   ru   Zreturn_from_generatorr%   restypeOptionalrE   Zreturn_optional_valuer   get_return_valuereturn_valueZPopBlockZStaticSetItem	calltypesr   NotImplementedErrorlower_setitem	index_varrZ   ZPrintlower_printZSetItemZStoreMapdctkeyZDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typer   delvarZSetAttrZget_setattrattrZDynamicRaiselower_dynamic_raiseZDynamicTryRaiselower_try_dynamic_raiseZStaticRaiselower_static_raiseZStaticTryRaiselower_static_try_raise)r@   r   tyvalr   r   trflZcondtypredr   otyretvalr   r   r   valuetyr!   targettyindextyr   fnopcallsigrA   rA   rB   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   rK   r   )r   r   r   r   setitemr8   r   r   r   rZ   r   r   r	   r   r   rH   r   	unliteral)r@   Z
target_varr   Z	value_varr   r   r   r!   r   r   r   r   r   r   r   ZulrA   rA   rB   r   S  s2   zLower.lower_setitemc                 C   s   |  | d S rD   )r   r@   r   rA   rA   rB   r   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   )rk   r   r
   Varr   r   r   increfappendrm   rj   tupler7   )r@   r   rk   rZ   rl   Zexc_argtypr   rA   rA   rB   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 r   )rj   rp   r7   rk   r   rA   rA   rB   r        
zLower.lower_static_raisec                 C   r  r   )rj   rr   r7   rk   r   rA   rA   rB   r     r  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
   ZConstr   ZFreeVarr8   get_constant_genericrH   r   Expr
lower_exprr   r   r   r   r   r   r   r   r	   Omittedr   Z!resolve_value_type_prefer_literalr{   r!   Yieldlower_yieldr   r   )r@   r   r   r   resr   r   ZargtypyvalZtyctxZvaltyconstrA   rA   rB   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 rD   )r-   Zyield_pointsr!   r   r   Z
LowerYieldZ	live_varsZlower_yield_suspendr   r   r   r   rx   
yield_typer8   r   rH   r   rE   r   Zlower_yield_resumer  )
r@   Zrettyr   Zypyr   r   Zactual_rettypZyretr   rA   rA   rB   r    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   rK   c                    s   j j| j S rD   )r8   r   rH   return_type)r	  )restyr@   r   rA   rB   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 rD   )r
   	UNDEFINEDr   arA   rA   rB   	<genexpr>  s    z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr   r	   Functionr   r8   r   r   r   r  r   r   rH   r   )ZtysrZ   Z
static_sigZstatic_impl)r   r@   r   rA   rB   try_static_impl  s$   
z*Lower.lower_binop.<locals>.try_static_impl)r8   r   r   lhsrhs
static_lhs
static_rhsr   r   r   r%   r   r   rH   rZ   _lit_or_omittedr   r   )r@   r  exprr   r  r  r  r  ltyZrtyr  r  r	  r   r   rA   )r   r  r@   r   rB   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 rA   r8   r   rH   )r   avatftrF   rA   rB   r   8      z'Lower.lower_getitem.<locals>.<listcomp>)r   r   r   getitemr8   r   r   r   rZ   r   r   ziprH   r   r  )r@   r  r  r   r!   r   ZbasevalZindexvalr   r   r   r   argvalsZargtypscastvalsr	  rA   rF   rB   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!   rH   extract_valuer   r8   r   )r@   r   r   Zvartyr   rA   rA   rB   	_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 rA   )r   r   i)r    rA   rB   r   T  s    z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                       g | ]
\}}  ||qS rA   r+  r   r   ZsigtyrF   rA   rB   r   ]      c                    s     |j|  S rD   )r+  rZ   )r!   paramr   r@   r   rA   rB   normal_handler`  s   z,Lower.fold_call_args.<locals>.normal_handlerc                    s    j  jj|  |S rD   )r8   r  rH   rZ   )r!   r2  defaultr3  rA   rB   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.  rA   r/  r0  rF   rA   rB   r   j  r1  zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)rZ   r   r	   	BaseTupler&  r   Zmake_anonymous_structrH   )r!   r2  varsZ
stararg_tyr   r3  rA   rB   stararg_handlerg  s   

z-Lower.fold_call_args.<locals>.stararg_handler)r   r   r   r	   r7  ranger   pysigr   r&  rZ   r   Zfold_argumentsdict)r@   fntyr   pos_argsr    Zkw_argsZ	tp_varargr;  r'  r4  r6  r9  rA   )r@   r   r    rB   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   r8   r   r   r   listrZ   r:  r   Zconstsr   r   r   r   r   replacer;  r?  r    r   rH   )r@   r   r   r=  Zpos_tysr>  r-  r
  Z	fixed_sigr'  r   rA   rA   rB   r   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)rS   r7   )r%   r   r   r   r   r  r	   ZPhantomr8   r   r   rN   r   ObjModeDispatcher_lower_call_ObjModeDispatcherZExternalFunction_lower_call_ExternalFunctionZExternalFunctionPointer#_lower_call_ExternalFunctionPointerZRecursiveCall_lower_call_RecursiveCallFunctionType_lower_call_FunctionType_lower_call_normalZvoidr   r7   r   rH   )r@   r  r  r   r=  r	  rA   rA   rB   
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 rA   r   r  rA   rA   rB   r     s    z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                       g | ]}  |qS rA   )r   r  rF   rA   rB   r         c                    rM  rA   )r   r  rF   rA   rB   r     rN  c                    s"   g | ]\}} j || jqS rA   )rG   from_native_valuerI   )r   ZatypavalrF   rA   rB   r     s
    
)Znumba.core.pythonapirK  rJ   rG   
gil_ensurerZ   r&  r   Zload_dispatcherZcall_function_objargsr   is_nullrH   if_elsedecrefgil_releaserE   Z
return_excZto_native_value
dispatcherZoutput_typesr   callablecleanupif_thenis_error)r@   r=  r  r   rK  	gil_staterV   rW   Z	argvaluesvr   ZargobjsZcalleeZret_objhas_exceptionthenorelseobjnativeoutputrA   rF   rB   rC    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?  rZ   r    kwsr   ZExternalFunctionDescriptorsymbolr   r  r8   Zdeclare_external_functionrH   r&   Zcall_external_functionrW   )r@   r=  r  r   r'  r%   rN   rA   rA   rB   rD    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?  rZ   r    rc  r   rN   r   Zrequires_gilrJ   rG   rQ  r&  r   r	   Zffi_forced_objectr   rO  rI   r   r8   Zcall_function_pointerrH   ZcconvrT  rU  )r@   r=  r  r   r'  pointerr[  Z
newargvalsZpyvalsZexptypZgottyprP  r`  r	  rA   rA   rB   rE  
  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?  rZ   r    rc  Zget_overloadsr8   manglerr   r%   rf  rU   rg  rH   rT   r   
startswithZcall_internalZcall_unresolved)
r@   r=  r  r   r'  Zrec_ovrh  rf  Zmangled_namer	  rA   rA   rB   rF  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	   r   Zcheck_signaturer   rG  r?  rZ   r    rc  )_Lower__call_first_class_function_pointerftyperN   r   )r@   r=  r  r   r   r'  rA   rA   rB   rH  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   Zjit_addr_of_FZlikelyN)r8   rH   r   r   Zcreate_struct_proxyr   jit_addrr   alloca_onceget_value_typer  rS  rR  (_Lower__get_first_class_function_pointerr   storerE   Zget_function_typerZ   Z
as_pointerbitcastcall_functionif_unlikelyrZ  Zreturn_status_propagateload)r@   rk  fnamer   r'  r8   rH   fstructstructrn  ctxZres_slotZif_jit_addr_is_nullr^  r_  Zfunc_ptrr	  lltystatusrA   rA   rB   Z#__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_%srL  z
fptr_of_%sFrm  rK   zpyaddr_of_%signore)Zfailure_modez function address is null)rk   r7   )Z numba.experimental.function_typer}  r8   rp  r   rH   r*  r   ro  rS  rR  rJ   rG   rQ  rY  rp   RuntimeErrorr7   Zlong_as_voidptrrr  rs  rT  rU  rv  )r@   rk  rw  r   r}  r{  rx  addrZfptrr^  r_  r[  ZpyaddrZaddr1Zaddr2rA   rA   rB   Z"__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	   rB  rN   rZ   r?  r    rc  r   Znumba.core.target_extensionr  ZtargetdescrZtarget_contextr   r8   Zrecvrr   r   r@  rH   r7   )r@   r=  r  r   r'  Ztnamer  ZdispZhw_ctxr   Zthe_selfr	  rA   rA   rB   rI    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binopZinplace_binopZunaryr   r   
pair_firstpair_second)getiteriternextZexhaust_iterr  r  r   getattrZstatic_getitemZtyped_getitemr%  Zbuild_tuplec                       g | ]}  |jqS rA   r   r   r,  rF   rA   rB   r         z$Lower.lower_expr.<locals>.<listcomp>c                    r  rA   r   r   r,  rF   rA   rB   r     r  c                    &   g | ]\}}} j  j|||qS rA   r   r   r   ZtotyfromtyrF   rA   rB   r     r$  
build_listc                    r  rA   r  r,  rF   rA   rB   r     r  c                    r  rA   r  r,  rF   rA   rB   r     r  c                    r  rA   r   r  rF   rA   rB   r     r$  c                    &   g | ]\}}j j|| jqS rA   r8   r   rH   Zdtyper   r   r  r  r@   rA   rB   r     
    	build_setr#   c                    r  rA   r  r,  rF   rA   rB   r     r  c                    r  rA   r  r,  rF   rA   rB   r     r  c                    r  rA   r  r  r  rA   rB   r     r  	build_mapr   phizPHI not strippednullZundef)Gr   r  rQ   r   r  r   ZmutableZimmutable_fnr   r   r8   r   r   r%   r   r   r   rH   rZ   r  rJ  r  r   r  r   r	   r   r   r7  Ziterator_typer  Zget_constant_undefZPairr   r   r   r:  countr   ru  not_rp   
ValueErrorr7   Zinsert_valuerT  ZBoundFunctionthisZget_bound_functionZget_getattrr   Zresolve_getattrr   r  r!   r   r   r)  r+   r&  Z
make_tupleZLiteralListTupler  r  r   r  r@  r   Zget_constant_nullZspecial_ops)(r@   r  r  r  r   r   Zfunc_tyr   r   r	  r   ZftyZcastvalZitemtytupZpairtyZgetiter_sigZgetiter_implZiternext_sigZiternext_implZiterobjr-  pairZis_validitemZcastedZattrtyZitemvalsZitemtysr(  r+   r5   r   Z	key_typesZvalue_typeskr\  r   ZkeytypeZvaltyperA   r  rB   r    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)r3   r   r   alloca)r@   r   r   ptrrA   rA   rB   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   r3   r   r   )r@   r   rA   rA   rB   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   rH   rv  )r@   r   r  rA   rA   rB   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sizerL   	datamodelr   )r   r   r   r   r   r   rT  r  r   pointeer   AssertionErrorr   r   rH   rr  r;   r8   rp  get_abi_sizeofdata_model_managermark_variablerL   )r@   r   r   r   r   oldr  rS   r7   r  sizeofr  rA   rA   rB   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   rT  r  rH   rv  rr  r   r   r  )r@   r   r   Zllvalr  rA   rA   rB   r   *  s   




zLower.delvarc                 C   s(   | j |}| j j| }| j|||dS )N)r  )r8   rp  r  alloca_lltype)r@   r   r   r  r  rA   rA   rB   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  rL   r  )ri  r   ro  rH   r,   r  r8   r  r   r  r7   rL   )r@   r   r  r  Z
is_uservarZaptrr  rA   rA   rB   r  H  s   
zLower.alloca_lltypec                 C   s$   | j jsd S | j j| j|| d S rD   )r8   ry   nrtr   rH   r@   r   r   rA   rA   rB   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 rD   )r8   ry   r   r   rH   r  rT  r  rA   rA   rB   rT  b  s
   "zLower.decrefrD   ),r   r   r   r   rw   r?   r   r   r   re   rg   r   r   r   r   r   r   r   r  r  r)  r+  r?  r   rJ  rC  rD  rE  rF  rH  rj  rq  rI  r  r   r  r   r   r   r  r  r   rT  __classcell__rA   rA   r   rB   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   r  rl  rA   rA   rB   r  m  s
   r  )/collectionsr   r   r   rO   	functoolsr   Zllvmlite.irr   r   r   Z
numba.corer   r   r	   r
   r   r   r   r   r   r   r   r   Znumba.core.errorsr   r   r   r   r   r   Znumba.core.funcdescr   Znumba.core.environmentr   Znumba.core.analysisr   r   Znumba.misc.firstlinefinderr   Znumba.misc.coverage_supportr   r   objectr"   r   r  rA   rA   rA   rB   <module>   s:    8 
  I          