o
    8ήc"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 Zedd Zfdd Zgdd Zhdd Zidd Zjdd ZkekZlejZmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd ZzdddZ{dd Z|dd Z}dd Z~dd Zdd ZdS )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   :/tmp/pip-target-vg8gfxp4/lib/python/numba/core/dataflow.py__init__   s   
zDataFlowAnalysis.__init__c                 C   s&   | j  D ]}| || j|j< qd S r   )r   iterliveblocksrun_on_blockr	   offsetr   blkr   r   r   run   s   zDataFlowAnalysis.runc                 C   sx  g }t ||j|}g }| j|D ]\}}|j|jkrq| j|j }|| |j|jf| jv r<|| j|j|jf  |jd usEJ ||j|j | }|dk rWt	d| |jd u r`||_n|j|krmt
d| t |jd usvJ ||jd u r|jd d  |_q|j|jkrt
d| t q|jd u rd|_g |_d|_|D ]}|| q|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stack_effectRuntimeErrorwarningswarnRuntimeWarningsyntax_blocksr   dispatch)r   r   r   infoedge_callbacksibpops
new_offsetcallbackr   instr   r   r   r      sP   








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)NzUse of unknown opcode '{}'filenamelineloc)r   formatr+   r   r   func_idr2   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 ]} | q$|D ]} | q.d S )Nc                       g | ]}   qS r   pop.0r*   r    r   r   
<listcomp>a       z-DataFlowAnalysis.dup_topx.<locals>.<listcomp>c                    r:   r   	make_tempr=   r?   r   r   r@   e   rA   )origduped)rangereverser   push)r   r    r&   countrD   rE   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   sN   |j  }|j|jksJ |j|j |jkr%|jdd |j|j |jks|S )zM
        Pop the innermost syntax block and revert its stack effect.
        Tdiscard)r   r<   r   r   rL   r   r   r   pop_syntax_blocks   s   
z!DataFlowAnalysis.pop_syntax_blockc                 C      d S r   r   r9   r   r   r   op_NOP}      zDataFlowAnalysis.op_NOPc                 C   s<   |j }d|  krdksJ d J d| ||| d S )N      zInvalid DUP_TOPX count)argrK   )r   r    r&   rI   r   r   r   op_DUP_TOPX   s   $zDataFlowAnalysis.op_DUP_TOPXc                 C      | j ||dd d S )NrU   rI   rK   r9   r   r   r   
op_DUP_TOP      zDataFlowAnalysis.op_DUP_TOPc                 C   rY   )N   rZ   r[   r9   r   r   r   op_DUP_TOP_TWO   r]   zDataFlowAnalysis.op_DUP_TOP_TWOc                 C   s(   |  }|  }|| || d S r   r<   rH   )r   r    r&   firstsecondr   r   r   
op_ROT_TWO   s   
zDataFlowAnalysis.op_ROT_TWOc                 C   s:   |  }|  }|  }|| || || d S r   r`   )r   r    r&   ra   rb   thirdr   r   r   op_ROT_THREE   s   

zDataFlowAnalysis.op_ROT_THREEc                 C   sL   |  }|  }|  }|  }|| || || || d S r   r`   )r   r    r&   ra   rb   rd   forthr   r   r   op_ROT_FOUR   s   


zDataFlowAnalysis.op_ROT_FOURc                    sZ   |j }  } fddt|D }  } j||||d t|D ]} | q#d S )Nc                    r:   r   rB   r=   r?   r   r   r@      rA   z7DataFlowAnalysis.op_UNPACK_SEQUENCE.<locals>.<listcomp>)iterablestorestupleobj)rW   r<   rF   rC   r   reversedrH   )r   r    r&   rI   rh   ri   rj   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 yetr1   r4   )valueresstrvarN)rW   r   r   r   r7   r2   r8   r<   rC   r   rH   )r   r    r&   msgrn   rp   ro   r   r   r   op_FORMAT_VALUE   s   

z DataFlowAnalysis.op_FORMAT_VALUEc                    st   |j }tt fddt|D }|dkr  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                    r:   r   r;   r=   r?   r   r   r@      rA   z4DataFlowAnalysis.op_BUILD_STRING.<locals>.<listcomp>r   c                    r:   r   rB   r=   r?   r   r   r@      rA   rU   )stringstmpsNrW   listrk   rF   rC   r   rH   )r   r    r&   rI   rs   rt   r   r?   r   op_BUILD_STRING   s   z DataFlowAnalysis.op_BUILD_STRINGc                    J   |j }tt fddt|D }  } j|||d  | d S )Nc                    r:   r   r;   r=   r?   r   r   r@      rA   z3DataFlowAnalysis.op_BUILD_TUPLE.<locals>.<listcomp>itemsro   rv   )r   r    r&   rI   r{   tupr   r?   r   op_BUILD_TUPLE   
   zDataFlowAnalysis.op_BUILD_TUPLEc                    ry   )Nc                    r:   r   r;   r=   r?   r   r   r@      rA   z2DataFlowAnalysis.op_BUILD_LIST.<locals>.<listcomp>rz   rv   )r   r    r&   rI   r{   lstr   r?   r   op_BUILD_LIST   r~   zDataFlowAnalysis.op_BUILD_LISTc                 C   s@   |  }|j}||}| }| }|j|||||d d S )N)targetrn   	appendvarro   r<   rW   peekrC   r   )r   r    r&   rn   indexr   r   ro   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 )Nru   )r{   sizero   )rC   rW   rF   r<   r   rH   )	r   r    r&   dctrI   r{   ivkr   r   r   op_BUILD_MAP   s   zDataFlowAnalysis.op_BUILD_MAPc           	      C   sJ   |  }|  }|j}||}| }| }|j||||||d d S )N)r   keyrn   
setitemvarro   r   )	r   r    r&   r   rn   r   r   r   ro   r   r   r   
op_MAP_ADD   s   

zDataFlowAnalysis.op_MAP_ADDc                    ry   )Nc                    r:   r   r;   r=   r?   r   r   r@      rA   z1DataFlowAnalysis.op_BUILD_SET.<locals>.<listcomp>rz   rv   )r   r    r&   rI   r{   ro   r   r?   r   op_BUILD_SET   s
   zDataFlowAnalysis.op_BUILD_SETc                 C   s   |j dd d S )NTrO   r;   r9   r   r   r   
op_POP_TOP     zDataFlowAnalysis.op_POP_TOPc                 C   $   |  }|  }|j|||d d S )N)r   rn   r<   r   )r   r    r&   r   rn   r   r   r   op_STORE_ATTR     zDataFlowAnalysis.op_STORE_ATTRc                 C      |  }|j||d d S )N)r   r   )r   r    r&   r   r   r   r   op_DELETE_ATTR     zDataFlowAnalysis.op_DELETE_ATTRc                 C   r   N)rn   r   r   r    r&   rn   r   r   r   op_STORE_FAST  r   zDataFlowAnalysis.op_STORE_FASTc                 C   s,   |  }|  }|j}|j||||d d S )N)r   r   rn   )r<   tosr   )r   r    r&   r   rn   r   r   r   r   op_STORE_MAP  s   zDataFlowAnalysis.op_STORE_MAPc                 C   r   r   r   r   r   r   r   op_STORE_DEREF  r   zDataFlowAnalysis.op_STORE_DEREFc                 C   s4   | j j|j }||}|j||d || d S Nro   )r   co_varnamesrW   rC   r   rH   )r   r    r&   namero   r   r   r   op_LOAD_FAST  s   
zDataFlowAnalysis.op_LOAD_FASTc                 C   s&   | d}|j||d || d S )Nconstr   rC   r   rH   r   r    r&   ro   r   r   r   op_LOAD_CONST%  s   
zDataFlowAnalysis.op_LOAD_CONSTc                 C   $   |  }|j||d || d S r   r   r   r   r   r   op_LOAD_GLOBAL*     zDataFlowAnalysis.op_LOAD_GLOBALc                 C   r   r   r   r   r   r   r   op_LOAD_DEREF/  r   zDataFlowAnalysis.op_LOAD_DEREFc                 C   .   |  }| }|j|||d || d S )N)itemro   r<   rC   r   rH   )r   r    r&   r   ro   r   r   r   op_LOAD_ATTR4     zDataFlowAnalysis.op_LOAD_ATTRc                 C   s8   |  }|  }| }|j||||d || d S )N)r   r   ro   r   )r   r    r&   r   r   ro   r   r   r   op_BINARY_SUBSCR:  
   z!DataFlowAnalysis.op_BINARY_SUBSCRc                 C   s.   |  }|  }|  }|j||||d d S )N)r   r   rn   r   )r   r    r&   r   r   rn   r   r   r   op_STORE_SUBSCRA  s   z DataFlowAnalysis.op_STORE_SUBSCRc                 C   s$   |  }|  }|j|||d d S )N)r   r   r   )r   r    r&   r   r   r   r   r   op_DELETE_SUBSCRG  r   z!DataFlowAnalysis.op_DELETE_SUBSCRc                 C   r   N)rn   ro   r   )r   r    r&   rn   ro   r   r   r   op_GET_ITERL  r   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   r;   r?   r   r   r   pop_infoZ  s   z.DataFlowAnalysis.op_FOR_ITER.<locals>.pop_info)r   rC   r   rH   r
   rM   r   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                    r:   r   r;   r=   r?   r   r   r@   a  rA   z5DataFlowAnalysis.op_CALL_FUNCTION.<locals>.<listcomp>)funcargsro   )rW   rw   rk   rF   r<   rC   r   rH   )r   r    r&   nargr   r   ro   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                    r:   r   r;   r=   r?   r   r   r@   k  rA   z8DataFlowAnalysis.op_CALL_FUNCTION_KW.<locals>.<listcomp>)r   r   namesro   )rW   r<   rw   rk   rF   rC   r   rH   )r   r    r&   r   r   r   r   ro   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 )NrU   z,CALL_FUNCTION_EX with **kwargs not supported)r   varargro   )rW   NotImplementedErrorr<   rC   r   rH   )r   r    r&   errmsgr   r   ro   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}|r,  g} j||||d  |d  d S )Nc                    r:   r   r;   r=   r?   r   r   r@   ~  rA   z8DataFlowAnalysis._build_tuple_unpack.<locals>.<listcomp>c                    r:   r   rB   r=   r?   r   r   r@     rA   rU   )tuplestemps	is_assignru   )rw   rk   rF   rW   lenrC   r   rH   )r   r    r&   r   r   r   r   r?   r   _build_tuple_unpack|  s    
z$DataFlowAnalysis._build_tuple_unpackc                 C      |  || d S r   r   r9   r   r   r   op_BUILD_TUPLE_UNPACK_WITH_CALL  s   z0DataFlowAnalysis.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   r   r   r   r9   r   r   r   op_BUILD_TUPLE_UNPACK  r   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                    r:   r   r;   r=   r?   r   r   r@     rA   z;DataFlowAnalysis.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    r:   r   rB   r=   r?   r   r   r@     rA   )keyskeytmpsr'   ro   )r<   rw   rk   rF   rW   rC   r   rH   )r   r    r&   r   valsr   ro   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   printvarro   )r   r   r   r<   rC   r   )r   r    r&   r   r   ro   r   r   r   op_PRINT_ITEM  s   zDataFlowAnalysis.op_PRINT_ITEMc                 C   r   )N)r   ro   )rC   r   )r   r    r&   r   ro   r   r   r   op_PRINT_NEWLINE  r   z!DataFlowAnalysis.op_PRINT_NEWLINEc                 C   r   r   r   r   r    r&   rJ   ro   r   r   r   _unaryop  r   zDataFlowAnalysis._unaryopc                 C   s8   |  }|  }| }|j||||d || d S )N)lhsrhsro   r   )r   r    r&   r   r   ro   r   r   r   	_binaryop  r   zDataFlowAnalysis._binaryopc                 C   sL   |  }| }| }| }| }|j||||||d || dS )z
        TOS = TOS[:]
        )basero   slicevarindexvarnonevarNr   )r   r    r&   r   ro   r   r   r   r   r   r   
op_SLICE_0  s   zDataFlowAnalysis.op_SLICE_0c           	   	   C   V   |  }|  }| }| }| }| }|j|||||||d || dS )z"
        TOS = TOS1[TOS:]
        )r   startro   r   r   r   Nr   	r   r    r&   r   tos1ro   r   r   r   r   r   r   
op_SLICE_1     zDataFlowAnalysis.op_SLICE_1c           	   	   C   r   )z"
        TOS = TOS1[:TOS]
        )r   stopro   r   r   r   Nr   r   r   r   r   
op_SLICE_2  r   zDataFlowAnalysis.op_SLICE_2c           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || dS )z&
        TOS = TOS2[TOS1:TOS]
        )r   r   r   ro   r   r   Nr   )	r   r    r&   r   r   tos2ro   r   r   r   r   r   
op_SLICE_3  r   zDataFlowAnalysis.op_SLICE_3c                 C   sB   |  }|  }| }| }| }|j||||||d dS )z
        TOS[:] = TOS1
        )r   rn   r   r   r   Nr<   rC   r   )r   r    r&   r   rn   r   r   r   r   r   r   op_STORE_SLICE_0     
z!DataFlowAnalysis.op_STORE_SLICE_0c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )r   r   r   rn   r   r   Nr   	r   r    r&   r   r   rn   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   rn   r   r   r   Nr   r   r   r   r   op_STORE_SLICE_2,     
z!DataFlowAnalysis.op_STORE_SLICE_2c           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )r   r   r   rn   r   r   Nr   )	r   r    r&   r   r   r   rn   r   r   r   r   r   op_STORE_SLICE_39  r   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   B   |  }|  }| }| }| }|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  r   z"DataFlowAnalysis.op_DELETE_SLICE_1c                 C   r   )z 
        del TOS1[:TOS]
        )r   r   r   r   r   Nr   r   r   r   r   op_DELETE_SLICE_2]  r   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  r   z"DataFlowAnalysis.op_DELETE_SLICE_3c                 C   s   |j }|dkr| }| }|}|}d}n|dkr-| }| }| }	|	}|}|}ntd| }
| }|j||||||
d || dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
        r^   N   unreachable)r   r   stepro   r   )rW   r<   	ExceptionrC   r   rH   )r   r    r&   argcr   r   r   r   r   r   r   ro   r   r   r   op_BUILD_SLICEu  s*   zDataFlowAnalysis.op_BUILD_SLICEc                 C       |  }|j||d ||_d S N)r   r<   r   
terminatorr   r    r&   r   r   r   r   op_POP_JUMP_IF_TRUE     
z$DataFlowAnalysis.op_POP_JUMP_IF_TRUEc                 C   r  r  r  r  r   r   r   op_POP_JUMP_IF_FALSE  r  z%DataFlowAnalysis.op_POP_JUMP_IF_FALSEc                 C      |j }|j||d ||_d S r  r   r   r  r  r   r   r   op_JUMP_IF_TRUE     
z DataFlowAnalysis.op_JUMP_IF_TRUEc                 C   r	  r  r
  r  r   r   r   op_JUMP_IF_FALSE  r  z!DataFlowAnalysis.op_JUMP_IF_FALSEc                 C      | | ||_d S r   r   r  r9   r   r   r   op_JUMP_ABSOLUTE     

z!DataFlowAnalysis.op_JUMP_ABSOLUTEc                 C   r  r   r  r9   r   r   r   op_JUMP_FORWARD  r  z DataFlowAnalysis.op_JUMP_FORWARDc                 C   s   |  | || ||_d S r   )rQ   r   r  r9   r   r   r   op_BREAK_LOOP  s   


zDataFlowAnalysis.op_BREAK_LOOPc                 C   s"   |j || | d ||_d S )N)retvalcastval)r   r<   rC   r  r9   r   r   r   op_RETURN_VALUE  s   
z DataFlowAnalysis.op_RETURN_VALUEc                 C   r   r   r   r   r   r   r   op_YIELD_VALUE  r   zDataFlowAnalysis.op_YIELD_VALUEc                 C   s   |  |t  || d S r   )rN   	LoopBlockr   r9   r   r   r   op_SETUP_LOOP  s   zDataFlowAnalysis.op_SETUP_LOOPc                 C   s:   |  }| |t  | }|| |j||d d S )N)contextmanager)r<   rN   	WithBlockrC   rH   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   r9   r   r   r   op_WITH_CLEANUP  s   z DataFlowAnalysis.op_WITH_CLEANUPc                 C   s   |   || d S r   r   r9   r   r   r   op_WITH_CLEANUP_START  s   z&DataFlowAnalysis.op_WITH_CLEANUP_STARTc                 C      | | d S r   r   r9   r   r   r   op_WITH_CLEANUP_FINISH     z'DataFlowAnalysis.op_WITH_CLEANUP_FINISHc                 C   r!  r   r"  r9   r   r   r   op_END_FINALLY  r$  zDataFlowAnalysis.op_END_FINALLYc                 C   s   |  |}|| d S r   )rQ   r   )r   r    r&   rM   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   rU   z)Multiple argument raise is not supported.)exc)rW   r<   
ValueErrorr   )r   r    r&   r'  r   r   r   op_RAISE_VARARGS  s   


z!DataFlowAnalysis.op_RAISE_VARARGSFc              
   C   s   |  }|  }d  } } }}	|jd@ r|  }|jd@ r"|  }|jd@ r+|  }|jd@ r4|  }	| }
|j|||||||	|
d ||
 d S )N      r^   rU   )r   codeclosureannotations
kwdefaultsdefaultsro   )r<   rW   rC   r   rH   )r   r    r&   MAKE_CLOSUREr   r,  r-  r.  r/  r0  ro   r   r   r   op_MAKE_FUNCTION  s    



z!DataFlowAnalysis.op_MAKE_FUNCTIONc                 C   rY   )NT)r1  )r2  r9   r   r   r   op_MAKE_CLOSURE  r]   z DataFlowAnalysis.op_MAKE_CLOSUREc                 C   r   r   r   r   r   r   r   op_LOAD_CLOSURE  r   z DataFlowAnalysis.op_LOAD_CLOSUREc                 O      | j |i | d S r   )r   r   r   kwsr   r   r   op_LOAD_METHOD  r]   zDataFlowAnalysis.op_LOAD_METHODc                 O   r5  r   )r   r6  r   r   r   op_CALL_METHOD  r]   zDataFlowAnalysis.op_CALL_METHODc                 C   rR   r   r   r9   r   r   r   _ignored
  rT   zDataFlowAnalysis._ignoredNF)__name__
__module____qualname____doc__r   r   r   r(   r   r.   rK   rN   rQ   rS   rX   r\   r_   rc   re   rg   rm   rr   rx   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   r   op_UNARY_NEGATIVEop_UNARY_POSITIVEop_UNARY_NOTop_UNARY_INVERTr   op_COMPARE_OPop_IS_OPop_CONTAINS_OPop_INPLACE_ADDop_INPLACE_SUBTRACTop_INPLACE_MULTIPLYop_INPLACE_DIVIDEop_INPLACE_TRUE_DIVIDEop_INPLACE_FLOOR_DIVIDEop_INPLACE_MODULOop_INPLACE_POWERop_INPLACE_MATRIX_MULTIPLYop_INPLACE_LSHIFTop_INPLACE_RSHIFTop_INPLACE_ANDop_INPLACE_ORop_INPLACE_XORop_BINARY_ADDop_BINARY_SUBTRACTop_BINARY_MULTIPLYop_BINARY_DIVIDEop_BINARY_TRUE_DIVIDEop_BINARY_FLOOR_DIVIDEop_BINARY_MODULOop_BINARY_POWERop_BINARY_MATRIX_MULTIPLYop_BINARY_LSHIFTop_BINARY_RSHIFTop_BINARY_ANDop_BINARY_ORop_BINARY_XORr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  op_JUMP_IF_FALSE_OR_POPop_JUMP_IF_TRUE_OR_POPr  r  r  r  r  r  r  r  r   r#  r%  r&  r)  r2  r3  r4  r8  r9  r:  r   r   r   r   r   
   s    3

	
	


	r   c                   @      e Zd ZdZdd ZdS )r  r   c                 C   
   d | _ d S r   rf  r   r   r   r   r        
zLoopBlock.__init__Nr<  r=  r>  	__slots__r   r   r   r   r   r        r  c                   @   re  )r  rf  c                 C   rg  r   rf  rh  r   r   r   r     ri  zWithBlock.__init__Nrj  r   r   r   r   r    rl  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   )rM   r   r   stackoutgoing_phisinststempct_termr   r   r   )r   rM   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   rh  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   rm  ro  rh  r   r   r   r(   1  s
   

zBlockInfo.dumpru  c                 C   s$   |  j d7  _ d|| j| j f }|S )NrU   z$%s%s.%s)rp  r   )r   prefixr   r   r   r   rC   8  s   zBlockInfo.make_tempc                 C   s   |  j d7  _ | j| d S )NrU   )r   rm  r   )r   rJ   r   r   r   rH   =  s   zBlockInfo.pushFc                 C   s<   | j s|  jd8  _|s|  S dS |  jd8  _| j  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.
        rU   N)rm  r   make_incomingr   r<   )r   rP   r   r   r   r<   A  s   
zBlockInfo.popc                    sJ   |} fddt |D }|d }t |d ddD ]	} ||  q|S )zr
        Return the k'th element back from the top of the stack.
        peek(1) is the top of the stack.
        c                    r:   r   r;   r=   rh  r   r   r@   V  rA   z"BlockInfo.peek.<locals>.<listcomp>ru   rU   )rF   rH   )r   r   num_popstop_krr   r   rh  r   r   P  s   zBlockInfo.peekc                 C   s>   | j sJ | 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   rC   r   r   request_outgoing)r   retr"   stack_indexr   r   r   rz  \  s   


zBlockInfo.make_incomingc                 C   s^   || j v rdS || jk r | jsJ | jD ]	}|| || qdS | j|| j  }|| j |< dS )z
        Request the assignment of the next available stack variable
        for block *outgoing_block* with target name *phiname*.
        N)rn  r   r   r  rm  )r   outgoing_blockphinamer  r"   varnamer   r   r   r  i  s   



zBlockInfo.request_outgoingc                 C   s   |   }| | |S r   r`   )r   r}  r   r   r   r   z  s   
zBlockInfo.tosc                 K   s   | j |j|f d S r   )ro  r   r   )r   r&   r7  r   r   r   r     s   zBlockInfo.appendc                 C   s   | j d u sJ | j S r   rq  rh  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   rh  r   r   r   active_try_block  s   zBlockInfo.active_try_blockN)ru  r;  )r<  r=  r>  r   rs  r(   rC   rH   r<   r   rz  r  propertyr   r   r  setterr  r   r   r   r   r     s&    




r   )collectionsr   sysr   numba.core.errorsr   numba.core.irr   objectr   r  r  r   r   r   r   r   <module>   s           
