B
     \                 @   s  d dl mZmZmZ d dlZd dlZd dlmZmZ d dl	Z	d dl
mZ d dlmZ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 ddlmZmZmZmZ dd	lm Z  dd
lm!Z! ddlm"Z" G dd dej#Z#e Z$dd Z%eddZ&G dd de'Z(i Z)G dd de(Z*dd Z+dS )    )print_functiondivisionabsolute_importN)
namedtupledeque)partial)ConstantTypeBuilder   )	_dynfunccgutilsconfigfuncdesc
generatorsirtypestypingutils)LoweringErrornew_error_contextTypingErrorLiteralTypingError)removerefctpass)default_mangler)	debuginfoc               @   s8   e Zd ZdZdZe Zedd Z	dd Z
dd Zd	S )
Environmentz~Stores globals and constant pyobjects for runtime.

    It is often needed to convert b/w nopython objects and pyobjects.
    )env_name__weakref__c             C   sF   y| j |j S  tk
r@   | | }|j|_|| j |j< |S X d S )N)_memor   KeyErrorZlookup_globals)clsfndescinst r$   -lib/python3.7/site-packages/numba/lowering.pyfrom_fndesc   s    zEnvironment.from_fndescc             C   s   t | jd | j| jffS )N__name__)_rebuild_envglobalsconstsr   )selfr$   r$   r%   
__reduce__)   s    zEnvironment.__reduce__c             C   sn   t d kst jrd S td krd S tt | f ttdkrjt }x$trh|td d  dkrht  qFW d S )N
   r   r   )r   ZIS_PY3
_keepaliveappendtimelenpopleft)r+   Zcurr$   r$   r%   __del__0   s    zEnvironment.__del__N)r'   
__module____qualname____doc__	__slots__weakrefWeakValueDictionaryr   classmethodr&   r,   r3   r$   r$   r$   r%   r      s   r   c             C   sF   |t jkrt j| S ddlm} || }t |j}||jd d < |S )Nr   )	serialize)r   r    r;   Z_rebuild_module__dict__r*   )modnamer*   r   r;   modenvr$   r$   r%   r(   ?   s    



r(   _VarArgItem)varargindexc               @   s   e Zd ZdZd&ddZdd Zdd Zd	d
 Zdd Zdd Z	d'ddZ
dd Zdd Zdd Zdd Zdd Zdd Zd(ddZd d! Zd"d# Zd$d% ZdS ))	BaseLowerz
    Lower IR to LLVM
    Nc             C   s   || _ || _tt|j| _|| _|j| _|j| _|| _	| j 
| jj| _t| j| _i | _i | _t| j | _d| _|j| j| jd| _| jjr| jjntj}|| j|jjd| _|   d S )N)Zenvironmentr"   )modulefilepath)libraryr"   r   Z	SortedMapZ	iteritemsblocksfunc_ir	call_convgenerator_infometadataZcreate_ir_moduleunique_namerF   r   r&   r@   blkmapvarmapminkeysfirstblklocZ	subtargetcontextZenable_debuginfoZ	DIBuilderr   ZDummyDIBuilderfilenameinit)r+   rU   rH   r"   rJ   rM   Zdibuilderclsr$   r$   r%   __init__Q   s(    zBaseLower.__init__c             C   s   d S )Nr$   )r+   r$   r$   r%   rW   x   s    zBaseLower.initc             C   sF   | j dk	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)	pyapirU   Zget_python_apibuilderZget_env_managerenv_managerZenv_bodyZenv_ptrZenvarg)r+   r$   r$   r%   
init_pyapi{   s    

zBaseLower.init_pyapic             C   s(   d| _ | jj| jj| jj| jjd dS )z4
        Called before lowering all blocks.
        N)functionnamerT   )	rY   r   Zmark_subprogramrZ   r]   r"   qualnamerJ   rT   )r+   r$   r$   r%   	pre_lower   s    zBaseLower.pre_lowerc             C   s   | j   dS )z5
        Called after all blocks are lowered
        N)r   finalize)r+   r$   r$   r%   
post_lower   s    zBaseLower.post_lowerc             C   s   dS )z1
        Called before lowering a block.
        Nr$   )r+   blockr$   r$   r%   	pre_block   s    zBaseLower.pre_blockc             C   s"   | j j| j|||| jjjd d S )N)rT   	func_name)rK   Zreturn_user_excrZ   rJ   Zfunc_idre   )r+   	exc_classexc_argsrT   r$   r$   r%   return_exception   s    zBaseLower.return_exceptionc             C   s"   | j | j}| j | j| dS )z7Emit a pointer to hold the Environment object.
        N)rU   Zget_env_namer"   Zdeclare_env_globalrF   )r+   Zenvnamer$   r$   r%   emit_environment_object   s    z!BaseLower.emit_environment_objectc             C   s   |    | jd kr&d | _| | j nB| | | _| jj| _| j|  | j|  | jj	rh| j
|  tjrtd| j dd t| j td | jjr| jd krtj| j| j| jd | j| j| j | j| j d S )NzLLVM DUMP %sP   -zP================================================================================)rU   r"   )ri   rL   genlowerlower_normal_functionr"   GeneratorLowergentypeZlower_init_funcZlower_next_funcZhas_finalizerZlower_finalize_funcr   Z	DUMP_LLVMprintcenterrF   rU   
enable_nrtr   Zremove_unnecessary_nrt_usager]   Zpost_loweringrH   Zadd_ir_module)r+   r$   r$   r%   lower   s(    



zBaseLower.lowerc             C   s    | j | j| jj| j| _| jS )N)rK   Zdecode_argumentsrZ   r"   argtypesr]   fnargs)r+   r$   r$   r%   extract_function_arguments   s    

z$BaseLower.extract_function_argumentsc             C   s>   |  | |   |  }| j| | j| j| j  dS )z/
        Lower non-generator *fndesc*.
        N)setup_functionrv   lower_function_bodyrZ   position_at_endbranchrO   rS   )r+   r"   entry_block_tailr$   r$   r%   rm      s
    
zBaseLower.lower_normal_functionc             C   s   x(| j D ]}d| }| j|| j|< qW |   | jj}| d| j	j
 x:t| j  D ](\}}| j| }| j| | | q^W |   |S )zP
        Lower the current function's body, and return the entry block.
        zB%sz# function begin: {0})rI   r]   append_basic_blockrO   r`   rZ   Zbasic_blockdebug_printformatr"   rN   sorteditemsry   lower_blockrb   )r+   offsetZbnamer{   rc   Zbbr$   r$   r%   rx      s    
zBaseLower.lower_function_bodyc          
   C   s\   |  | xL|jD ]B}|j| _tt| jd}td|| j|d | | W dQ R X qW dS )z(
        Lower the given block.
        )rT   zlowering "{inst}" at {loc})r#   rT   Zerrcls_N)rd   ZbodyrT   r   r   r   
lower_inst)r+   rc   r#   Zdefaulterrclsr$   r$   r%   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)rl   rU   create_cpython_wrapperrH   Zgendescr@   call_helperr"   )r+   r   r$   r$   r%   r     s    
z BaseLower.create_cpython_wrapperc             C   s@   | j | j|| _| jd| _t| j| _| j	| j| _
d S )Nentry)rU   Zdeclare_functionrF   r]   r|   Zentry_blockr
   rZ   rK   Zinit_call_helperr   )r+   r"   r$   r$   r%   rw     s    zBaseLower.setup_functionc             C   s   | j j| S )N)r"   Ztypemap)r+   Zvarnamer$   r$   r%   typeof  s    zBaseLower.typeofc             C   s    t jr| j| jd| d S )NzDEBUGJIT: {0})r   Z	DEBUG_JITrU   r}   rZ   r~   )r+   msgr$   r$   r%   r}     s    zBaseLower.debug_print)N)NN)F)r'   r4   r5   r6   rX   rW   r\   r`   rb   rd   rh   ri   rs   rv   rm   rx   r   r   rw   r   r}   r$   r$   r$   r%   rD   L   s$   
'
 
rD   c               @   s   e Zd Zej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'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5S )6Lowerc          	   C   s  | j | j| j | t| t|tjrZ| 	|j
j}| ||}| ||j
j nxt|tjr| |jj}| j|j }| j|j }| 	|jj}| j| j||tj}|jtdkstd|j | j||| nt|tjr| j|j
 }	| j|	 nt|tjr| j r2| j!"|  d S | |j#j}| 	|j#j}
| j$j%}t|tj&r|| j'(| j||
| d S ||
kr| j| j||
|}| j)| j||}| j'*| j| nt|tj+r| j$j,| }|d k	sty| j-d|}W n( t.k
r"   | /|j
|j0|j#|S X | |j
j}	| |j#j}| 	|j#j}| j| j|||j1d }|| j|	|j2|fS nRt|tj3r| 4| n6t|tj5r| j$j,| }|d k	st| /|j
|j2|j#|S t|tj6r| |j
j}	| |j2j}| 	|j
j}| 	|j2j}| j$j,| }|d k	s:tt7j8}| jj9:|}|;| jj9|j1i  | j-||}||j1d kst| j| j|||j1d }|| j|	|fS t|tj<r| =|j# nt|tj>rz| |j
j}	| |j#j}| j$j,| }| 	|j
j}| 	|j#j}|d k	s,t|j1d |ks@t| j?|j@|}| j| j|||j1d }|| j|	|fS t|tjAr| B| n>x0tCD D ]$\}}t||r|| | d S qW t.t|d S )Nr   zcond is not i1: %sZstatic_setitem   r   )Er   Zmark_locationrZ   rT   r}   str
isinstancer   ZAssignr   targetr^   lower_assignstorevarZBranchloadvarcondrO   ZtruebrZfalsebrrU   castr   booleantyper	   intAssertionErrorZcbranchZJumprz   ZReturnrL   rl   Zreturn_from_generatorvaluer"   ZrestypeOptionalrK   Zreturn_optional_valueget_return_valuereturn_valueZStaticSetItem	calltypesget_functionNotImplementedErrorlower_setitem	index_varargsrC   ZPrintlower_printZSetItemZDelItemoperatordelitemtyping_contextresolve_value_typeget_call_typeZDeldelvarZSetAttrZget_setattrattrZStaticRaiselower_static_raiselower_extensionsr   )r+   r#   tyvalr   ZtrZflZcondtyZpredr   otyretval	signatureimplr   valuetyrC   targettyindextyopfnopZ_classfuncr$   r$   r%   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r| j| j|||j}n||j	d kst| j| j||
|j	d }| j| j||	|j	d }|| j|||fS )Nr   r   r   )r   r^   r   r   setitemrU   r   r   r   r   r   r   r   r   r   rZ   r   r   )r+   Z
target_varr   Z	value_varr   r   r   rC   r   r   r   r   r   r   r$   r$   r%   r     s&    
zLower.lower_setitemc             C   s6   |j d kr| jd | jd n| j|j |j| jd d S )N)rT   )rf   rh   rT   rg   )r+   r#   r$   r$   r%   r     s    
zLower.lower_static_raisec             C   st  |j }t|tjtjtjfr@| j| j||j }| 	|| |S t|tj
rX| ||S t|tjr| |j}| |j}| j| j|||}| 	|| |S t|tjr8| d|j }t|tjr|j }| jj|}	| j| j|	|}
| j| j|
|	|}n | j|j }| j| j|||}| 	|| |S t|tjrb| ||}| 	|| |S tt||d S )Nzarg.)r   r   r   ZConstZGlobalZFreeVarrU   get_constant_genericrZ   increfZExpr
lower_exprZVarr   r^   r   r   ZArgr   Omittedr   r   ru   rC   ZYieldlower_yieldr   r   )r+   r   r#   r   resr   r   ZargtypyvalZvaltyZconstr$   r$   r%   r     s>    zLower.lower_assignc       	      C   s   | j j|j }|j|kstt| ||j}|  | 	|j
j}| |j
j}| j| j||| jj}| j| j||}| j| j| |  | j| j|d S )N)rL   Zyield_pointsrC   r#   r   r   Z
LowerYieldZ	live_varsZlower_yield_suspendr   r   r^   r   rU   r   rZ   ro   
yield_typer   rK   r   Zlower_yield_resumer   )	r+   Zrettyr#   Zypyr   typZyretr   r$   r$   r%   r     s    
zLower.lower_yieldc                sj  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 k	r|
|S |t||	f||f}|d k	r|
|S ||t|f||f}|d k	r0|
|S  j jji }j  |}|j||f}|
|S )Nr   r   c                s   j j| j S )N)rU   r   rZ   return_type)r   )restyr+   r   r$   r%   cast_result  s    z&Lower.lower_binop.<locals>.cast_resultc                s   t dd |D rd S y6t tjr8 jj| i }ntjj	f|  }W n t
k
r`   d S X yj |}|j|S  tk
r   d S X d S )Nc             s   s   | ]}|t jkV  qd S )N)r   Z	UNDEFINED).0ar$   r$   r%   	<genexpr>  s    z=Lower.lower_binop.<locals>.try_static_impl.<locals>.<genexpr>)anyr   r   ZFunctionr   rU   r   r   r   r   r   r   rZ   r   )Ztysr   Z
static_sigZstatic_impl)r   r+   r   r$   r%   try_static_impl  s    z*Lower.lower_binop.<locals>.try_static_impl)rU   r   r   lhsrhs
static_lhs
static_rhsr   r^   r   r"   r   r   rZ   r   _lit_or_omittedr   r   )r+   r   exprr   r   r   r   r   ltyZrtyr   r   r   sigr   r$   )r   r   r+   r   r%   lower_binop   sB    






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 r$   )rU   r   rZ   )r   avZatZft)r+   r$   r%   
<listcomp>P  s   z'Lower.lower_getitem.<locals>.<listcomp>)r   r^   r   getitemrU   r   r   r   r   r   r   ziprZ   r   r   )r+   r   r   r   rC   r   ZbasevalZindexvalr   r   r   argvalsZargtypscastvalsr   r$   )r+   r%   lower_getitemD  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   rA   r   rB   r^   rC   rZ   Zextract_valuer   rU   r   )r+   varr   Zvartyr   r$   r$   r%   	_cast_varX  s    

zLower._cast_varc                s   r>  j}t|tjs t|fddtt|D  }j}|d krz|r^t	d|f  fddt
|jD }nB fdd}	 fdd}
 fd	d
}t||t||	|
|}|S )Nc                s   g | ]}t  |qS r$   )rA   )r   i)rB   r$   r%   r   l  s   z(Lower.fold_call_args.<locals>.<listcomp>z-unsupported keyword arguments when calling %sc                s   g | ]\}}  ||qS r$   )r   )r   r   sigty)r+   r$   r%   r   u  s   c                s     |j|  S )N)r   r   )rC   paramr   )r+   r   r$   r%   normal_handlerx  s    z,Lower.fold_call_args.<locals>.normal_handlerc                s    j  jj|  |S )N)rU   r   rZ   r   )rC   r   default)r+   r   r$   r%   default_handler{  s    z-Lower.fold_call_args.<locals>.default_handlerc                sD   j |  }t|tjst| fddt||D }t j|S )Nc                s   g | ]\}}  ||qS r$   )r   )r   r   r   )r+   r$   r%   r     s   zALower.fold_call_args.<locals>.stararg_handler.<locals>.<listcomp>)	r   r   r   	BaseTupler   r   r   Zmake_anonymous_structrZ   )rC   r   varsZ
stararg_tyvalues)r+   r   r$   r%   stararg_handler  s
    

z-Lower.fold_call_args.<locals>.stararg_handler)r   r^   r   r   r   r   ranger1   pysigr   r   r   r   Zfold_argumentsdict)r+   fntyr   pos_argsrB   Zkw_argsZ	tp_varargr   r   r   r   r   r$   )r+   r   rB   r%   fold_call_argsf  s*    

zLower.fold_call_argsc             C   s   | j j| }|jtjkst| jjt	}t
|j}t
|j}x@tt|D ]0}||jkrL|j| }t|trLt|||< qLW tj|jf| }|j|_| ||||ji }	| jt	|}
|
| j|	 dS )z$
        Lower a ir.Print()
        N)r"   r   r   r   Znoner   rU   r   r   rp   listr   r   r1   r*   r   r   literalr   r   r   r   rB   r   rZ   )r+   r#   r   r   Zpos_tysr   r   r   Z	fixed_sigr   r   r$   r$   r%   r     s    




zLower.lower_printc             C   s  | j j| }| d| t|jtjr4| j	 S t|j
tjrL|j
j}n| |j
j}t|tjrv| |||}nbt|tjr| |||}nFt|tjr| |||}n*t|tjr| |||}n| |||}|d k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)r   rT   )r"   r   r}   r~   r   r   r   ZPhantomrU   get_dummy_valuer   r   	Intrinsicr^   r   ObjModeDispatcher_lower_call_ObjModeDispatcherZExternalFunction_lower_call_ExternalFunctionZExternalFunctionPointer#_lower_call_ExternalFunctionPointerZRecursiveCall_lower_call_RecursiveCall_lower_call_normalZvoidr   rT   r   rZ   )r+   r   r   r   r   r   r$   r$   r%   
lower_call  s0    



zLower.lower_callc                s       j }dd |jD } fdd|D } fdd|D }x"t||D ]\}}	 |	| qRW  fddt||D }
|jt|} j	j
 jt|dd} j||
}t j|} j|\}}|: x|
D ]} j| qW  j|  j j W d Q R X |  j|jj|}|j} j| x|
D ]} j| qLW t|jrv|   j|  j|j  j j W d Q R X |S Q R X W d Q R X d S )Nc             S   s   g | ]
}|j qS r$   )r^   )r   r   r$   r$   r%   r     s    z7Lower._lower_call_ObjModeDispatcher.<locals>.<listcomp>c                s   g | ]}  |qS r$   )r   )r   r   )r+   r$   r%   r     s    c                s   g | ]}  |qS r$   )r   )r   r   )r+   r$   r%   r     s    c                s"   g | ]\}} j || jqS r$   )rY   from_native_valuer[   )r   Zatypaval)r+   r$   r%   r     s   Zwith_objectmode)info)r\   rY   
gil_ensurer   r   r   Z
dispatchercompiletuplerU   Zadd_dynamic_addrrZ   idZcall_function_objargsr   Zis_nullZif_elsedecrefgil_releaserK   Z
return_excZto_native_valueZoutput_typesr   callableZcleanupZif_thenZis_error)r+   r   r   r   	gil_stateZargnamesrt   Z	argvaluesvr   ZargobjsZentry_ptZcalleeZret_objZhas_exceptionZthenZorelseobjZnativeoutputr$   )r+   r%   r     sH    



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   r   rB   kwsr   ZExternalFunctionDescriptorZsymbolr   r   rU   Zdeclare_external_functionrZ   rF   Zcall_external_functionrt   )r+   r   r   r   r   r"   r   r$   r$   r%   r     s    
z"Lower._lower_call_ExternalFunctionc             C   s  |  d | |||j|j|j}| |jj}|jr| 	  | j
 }g }g }xht|jj|j|D ]R\}	}
}|	tjkr| |
| | j
|
|| j}|| || qd|| qdW | j| j|||j}x|D ]}| j
| qW | j
| n| j| j|||j}|S )Nz## calling external function pointer)r}   r   r   rB   r  r   r   r^   Zrequires_gilr\   rY   r   r   r   r   Zffi_forced_objectr   r   r[   r/   rU   Zcall_function_pointerrZ   Zcconvr   r   )r+   r   r   r   r   Zpointerr  Z
newargvalsZpyvalsZexptypZgottypr   r  r   r$   r$   r%   r   "  s4    




z)Lower._lower_call_ExternalFunctionPointerc       	      C   s|   |  |||j|j|j}|j|j }| jjp.t}|||j}| jj	j
|rd| j| j| j||}n| j| j|||}|S )N)r   r   rB   r  Z	overloadsrU   manglerr   rZ   r]   r^   
startswithZcall_internalr"   Zcall_unresolved)	r+   r   r   r   r   Z
qualprefixr  Zmangled_namer   r$   r$   r%   r   O  s    zLower._lower_call_RecursiveCallc             C   s   |  d| |  d| t|jtjs:t|tjrD|jj}n| 	|||j|j
|j}| j||}|jr| |jj}|gt| }|| j|| j}|S )Nz# calling normal function: {0}z# signature: {0})r}   r~   r   r   r   r   r   r   r   r   rB   r  rU   r   Zrecvrr   r^   r   rZ   rT   )r+   r   r   r   r   r   Zthe_selfr   r$   r$   r%   r   b  s    
zLower._lower_call_normalc          
      sB  |j dkr ||jS |j dkr\|jj}|jrH ||jS  ||jS n|j dkr|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rF|j	j}|j	j}	jj||	} | |S |j dkr|j	j}|j	j}	jj||	} | |S |j dk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rjjj||	|	j}|	j}	t|	tjr|	 kst|	| |S |	jj}j }t|tj }t!"|	j|	}jd
|}t!"||	j}jd|}|j|f}xt#|j$D ]z}|j|f}jj||}t%&jj'| j(t)j*d W d Q R X jj||}j+|||}q
W |j|f}jj||}t%&j| j(t)j*d W d Q R X ,|	j| |S |j dkr|j	j}|j	j}	t tj-rTjj||	 j.}j/j| j.} | |S j0|	|j1}jj23|	|j1}|d krj4 S |jj|	||j1}jj|| }|S nz|j dkrXt!" |j	jt5|j6}y*jd|}|j|j	j|j6fS  t7k
rR   |j8d kr0 j
j| }9 ||j	|j8|S X n|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rVfdd|j:D }fdd|j:D } 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	j}|j	j}	jj||	 } | |S |j jj?kr6jj?|j  |}|S t7|d S )NZbinopZinplace_binopZunaryr   Zcall
pair_firstpair_second)getiteriternextZexhaust_iterr  r  )rT   getattrZstatic_getitemr   Zbuild_tuplec                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r     s    z$Lower.lower_expr.<locals>.<listcomp>c                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r     s    c                s&   g | ]\}}} j  j|||qS r$   )rU   r   rZ   )r   r   Ztotyfromty)r+   r$   r%   r     s   
build_listc                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r     s    c                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r     s    c                s&   g | ]\}}j j|| jqS r$   )rU   r   rZ   dtype)r   r   r  )r   r+   r$   r%   r     s   	build_setrE   c                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r   %  s    c                s   g | ]}  |jqS r$   )r   r^   )r   r   )r+   r$   r%   r   &  s    c                s&   g | ]\}}j j|| jqS r$   )rU   r   rZ   r  )r   r   r  )r   r+   r$   r%   r   '  s   r   )@r   r   fnr   r   r^   ZmutableZimmutable_fnr   r   r"   r   rU   r   r   rZ   r   r   r   r	  r   r
  r   r   r   r   r   r   Ziterator_typer   Zget_constant_undefZPairr   r   r   r   countr   Zif_unlikelynot_rh   
ValueErrorrT   Zinsert_valuer   ZBoundFunctionthisZget_bound_functionZget_getattrr   r   Zresolve_getattrr   r   rC   r   r   r   r   r   Z
make_tupler  r  Zspecial_ops)r+   r   r   r   r   r   r   r   r   r   ZftyZcastvalZitemtytupZpairtyZgetiter_sigZgetiter_implZiternext_sigZiternext_implZiterobjr   ZpairZis_validitemZcastedZattrtyZitemvalsZitemtysr   r   r$   )r   r+   r%   r   x  s$   










zLower.lower_exprc             C   s0   || j kr,| j|}| ||}|| j |< dS )zH
        Ensure the given variable has an allocated stack slot.
        N)rP   rU   get_value_typealloca_lltype)r+   r^   fetypeZlltyptrr$   r$   r%   _alloca_var8  s    
zLower._alloca_varc             C   s
   | j | S )z=
        Get a pointer to the given variable's slot.
        )rP   )r+   r^   r$   r$   r%   getvarC  s    zLower.getvarc             C   s   |  |}| j|S )z2
        Load the given variable's value.
        )r  rZ   load)r+   r^   r  r$   r$   r%   r   I  s    
zLower.loadvarc             C   sp   |  |}| || | |}| || | |}|j|jjkr^dj||||d}t|| j	
|| dS )z:
        Store the value into the given variable.
        zNStoring {value.type} to ptr of {ptr.type.pointee} ('{name}'). FE type {fetype})r   r  r  r^   N)r   r  r   r   r  r   pointeer~   r   rZ   store)r+   r   r^   r  oldr  r   r$   r$   r%   r   P  s    



zLower.storevarc             C   sP   |  |}| || | |}| || j| | jt|j	j
| dS )z,
        Delete the given variable.
        N)r   r  r  r   rZ   r  r!  r   Znullr   r   )r+   r^   r  r  r$   r$   r%   r   g  s
    

zLower.delvarc             C   s   | j |}| ||S )N)rU   r  r  )r+   r^   r   lltyper$   r$   r%   allocav  s    zLower.allocac             C   sP   | d }tj| j||dd}|rL| j|}| jj| j||||| jd |S )N$T)r^   zfill)r^   r#  sizerT   )	r  r   Zalloca_oncerZ   rU   Zget_abi_sizeofr   Zmark_variablerT   )r+   r^   r#  Z
is_uservarZaptrZsizeofr$   r$   r%   r  z  s    
zLower.alloca_lltypec             C   s$   | j jsd S | j j| j|| d S )N)rU   rr   nrtr   rZ   )r+   r   r   r$   r$   r%   r     s    zLower.increfc             C   s$   | j jsd S | j j| j|| d S )N)rU   rr   r(  r   rZ   )r+   r   r   r$   r$   r%   r     s    zLower.decrefN)r'   r4   r5   r   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r$  r  r   r   r$   r$   r$   r%   r   $  s8   r,D')A- Ar   c             C   s*   y
t | S  tk
r$   t | S X dS )zjReturns a Literal instance if the type of value is supported;
    otherwise, return `Omitted(value)`.
    N)r   r   r   r   )r   r$   r$   r%   r     s    
r   ),Z
__future__r   r   r   r8   r0   collectionsr   r   r   	functoolsr   Zllvmlite.llvmpy.corer   r	   r
   r<   r   r   r   r   r   r   r   r   r   errorsr   r   r   r   Ztargetsr   r   r   r   r.   r(   rA   objectrD   r   r   r   r$   r$   r$   r%   <module>   s4   ,(

 V      v