U
    ,‰d"q  ã                   @   s€   d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ G dd„ deƒZ	G dd„ deƒZ
G d	d
„ d
eƒZG dd„ deƒZdS )é    N)Úpprint)ÚUnsupportedError)ÚLocc                   @   sf  e Zd Z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.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dLdM„ Z)dNdO„ Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dVdW„ Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2d`da„ Z3dbdc„ Z4ddde„ Z5dfdg„ Z6e6Z7e6Z8e6Z9e6Z:dhdi„ Z;e;Z<e;Z=e;Z>e;Z?e;Z@e;ZAe;ZBe;ZCe;ZDe;ZEe;ZFe;ZGe;ZHe;ZIe;ZJe;ZKe;ZLe;ZMe;ZNe;ZOe;ZPe;ZQe;ZRe;ZSe;ZTe;ZUe;ZVe;ZWe;ZXe;ZYe;ZZdjdk„ Z[dldm„ Z\dndo„ Z]dpdq„ Z^drds„ Z_dtdu„ Z`dvdw„ Zadxdy„ Zbdzd{„ Zcd|d}„ Zdd~d„ Zed€d„ Zfd‚dƒ„ Zgd„d…„ Zhd†d‡„ Zidˆd‰„ ZjdŠd‹„ ZkekZlejZmdŒd„ ZndŽd„ Zodd‘„ Zpd’d“„ Zqd”d•„ Zrd–d—„ Zsd˜d™„ Ztdšd›„ Zudœd„ ZvdždŸ„ Zwd d¡„ Zxd¢d£„ Zyd¤d¥„ Zzd´d§d¨„Z{d©dª„ Z|d«d¬„ Z}d­d®„ Z~d¯d°„ Zd±d²„ Z€d³S )µÚDataFlowAnalysisz¥
    Perform stack2reg

    This is necessary to resolve blocks that propagates stack value.
    This would allow the use of `and` and `or` and python2.6 jumps.
    c                 C   s   || _ |j| _i | _i | _d S ©N)ÚcfaÚbytecodeÚinfosÚedge_process)Úselfr   © r   ú7/tmp/pip-unpacked-wheel-eu7e0c37/numba/core/dataflow.pyÚ__init__   s    zDataFlowAnalysis.__init__c                 C   s&   | j  ¡ D ]}|  |¡| j|j< q
d S r   )r   ZiterliveblocksÚrun_on_blockr	   Úoffset©r   Úblkr   r   r   Úrun   s    zDataFlowAnalysis.runc                 C   s‚  g }t ||j|ƒ}g }| j |¡D ]\}}|j|jkr:q"| j|j }| |¡ |j|jf| jkrz| | j|j|jf ¡ |jd k	sŒt|ƒ‚|j|j	 | }|dk r°t
d| ƒ‚|jd krÂ||_n|j|krÜt d| t¡ |jd k	sît|ƒ‚|jd kr|jd d … |_q"|j|jkr"t d| t¡ q"|jd krBd|_g |_d|_	|D ]}||ƒ qL|D ]}	| j|	 }
|  ||
¡ q`|S )Nr   z%computed negative stack offset for %sz inconsistent stack offset for %sz'inconsistent entry syntax blocks for %s)Ú	BlockInfor   r   Úincoming_blocksr	   Úappendr
   Ústack_offsetÚAssertionErrorÚstack_effectÚRuntimeErrorÚwarningsÚwarnÚRuntimeWarningÚsyntax_blocksr   Údispatch)r   r   r   ÚinfoZedge_callbacksÚibZpopsZ
new_offsetÚcallbackr   Úinstr   r   r   r      sN    
ÿ


ÿ
ÿ
zDataFlowAnalysis.run_on_blockc                 C   s   | j  ¡ D ]}| ¡  q
d S r   )r	   ÚvaluesÚdumpr   r   r   r   r%   P   s    zDataFlowAnalysis.dumpc                 C   s.   d|j  dd¡ }t| || jƒ}|||ƒ d S )Nzop_%sú+Ú_)ÚopnameÚreplaceÚgetattrÚhandle_unknown_opcode)r   r    r#   ÚfnameÚfnr   r   r   r   T   s    zDataFlowAnalysis.dispatchc                 C   s(   t d |j¡t| jjj|jdd‚d S )NzUse of unknown opcode '{}'©ÚfilenameÚline©Úloc)r   Úformatr(   r   r   Úfunc_idr/   Úlineno©r   r    r#   r   r   r   r+   Y   s    

ÿþz&DataFlowAnalysis.handle_unknown_opcodec                    sp   ‡ fdd„t |ƒD ƒ}| ¡  ‡ fdd„t |ƒD ƒ}ˆ j|||d |D ]}ˆ  |¡ qH|D ]}ˆ  |¡ q\d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   ©Úpop©Ú.0r'   ©r    r   r   Ú
<listcomp>a   s     z-DataFlowAnalysis.dup_topx.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   ©Ú	make_tempr9   r;   r   r   r<   e   s     )ÚorigÚduped)ÚrangeÚreverser   Úpush)r   r    r#   Úcountr?   r@   Úvalr   r;   r   Údup_topx`   s    zDataFlowAnalysis.dup_topxc                 C   s   |j |_ |j |¡ dS )z,
        Add an inner syntax block.
        N)r   r   r   ©r   r    Úblockr   r   r   Úadd_syntax_blockl   s    z!DataFlowAnalysis.add_syntax_blockc                 C   s>   |j  ¡ }|j|jkst‚|j|j |jkr:|jdd q|S )zM
        Pop the innermost syntax block and revert its stack effect.
        T©Údiscard)r   r8   r   r   r   rG   r   r   r   Úpop_syntax_blocks   s
    
z!DataFlowAnalysis.pop_syntax_blockc                 C   s   d S r   r   r6   r   r   r   Úop_NOP}   s    zDataFlowAnalysis.op_NOPc                 C   s6   |j }d|  krdks$n tdƒ‚|  |||¡ d S )Né   é   zInvalid DUP_TOPX count)Úargr   rF   )r   r    r#   rD   r   r   r   Úop_DUP_TOPX€   s    zDataFlowAnalysis.op_DUP_TOPXc                 C   s   | j ||dd d S )NrN   ©rD   ©rF   r6   r   r   r   Ú
op_DUP_TOP…   s    zDataFlowAnalysis.op_DUP_TOPc                 C   s   | j ||dd d S )Né   rR   rS   r6   r   r   r   Úop_DUP_TOP_TWOˆ   s    zDataFlowAnalysis.op_DUP_TOP_TWOc                 C   s(   |  ¡ }|  ¡ }| |¡ | |¡ d S r   ©r8   rC   )r   r    r#   ÚfirstÚsecondr   r   r   Ú
op_ROT_TWO‹   s    
zDataFlowAnalysis.op_ROT_TWOc                 C   s:   |  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ d S r   rW   )r   r    r#   rX   rY   Úthirdr   r   r   Úop_ROT_THREE‘   s    

zDataFlowAnalysis.op_ROT_THREEc                 C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ | |¡ d S r   rW   )r   r    r#   rX   rY   r[   Zforthr   r   r   Úop_ROT_FOUR™   s    


zDataFlowAnalysis.op_ROT_FOURc                    sZ   |j }ˆ  ¡ }‡ fdd„t|ƒD ƒ}ˆ  ¡ }ˆ j||||d t|ƒD ]}ˆ  |¡ qFd S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r=   r9   r;   r   r   r<   ¦   s     z7DataFlowAnalysis.op_UNPACK_SEQUENCE.<locals>.<listcomp>)ÚiterableÚstoresÚtupleobj)rP   r8   rA   r>   r   ÚreversedrC   )r   r    r#   rD   r^   r_   r`   Ústr   r;   r   Úop_UNPACK_SEQUENCE£   s    z#DataFlowAnalysis.op_UNPACK_SEQUENCEc                 C   sb   |j dkr*d}t|t| jjj|jdd‚| ¡ }| ¡ }| ¡ }|j	||||d | 
|¡ dS )aJ  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, str() is simply called on the value.
        Pops a value from stack and pushes results back.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-FORMAT_VALUE
        r   z*format spec in f-strings not supported yetr.   r1   )ÚvalueÚresÚstrvarN)rP   r   r   r   r4   r/   r5   r8   r>   r   rC   )r   r    r#   Úmsgrd   rf   re   r   r   r   Úop_FORMAT_VALUE¬   s    

ÿþz DataFlowAnalysis.op_FORMAT_VALUEc                    st   |j }tt‡ fdd„t|ƒD ƒƒƒ}|dkr8ˆ  ¡ g}n‡ fdd„t|d ƒD ƒ}ˆ j|||d ˆ  |d ¡ dS )	zú
        BUILD_STRING(count): Concatenates count strings from the stack and
        pushes the resulting string onto the stack.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-BUILD_STRING
        c                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   É   s     z4DataFlowAnalysis.op_BUILD_STRING.<locals>.<listcomp>r   c                    s   g | ]}ˆ   ¡ ‘qS r   r=   r9   r;   r   r   r<   Î   s     rN   )ÚstringsÚtmpséÿÿÿÿN©rP   Úlistra   rA   r>   r   rC   )r   r    r#   rD   ri   rj   r   r;   r   Úop_BUILD_STRINGÁ   s    z DataFlowAnalysis.op_BUILD_STRINGc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   Ô   s     z3DataFlowAnalysis.op_BUILD_TUPLE.<locals>.<listcomp>©Úitemsre   rl   )r   r    r#   rD   rp   Útupr   r;   r   Úop_BUILD_TUPLEÒ   s
    zDataFlowAnalysis.op_BUILD_TUPLEc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   Û   s     z2DataFlowAnalysis.op_BUILD_LIST.<locals>.<listcomp>ro   rl   )r   r    r#   rD   rp   Úlstr   r;   r   Úop_BUILD_LISTÙ   s
    zDataFlowAnalysis.op_BUILD_LISTc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)Útargetrd   Ú	appendvarre   ©r8   rP   Úpeekr>   r   )r   r    r#   rd   Úindexru   rv   re   r   r   r   Úop_LIST_APPENDà   s    
zDataFlowAnalysis.op_LIST_APPENDc           	      C   sj   |  ¡ }|j}g }t|ƒD ]$}| ¡ | ¡  }}| ||f¡ q|j||d d d… ||d | |¡ d S )Nrk   )rp   Úsizere   )r>   rP   rA   r8   r   rC   )	r   r    r#   ÚdctrD   rp   ÚiÚvÚkr   r   r   Úop_BUILD_MAPè   s    zDataFlowAnalysis.op_BUILD_MAPc           	      C   sJ   |  ¡ }|  ¡ }|j}| |¡}| ¡ }| ¡ }|j||||||d d S )N)ru   Úkeyrd   Ú
setitemvarre   rw   )	r   r    r#   r   rd   ry   ru   r‚   re   r   r   r   Ú
op_MAP_ADDó   s    
 ÿzDataFlowAnalysis.op_MAP_ADDc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<      s     z1DataFlowAnalysis.op_BUILD_SET.<locals>.<listcomp>ro   rl   )r   r    r#   rD   rp   re   r   r;   r   Úop_BUILD_SETý   s
    zDataFlowAnalysis.op_BUILD_SETc                 C   s   |j dd d S )NTrJ   r7   r6   r   r   r   Ú
op_POP_TOP  s    zDataFlowAnalysis.op_POP_TOPc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)ru   rd   ©r8   r   )r   r    r#   ru   rd   r   r   r   Úop_STORE_ATTR  s    zDataFlowAnalysis.op_STORE_ATTRc                 C   s   |  ¡ }|j||d d S )N)ru   r†   )r   r    r#   ru   r   r   r   Úop_DELETE_ATTR  s    zDataFlowAnalysis.op_DELETE_ATTRc                 C   s   |  ¡ }|j||d d S ©N)rd   r†   ©r   r    r#   rd   r   r   r   Úop_STORE_FAST  s    zDataFlowAnalysis.op_STORE_FASTc                 C   s,   |  ¡ }|  ¡ }|j}|j||||d d S )N)r|   r   rd   )r8   Útosr   )r   r    r#   r   rd   r|   r   r   r   Úop_STORE_MAP  s    zDataFlowAnalysis.op_STORE_MAPc                 C   s   |  ¡ }|j||d d S r‰   r†   rŠ   r   r   r   Úop_STORE_DEREF  s    zDataFlowAnalysis.op_STORE_DEREFc                 C   s4   | j j|j }| |¡}|j||d | |¡ d S ©N©re   )r   Úco_varnamesrP   r>   r   rC   )r   r    r#   Únamere   r   r   r   Úop_LOAD_FAST  s    
zDataFlowAnalysis.op_LOAD_FASTc                 C   s&   |  d¡}|j||d | |¡ d S )NÚconstr   ©r>   r   rC   ©r   r    r#   re   r   r   r   Úop_LOAD_CONST%  s    
zDataFlowAnalysis.op_LOAD_CONSTc                 C   s$   |  ¡ }|j||d | |¡ d S r   r•   r–   r   r   r   Úop_LOAD_GLOBAL*  s    zDataFlowAnalysis.op_LOAD_GLOBALc                 C   s$   |  ¡ }|j||d | |¡ d S r   r•   r–   r   r   r   Úop_LOAD_DEREF/  s    zDataFlowAnalysis.op_LOAD_DEREFc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)Úitemre   ©r8   r>   r   rC   )r   r    r#   rš   re   r   r   r   Úop_LOAD_ATTR4  s    zDataFlowAnalysis.op_LOAD_ATTRc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)ry   ru   re   r›   )r   r    r#   ry   ru   re   r   r   r   Úop_BINARY_SUBSCR:  s
    z!DataFlowAnalysis.op_BINARY_SUBSCRc                 C   s.   |  ¡ }|  ¡ }|  ¡ }|j||||d d S )N)ru   ry   rd   r†   )r   r    r#   ry   ru   rd   r   r   r   Úop_STORE_SUBSCRA  s    z DataFlowAnalysis.op_STORE_SUBSCRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)ru   ry   r†   )r   r    r#   ry   ru   r   r   r   Úop_DELETE_SUBSCRG  s    z!DataFlowAnalysis.op_DELETE_SUBSCRc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)rd   re   r›   )r   r    r#   rd   re   r   r   r   Úop_GET_ITERL  s    zDataFlowAnalysis.op_GET_ITERc                 C   s^   |j }| ¡ }| ¡ }| ¡ }|j|||||d | |¡ dd„ }|| j|jj| ¡ f< d S )N)ÚiteratorÚpairÚindvalÚpredc                 S   s   |   ¡  |   ¡  d S r   r7   r;   r   r   r   Úpop_infoZ  s    z.DataFlowAnalysis.op_FOR_ITER.<locals>.pop_info)rŒ   r>   r   rC   r
   rH   r   Zget_jump_target)r   r    r#   r¢   r£   r¤   r¥   r¦   r   r   r   Úop_FOR_ITERR  s    
zDataFlowAnalysis.op_FOR_ITERc                    sT   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   a  s     z5DataFlowAnalysis.op_CALL_FUNCTION.<locals>.<listcomp>)ÚfuncÚargsre   )rP   rm   ra   rA   r8   r>   r   rC   )r   r    r#   Únargr©   r¨   re   r   r;   r   Úop_CALL_FUNCTION_  s    z!DataFlowAnalysis.op_CALL_FUNCTIONc                    s^   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   k  s     z8DataFlowAnalysis.op_CALL_FUNCTION_KW.<locals>.<listcomp>)r¨   r©   Únamesre   )rP   r8   rm   ra   rA   r>   r   rC   )r   r    r#   rª   r¬   r©   r¨   re   r   r;   r   Úop_CALL_FUNCTION_KWh  s    z$DataFlowAnalysis.op_CALL_FUNCTION_KWc                 C   sN   |j d@ rd}t|ƒ‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ d S )NrN   z,CALL_FUNCTION_EX with **kwargs not supported)r¨   Úvarargre   )rP   ÚNotImplementedErrorr8   r>   r   rC   )r   r    r#   Úerrmsgr®   r¨   re   r   r   r   Úop_CALL_FUNCTION_EXr  s    
z$DataFlowAnalysis.op_CALL_FUNCTION_EXc                    s|   t t‡ fdd„t|jƒD ƒƒƒ}‡ fdd„tt|ƒd ƒD ƒ}t|ƒdk}|rXˆ  ¡ g}ˆ j||||d ˆ  |d ¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   ~  s     z8DataFlowAnalysis._build_tuple_unpack.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   r=   r9   r;   r   r   r<     s     rN   )ÚtuplesÚtempsÚ	is_assignrk   )rm   ra   rA   rP   Úlenr>   r   rC   )r   r    r#   r²   r³   r´   r   r;   r   Ú_build_tuple_unpack|  s     
z$DataFlowAnalysis._build_tuple_unpackc                 C   s   |   ||¡ d S r   ©r¶   r6   r   r   r   Úop_BUILD_TUPLE_UNPACK_WITH_CALLŠ  s    z0DataFlowAnalysis.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   s   |   ||¡ d S r   r·   r6   r   r   r   Úop_BUILD_TUPLE_UNPACKŽ  s    z&DataFlowAnalysis.op_BUILD_TUPLE_UNPACKc                    sj   ˆ   ¡ }tt‡ fdd„t|jƒD ƒƒƒ}‡ fdd„t|jƒD ƒ}ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r;   r   r   r<   “  s     z;DataFlowAnalysis.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   r=   r9   r;   r   r   r<   ”  s     )ÚkeysÚkeytmpsr$   re   )r8   rm   ra   rA   rP   r>   r   rC   )r   r    r#   rº   Úvalsr»   re   r   r;   r   Úop_BUILD_CONST_KEY_MAP‘  s     z'DataFlowAnalysis.op_BUILD_CONST_KEY_MAPc                 C   s:   t  dt¡ | ¡ }| ¡ }| ¡ }|j||||d d S )NzIPython2 style print partially supported.  Please use Python3 style print.)rš   Úprintvarre   )r   r   r   r8   r>   r   )r   r    r#   rš   r¾   re   r   r   r   Úop_PRINT_ITEM™  s    ÿzDataFlowAnalysis.op_PRINT_ITEMc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r¾   re   )r>   r   )r   r    r#   r¾   re   r   r   r   Úop_PRINT_NEWLINE¡  s    z!DataFlowAnalysis.op_PRINT_NEWLINEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r    r›   ©r   r    r#   rE   re   r   r   r   Ú_unaryop¦  s    zDataFlowAnalysis._unaryopc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)ÚlhsÚrhsre   r›   )r   r    r#   rÄ   rÃ   re   r   r   r   Ú	_binaryop±  s
    zDataFlowAnalysis._binaryopc                 C   sL   |  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j||||||d | |¡ dS )z
        TOS = TOS[:]
        )Úbasere   ÚslicevarÚindexvarÚnonevarNr›   )r   r    r#   rŒ   re   rÇ   rÈ   rÉ   r   r   r   Ú
op_SLICE_0Ü  s     ÿzDataFlowAnalysis.op_SLICE_0c           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[TOS:]
        )rÆ   Ústartre   rÇ   rÈ   rÉ   Nr›   ©	r   r    r#   rŒ   Útos1re   rÇ   rÈ   rÉ   r   r   r   Ú
op_SLICE_1é  s     ÿzDataFlowAnalysis.op_SLICE_1c           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[:TOS]
        )rÆ   Ústopre   rÇ   rÈ   rÉ   Nr›   rÌ   r   r   r   Ú
op_SLICE_2÷  s     ÿzDataFlowAnalysis.op_SLICE_2c           	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z&
        TOS = TOS2[TOS1:TOS]
        )rÆ   rË   rÏ   re   rÇ   rÈ   Nr›   )	r   r    r#   rŒ   rÍ   Útos2re   rÇ   rÈ   r   r   r   Ú
op_SLICE_3  s     ÿzDataFlowAnalysis.op_SLICE_3c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z
        TOS[:] = TOS1
        )rÆ   rd   rÇ   rÈ   rÉ   N©r8   r>   r   )r   r    r#   rŒ   rd   rÇ   rÈ   rÉ   r   r   r   Úop_STORE_SLICE_0  s     ÿz!DataFlowAnalysis.op_STORE_SLICE_0c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )rÆ   rË   rÇ   rd   rÈ   rÉ   NrÓ   ©	r   r    r#   rŒ   rÍ   rd   rÇ   rÈ   rÉ   r   r   r   Úop_STORE_SLICE_1  s      ÿz!DataFlowAnalysis.op_STORE_SLICE_1c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )rÆ   rÏ   rd   rÇ   rÈ   rÉ   NrÓ   rÕ   r   r   r   Úop_STORE_SLICE_2,  s     ÿz!DataFlowAnalysis.op_STORE_SLICE_2c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rÆ   rË   rÏ   rd   rÇ   rÈ   NrÓ   )	r   r    r#   rŒ   rÍ   rÑ   rd   rÇ   rÈ   r   r   r   Úop_STORE_SLICE_39  s     ÿz!DataFlowAnalysis.op_STORE_SLICE_3c                 C   s8   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d dS )z
        del TOS[:]
        )rÆ   rÇ   rÈ   rÉ   NrÓ   )r   r    r#   rŒ   rÇ   rÈ   rÉ   r   r   r   Úop_DELETE_SLICE_0F  s    
 ÿz"DataFlowAnalysis.op_DELETE_SLICE_0c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[TOS:]
        )rÆ   rË   rÇ   rÈ   rÉ   NrÓ   ©r   r    r#   rŒ   rÍ   rÇ   rÈ   rÉ   r   r   r   Úop_DELETE_SLICE_1Q  s     ÿz"DataFlowAnalysis.op_DELETE_SLICE_1c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[:TOS]
        )rÆ   rÏ   rÇ   rÈ   rÉ   NrÓ   rÚ   r   r   r   Úop_DELETE_SLICE_2]  s     ÿz"DataFlowAnalysis.op_DELETE_SLICE_2c                 C   sB   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )rÆ   rË   rÏ   rÇ   rÈ   NrÓ   )r   r    r#   rŒ   rÍ   rÑ   rÇ   rÈ   r   r   r   Úop_DELETE_SLICE_3i  s     ÿz"DataFlowAnalysis.op_DELETE_SLICE_3c                 C   s–   |j }|dkr,| ¡ }| ¡ }|}|}d}n6|dkrZ| ¡ }| ¡ }| ¡ }	|	}|}|}ntdƒ‚| ¡ }
| ¡ }|j||||||
d | |¡ dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
        rU   Né   Zunreachable)rË   rÏ   Ústepre   rÇ   )rP   r8   Ú	Exceptionr>   r   rC   )r   r    r#   ZargcrŒ   rÍ   rË   rÏ   rß   rÑ   rÇ   re   r   r   r   Úop_BUILD_SLICEu  s*    ÿzDataFlowAnalysis.op_BUILD_SLICEc                 C   s    |  ¡ }|j||d ||_d S ©N)r¥   ©r8   r   Ú
terminator©r   r    r#   r¥   r   r   r   Úop_POP_JUMP_IF_TRUE  s    z$DataFlowAnalysis.op_POP_JUMP_IF_TRUEc                 C   s    |  ¡ }|j||d ||_d S râ   rã   rå   r   r   r   Úop_POP_JUMP_IF_FALSE”  s    z%DataFlowAnalysis.op_POP_JUMP_IF_FALSEc                 C   s   |j }|j||d ||_d S râ   ©rŒ   r   rä   rå   r   r   r   Úop_JUMP_IF_TRUE™  s    z DataFlowAnalysis.op_JUMP_IF_TRUEc                 C   s   |j }|j||d ||_d S râ   rè   rå   r   r   r   Úop_JUMP_IF_FALSEž  s    z!DataFlowAnalysis.op_JUMP_IF_FALSEc                 C   s   |  |¡ ||_d S r   ©r   rä   r6   r   r   r   Úop_JUMP_ABSOLUTE¦  s    
z!DataFlowAnalysis.op_JUMP_ABSOLUTEc                 C   s   |  |¡ ||_d S r   rë   r6   r   r   r   Úop_JUMP_FORWARDª  s    
z DataFlowAnalysis.op_JUMP_FORWARDc                 C   s   |   |¡ | |¡ ||_d S r   )rL   r   rä   r6   r   r   r   Úop_BREAK_LOOP®  s    

zDataFlowAnalysis.op_BREAK_LOOPc                 C   s"   |j || ¡ | ¡ d ||_d S )N)ÚretvalZcastval)r   r8   r>   rä   r6   r   r   r   Úop_RETURN_VALUE³  s    z DataFlowAnalysis.op_RETURN_VALUEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r    r›   rÁ   r   r   r   Úop_YIELD_VALUE·  s    zDataFlowAnalysis.op_YIELD_VALUEc                 C   s   |   |tƒ ¡ | |¡ d S r   )rI   Ú	LoopBlockr   r6   r   r   r   Úop_SETUP_LOOP½  s    zDataFlowAnalysis.op_SETUP_LOOPc                 C   s:   |  ¡ }|  |tƒ ¡ | ¡ }| |¡ |j||d d S )N)Úcontextmanager)r8   rI   Ú	WithBlockr>   rC   r   )r   r    r#   ÚcmÚyieldedr   r   r   Úop_SETUP_WITHÁ  s
    
zDataFlowAnalysis.op_SETUP_WITHc                 C   s   |  ¡  | |¡ dS )z'
        Note: py2 only opcode
        Nr†   r6   r   r   r   Úop_WITH_CLEANUPÈ  s    z DataFlowAnalysis.op_WITH_CLEANUPc                 C   s   |  ¡  | |¡ d S r   r†   r6   r   r   r   Úop_WITH_CLEANUP_STARTÐ  s    z&DataFlowAnalysis.op_WITH_CLEANUP_STARTc                 C   s   |  |¡ d S r   ©r   r6   r   r   r   Úop_WITH_CLEANUP_FINISHÕ  s    z'DataFlowAnalysis.op_WITH_CLEANUP_FINISHc                 C   s   |  |¡ d S r   rû   r6   r   r   r   Úop_END_FINALLYØ  s    zDataFlowAnalysis.op_END_FINALLYc                 C   s   |   |¡}| |¡ d S r   )rL   r   )r   r    r#   rH   r   r   r   Úop_POP_BLOCKÛ  s    
zDataFlowAnalysis.op_POP_BLOCKc                 C   s>   |j dkrd }n|j dkr$| ¡ }ntdƒ‚|j||d d S )Nr   rN   z)Multiple argument raise is not supported.)Úexc)rP   r8   Ú
ValueErrorr   )r   r    r#   rÿ   r   r   r   Úop_RAISE_VARARGSß  s    


z!DataFlowAnalysis.op_RAISE_VARARGSFc              
   C   s˜   |  ¡ }|  ¡ }d  } } }}	|jd@ r2|  ¡ }|jd@ rD|  ¡ }|jd@ rV|  ¡ }|jd@ rh|  ¡ }	| ¡ }
|j|||||||	|
d | |
¡ d S )Né   é   rU   rN   )r’   ÚcodeÚclosureÚannotationsÚ
kwdefaultsÚdefaultsre   )r8   rP   r>   r   rC   )r   r    r#   ÚMAKE_CLOSUREr’   r  r  r  r  r  re   r   r   r   Úop_MAKE_FUNCTIONè  s$    



  ÿz!DataFlowAnalysis.op_MAKE_FUNCTIONc                 C   s   | j ||dd d S )NT)r	  )r
  r6   r   r   r   Úop_MAKE_CLOSUREù  s    z DataFlowAnalysis.op_MAKE_CLOSUREc                 C   s$   |  ¡ }|j||d | |¡ d S r   r•   r–   r   r   r   Úop_LOAD_CLOSUREü  s    z DataFlowAnalysis.op_LOAD_CLOSUREc                 O   s   | j ||Ž d S r   )rœ   ©r   r©   Úkwsr   r   r   Úop_LOAD_METHOD  s    zDataFlowAnalysis.op_LOAD_METHODc                 O   s   | j ||Ž d S r   )r«   r  r   r   r   Úop_CALL_METHOD  s    zDataFlowAnalysis.op_CALL_METHODc                 C   s   d S r   r   r6   r   r   r   Ú_ignored
  s    zDataFlowAnalysis._ignoredN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r%   r   r+   rF   rI   rL   rM   rQ   rT   rV   rZ   r\   r]   rc   rh   rn   rr   rt   rz   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Â   Zop_UNARY_NEGATIVEZop_UNARY_POSITIVEZop_UNARY_NOTZop_UNARY_INVERTrÅ   Zop_COMPARE_OPZop_IS_OPZop_CONTAINS_OPZop_INPLACE_ADDZop_INPLACE_SUBTRACTZop_INPLACE_MULTIPLYZop_INPLACE_DIVIDEZop_INPLACE_TRUE_DIVIDEZop_INPLACE_FLOOR_DIVIDEZop_INPLACE_MODULOZop_INPLACE_POWERZop_INPLACE_MATRIX_MULTIPLYZop_INPLACE_LSHIFTZop_INPLACE_RSHIFTZop_INPLACE_ANDZop_INPLACE_ORZop_INPLACE_XORZop_BINARY_ADDZop_BINARY_SUBTRACTZop_BINARY_MULTIPLYZop_BINARY_DIVIDEZop_BINARY_TRUE_DIVIDEZop_BINARY_FLOOR_DIVIDEZop_BINARY_MODULOZop_BINARY_POWERZop_BINARY_MATRIX_MULTIPLYZop_BINARY_LSHIFTZop_BINARY_RSHIFTZop_BINARY_ANDZop_BINARY_ORZop_BINARY_XORrÊ   rÎ   rÐ   rÒ   rÔ   rÖ   r×   rØ   rÙ   rÛ   rÜ   rÝ   rá   ræ   rç   ré   rê   Zop_JUMP_IF_FALSE_OR_POPZop_JUMP_IF_TRUE_OR_POPrì   rí   rî   rð   rñ   ró   rø   rù   rú   rü   rý   rþ   r  r
  r  r  r  r  r  r   r   r   r   r   
   sü   3

	
	

	
r   c                   @   s   e Zd ZdZdd„ ZdS )rò   ©r   c                 C   s
   d | _ d S r   r  ©r   r   r   r   r     s    zLoopBlock.__init__N©r  r  r  Ú	__slots__r   r   r   r   r   rò     s   rò   c                   @   s   e Zd ZdZdd„ ZdS )rõ   r  c                 C   s
   d | _ d S r   r  r  r   r   r   r     s    zWithBlock.__init__Nr  r   r   r   r   rõ     s   rõ   c                   @   s’   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ Zd dd„Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZdd„ Zedd„ ƒZejdd„ ƒZedd„ ƒZdS )!r   c                 C   sF   || _ || _|| _g | _i | _g | _d| _d | _d | _d| _	d | _
d S )Nr   )rH   r   r   ÚstackÚoutgoing_phisÚinstsÚtempctÚ_termr   r   r   )r   rH   r   r   r   r   r   r     s    zBlockInfo.__init__c                 C   s   d| j j| jf S )Nz<%s at offset %d>)Ú	__class__r  r   r  r   r   r   Ú__repr__.  s    zBlockInfo.__repr__c                 C   s:   t d| jdƒ t ddd t| jƒ t| jƒ t dƒ d S )Nr   Ú{z	  stack: Ú )ÚendÚ})Úprintr   r   r  r  r  r   r   r   r%   1  s
    

zBlockInfo.dumpr"  c                 C   s$   |  j d7  _ d|| j| j f }|S )NrN   z$%s%s.%s)r  r   )r   Úprefixr’   r   r   r   r>   8  s    zBlockInfo.make_tempc                 C   s   |  j d7  _ | j |¡ d S )NrN   )r   r  r   )r   rE   r   r   r   rC   =  s    zBlockInfo.pushFc                 C   s>   | j s"|  jd8  _|s:|  ¡ S n|  jd8  _| j  ¡ S dS )zþ
        Pop a variable from the stack, or request it from incoming blocks if
        the stack is empty.
        If *discard* is true, the variable isn't meant to be used anymore,
        which allows reducing the number of temporaries created.
        rN   N)r  r   Úmake_incomingr   r8   )r   rK   r   r   r   r8   A  s    
zBlockInfo.popc                    sJ   |}‡ fdd„t |ƒD ƒ}|d }t |d ddƒD ]}ˆ  || ¡ q2|S )zr
        Return the k'th element back from the top of the stack.
        peek(1) is the top of the stack.
        c                    s   g | ]}ˆ   ¡ ‘qS r   r7   r9   r  r   r   r<   V  s     z"BlockInfo.peek.<locals>.<listcomp>rk   rN   )rA   rC   )r   r   Znum_popsZtop_kÚrr}   r   r  r   rx   P  s    zBlockInfo.peekc                 C   s>   | j s
t‚|  d¡}| j D ]}| j| j }| | ||¡ q|S )z¶
        Create an incoming variable (due to not enough values being
        available on our stack) and request its assignment from our
        incoming blocks' own stacks.
        Úphi)r   r   r>   r   r   Úrequest_outgoing)r   Úretr!   Ústack_indexr   r   r   r'  \  s    


zBlockInfo.make_incomingc                 C   s\   || j krdS || jk r>| js"t‚| jD ]}| | ||¡ q(n| j|| j  }|| j |< dS )zŒ
        Request the assignment of the next available stack variable
        for block *outgoing_block* with target name *phiname*.
        N)r  r   r   r   r*  r  )r   Zoutgoing_blockZphinamer,  r!   Úvarnamer   r   r   r*  i  s    



zBlockInfo.request_outgoingc                 C   s   |   ¡ }|  |¡ |S r   rW   )r   r(  r   r   r   rŒ   z  s    
zBlockInfo.tosc                 K   s   | j  |j|f¡ d S r   )r  r   r   )r   r#   r  r   r   r   r   €  s    zBlockInfo.appendc                 C   s   | j d kst‚| j S r   )r  r   r  r   r   r   rä   ƒ  s    zBlockInfo.terminatorc                 C   s
   || _ d S r   )r  )r   r#   r   r   r   rä   ˆ  s    c                 C   s   dS )z;Try except not supported.

        See byteflow.py
        Nr   r  r   r   r   Úactive_try_blockŒ  s    zBlockInfo.active_try_blockN)r"  )F)r  r  r  r   r   r%   r>   rC   r8   rx   r'  r*  ÚpropertyrŒ   r   rä   Úsetterr.  r   r   r   r   r     s$   




r   )Úcollectionsr   Úsysr   Znumba.core.errorsr   Znumba.core.irr   Úobjectr   rò   rõ   r   r   r   r   r   Ú<module>   s         
