a
    
d                     @   s  d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ eeZd
ZeZeh dZe
G dd deZG dd deZG dd deZ dd Z!G dd deZ"e
G dd deZ#G dd de#Z$edkre$Z%nedk r*e#Z%ne&eedg dZ'G dd deZ(edg d Z)d!d" Z*d#d$ Z+G d%d& d&eZ,G d'd( d(eZ-dS ))z)
Implement python 3.8+ bytecode analysis
    N)pformat)
namedtupledefaultdictdeque)total_ordering)
UniqueDict	PYVERSIONALL_BINOPS_TO_OPERATORS)NEW_BLOCKERSCFGraph)Loc)UnsupportedError   >   
LOAD_DEREFZPRECALLNOP
LOAD_CONSTc                   @   sD   e Zd ZdZeh dZdd Zdd Zdd Zd	d
 Z	dd Z
dS )	BlockKindz?Kinds of block to make related code safer than just `str`.
    >   LOOPEXCEPTTRYFINALLYWITH_FINALLYWITHc                 C   s   || j v sJ || _d S N)_members_value)selfvalue r   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/numba/core/byteflow.py__init__&   s    zBlockKind.__init__c                 C   s   t t| | jfS r   )hashtyper   r   r   r   r   __hash__*   s    zBlockKind.__hash__c                 C   s,   t |tr| j|jk S tdt|d S Nzcannot compare to {!r}
isinstancer   r   	TypeErrorformatr"   r   otherr   r   r   __lt__-   s    
zBlockKind.__lt__c                 C   s,   t |tr| j|jkS tdt|d S r%   r&   r*   r   r   r   __eq__3   s    
zBlockKind.__eq__c                 C   s   d | jS )NzBlockKind({}))r)   r   r#   r   r   r   __repr__9   s    zBlockKind.__repr__N)__name__
__module____qualname____doc__	frozensetr   r    r$   r,   r-   r.   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )_lazy_pformatc                 O   s   || _ || _d S r   )argskwargsr   r5   r6   r   r   r   r    >   s    z_lazy_pformat.__init__c                 C   s   t | ji | jS r   )r   r5   r6   r#   r   r   r   __str__B   s    z_lazy_pformat.__str__N)r/   r0   r1   r    r8   r   r   r   r   r4   =   s   r4   c                   @   sl   e Zd ZdZdd Zdd Zedkr.dd Znedk r@d	d Zneed
d Z	dd Z
dd Zdd ZdS )FlowziData+Control Flow analysis.

    Simulate execution to recover dataflow and controlflow information.
    c                 C   s"   t d|  || _t | _d S )Nzbytecode dump:
%s)_loggerdebugdump	_bytecoder   block_infos)r   bytecoder   r   r   r    K   s    zFlow.__init__c                 C   sJ  t | jdddd}t| jjjd}|j| t }|jrt	d|j |j
 }||jvr4t	d|j t	d| |||j< || | rqq| ||rq| |r| | |  qqt	d|j |j| | }|j| q4| |j | | t|jd	d
 dD ](}t| | j|j< }t	d|| qdS )a  Run a trace over the bytecode over all reachable path.

        The trace starts at bytecode offset 0 and gathers stack and control-
        flow information by partially interpreting each bytecode.
        Each ``State`` instance in the trace corresponds to a basic-block.
        The State instances forks when a jump instruction is encountered.
        A newly forked state is then added to the list of pending states.
        The trace ends when there are no more pending states.
        r   r   )r?   pcnstack
blockstack)debug_filenamezpending: %sz	stack: %szstate.pc_initial: %szend state. edges=%sc                 S   s   | j S r   )
pc_initial)xr   r   r   <lambda>       zFlow.run.<locals>.<lambda>)keyzblock_infos %s:
%sN)Stater=   TraceRunnerZfunc_idfilenamependingappendr   r:   r;   popleftfinished_stackrD   dispatchhas_terminated_run_handle_exception_is_implicit_new_block_guard_with_assplit_new_blockoutgoing_edgesaddget_outgoing_statesextend
_build_cfg_prune_phissortedadapt_state_infosr>   )r   Z
firststaterunnerZfirst_encounterstateZ
out_statessir   r   r   runP   s>    








zFlow.run      c                 C   s   |  s>| r>| jtvr>|j| jd || dS |  |  s|	 rt
d| |j | }|d}|r|d |jkrd }nB|jd|jd}|j|d< |j|d< |j|d	< |j|j|d
 dS d S )Nr@   Tz3.11 exception %s PC=%sr   endrg   
end_offsetstack_depth
push_lastir@   extra_block)in_withhas_active_tryget_instopname_NO_RAISE_OPSforknext_adjust_except_stack
advance_pcis_in_exceptionr:   r;   get_exception_pcget_top_blocktarget
make_blockrg   depthlasti)r   r_   r`   ehZeh_topZeh_blockr   r   r   rS      s.    





zFlow._run_handle_exceptionc                 C   s   |  r| jtvr|j| jd |d}|| |j}i }||d krb||d  |d< |d }t	dt
t	dti|d  |d	< ||d
< |jf d|d i| dS |  d S )Nrf   r   entry_stacknpophandlerr   r   kindnpushrm   r@   rg   T)ro   rp   rq   rr   rs   rt   rz   pop_block_and_aboverj   r   _EXCEPT_STACK_OFFSET_FINALLY_POPrv   )r   r_   r`   tryblkrA   r6   r   r   r   r   rS      s(    

c                 C   sd   t  }|D ]}|j}|| q
|D ]"}|jD ]}||j|jd q.q$|d |  || _d S )Nr   )	r   rD   add_noderW   Zadd_edger@   Zset_entry_pointprocesscfgraph)r   Z
all_statesgraphr`   bedger   r   r   r[      s    

zFlow._build_cfgc           	         s   t ddd fdd} fdd} fdd	}fd
d}| \} t dt| | \}}|| ||| t ddd d S )Nz
Prune PHIs<   -c                     sR   t t} t } jD ]4}t|j}t|j}| |  ||@ O  < ||O }q| |fS r   )r   setrO   
_used_regs_phis)	used_phisphi_setr`   usedZphisr_   r   r   get_used_phis_per_state   s    



z1Flow._prune_phis.<locals>.get_used_phis_per_statec                     sv   i } t t}jD ]:}|j D ]*\}}| vr8|| |< || ||f q qtdt|  tdt| | |fS )Nz
defmap: %szphismap: %s)	r   r   rO   _outgoing_phisitemsrX   r:   r;   r4   )defmapphismapr`   phirhsr   r_   r   r   find_use_defs   s    
z'Flow._prune_phis.<locals>.find_use_defsc                    s   t t}d}tt|  D ]`\}}tt|D ].\}}| v r0|| | O }|| ||f q0|| }||@ r||8 }d}qtdt|  |sqqdS )znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            FTzchanging phismap: %sN)	r   r   r]   listr   rX   r:   r;   r4   )r   Z	blacklistZchangingr   Zdefsitesr   r`   Z	to_remove)r   r   r   propagate_phi_map   s    z+Flow._prune_phis.<locals>.propagate_phi_mapc                    s   i }|   D ]\}}|D ]}|| ||< qqtdt| tt}|D ]"}|| D ]\}}||| |< qTqHtdt|  jD ]}|j  |j	||  qd S )Nzkeep phismap: %sznew_out: %s)
r   r:   r;   r4   r   dictrO   r   clearupdate)r   r   Zkeepr`   Zused_setr   Znew_outr   r   r   r   apply_changes  s    

z'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)r:   r;   centerr4   )	r   r_   r   r   r   r   r   r   r   r   r   r   r\      s    


zFlow._prune_phisc                 C   s0   |  }|j| jjv rdS |jtv r(dS dS d S )NTF)rp   offsetr=   labelsrq   r
   r   r`   instr   r   r   rT     s    
zFlow._is_implicit_new_blockc                 C   s8   |  }|jdv r4| j|j j}|dkr4d}t|dS )zChecks if the next instruction after a SETUP_WITH is something other
        than a POP_TOP, if it is something else it'll be some sort of store
        which is not supported (this corresponds to `with CTXMGR as VAR(S)`).>   ZBEFORE_WITH
SETUP_WITHPOP_TOPzGThe 'with (context manager) as (variable):' construct is not supported.N)rp   rq   r=   rt   r   )r   r`   Zcurrent_instZnext_opmsgr   r   r   rU   "  s    
zFlow._guard_with_asN)r/   r0   r1   r2   r    rb   r   rS   NotImplementedErrorr[   r\   rT   rU   r   r   r   r   r9   F   s   :

M
r9   c                 C   s
   |  dS )Nz$null$)
startswith)regr   r   r   _is_null_temp_reg0  s    r   c                   @   s  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edkrdd Znedk rdd Zne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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+e+Z,e+Z-dPdQ Z.e.Z/e.Z0dRdS Z1dTdU Z2dVdW Z3dXdY Z4dZd[ Z5d\d] Z6d^d_ Z7d`da Z8dbdc Z9ddde Z:dfdg Z;dhdi Z<djdk Z=dldm Z>edkrdndo Z?nedk rdpdo Z?nedqdr Z@dsdt ZAdudv ZBdwdx ZCdydz ZDd{d| ZEd}d~ ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLedkrdd ZMnedk rdd ZMneedd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd ZgddÄ Zhddń ZiddǄ ZjddɄ Zkdd˄ Zldd̈́ Zmddτ Znddф Zoddӄ ZpddՄ Zqddׄ Zrddل ZsesZtesZuesZvesZwddۄ ZxexZyexZzexZ{exZ|exZ}exZ~exZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZdddބZdd Zdd Zdd Zdd Zdd Zedkrdd Znedk rdd Zneeedkrdd Znedk rdd Zneedd ZdS )rJ   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ t | _t | _d S r   )rC   r   rL   r   rO   )r   rC   r   r   r   r    7  s    zTraceRunner.__init__c                 C   s   t | j|S r   )r   rC   )r   linenor   r   r   get_debug_loc<  s    zTraceRunner.get_debug_locc                 C   s   t dkrtt nHt dkrZ|jrZ|jrZ|jd }|d }|d urZ||jkrZ|j  q qZq | }|jdkrtd|j	| td|j
 t| d|jd }|d ur||| nd|j }t|| |jd	d S )
Nrc   rg   CACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) foundloc)r   r   _blockstackrD   poprp   rq   r:   r;   ry   rP   getattrr)   r   r   r   )r   r`   ZtopblkZblk_endr   fnr   r   r   r   rQ   ?  s$    



zTraceRunner.dispatchc                 C   sr   | d}|| |j}i }|d }||kr:|| |d< d}|d rN|d7 }||d< |jf d|d i| d	S )
zo
        Adjust stack when entering an exception handler to match expectation
        by the bytecode.
        r   rj   r      rk   r   r@   rg   N)rz   r   rj   rs   )r   r`   r   rA   r6   Zexpected_depthZextra_stackr   r   r   ru   V  s    

z TraceRunner._adjust_except_stackc                 C   s   | | d S r   rM   r   r   r   r   op_NOPj  s    zTraceRunner.op_NOPc                 C   s   | | d S r   r   r   r   r   r   	op_RESUMEm  s    zTraceRunner.op_RESUMEc                 C   s   | | d S r   r   r   r   r   r   op_CACHEp  s    zTraceRunner.op_CACHEc                 C   s   | | d S r   r   r   r   r   r   
op_PRECALLs  s    zTraceRunner.op_PRECALLc                 C   s   | |  || d S r   )push	make_nullrM   r   r   r   r   op_PUSH_NULLv  s    zTraceRunner.op_PUSH_NULLc                 C   s   | |  || d S r   )r   	make_temprM   r   r   r   r   op_RETURN_GENERATORz  s    
zTraceRunner.op_RETURN_GENERATORc                 C   sZ   |j dkr"d}t|| |jd| }| }| }|j||||d || dS )aF  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, we just call str() 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   )r   resstrvarN)argr   r   r   r   r   rM   r   )r   r`   r   r   r   r   r   r   r   r   op_FORMAT_VALUE  s    
zTraceRunner.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   r   .0_r`   r   r   
<listcomp>  rG   z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>r   c                    s   g | ]}   qS r   r   r   r   r   r   r     rG   r   )stringstmpsr   Nr   r   reversedranger   rM   r   )r   r`   r   countr   r   r   r   r   op_BUILD_STRING  s    zTraceRunner.op_BUILD_STRINGc                 C   s   |   d S r   r   r   r   r   r   
op_POP_TOP  s    zTraceRunner.op_POP_TOPrc   c                 C   sH   |  }|jd? }|j|||d |jd@ r:||  || d S )Nr   )idxr   )r   r   rM   r   r   )r   r`   r   r   r   r   r   r   op_LOAD_GLOBAL  s    

zTraceRunner.op_LOAD_GLOBALc                 C   s$   |  }|j||d || d S Nr   r   rM   r   r   r`   r   r   r   r   r   r     s    c                 C   s   | | d S r   r   r   r   r   r   op_COPY_FREE_VARS  s    zTraceRunner.op_COPY_FREE_VARSc                 C   s   | | d S r   r   r   r   r   r   op_MAKE_CELL  s    zTraceRunner.op_MAKE_CELLc                 C   s$   |  }|j||d || d S r   r   r   r   r   r   op_LOAD_DEREF  s    zTraceRunner.op_LOAD_DEREFc                 C   s&   | d}|| |j||d d S )Nconstr   )r   r   rM   r   r   r   r   op_LOAD_CONST  s    

zTraceRunner.op_LOAD_CONSTc                 C   s.   |  }| }|j|||d || d S N)itemr   r   r   rM   r   )r   r`   r   r   r   r   r   r   op_LOAD_ATTR  s    zTraceRunner.op_LOAD_ATTRc                 C   s0   | |}||}|j||d || d S r   )get_varnamer   rM   r   )r   r`   r   namer   r   r   r   op_LOAD_FAST  s    

zTraceRunner.op_LOAD_FASTc                 C   s   | | d S r   r   r   r   r   r   op_DELETE_FAST  s    zTraceRunner.op_DELETE_FASTc                 C   s   |  }|j||d d S )N)r{   r   rM   )r   r`   r   r{   r   r   r   op_DELETE_ATTR  s    zTraceRunner.op_DELETE_ATTRc                 C   s$   |  }|  }|j|||d d S )N)r{   r   r   )r   r`   r   r{   r   r   r   r   op_STORE_ATTR  s    zTraceRunner.op_STORE_ATTRc                 C   s   |  }|j||d d S N)r   r   r   r`   r   r   r   r   r   op_STORE_DEREF  s    zTraceRunner.op_STORE_DEREFc                 C   s   |  }|j||d d S r   r   r   r   r   r   op_STORE_FAST  s    zTraceRunner.op_STORE_FASTc           	   	   C   sV   |  }|  }| }| }| }| }|j|||||||d || dS )z"
        TOS = TOS1[TOS:]
        )basestartr   slicevarindexvarnonevarNr   	r   r`   r   tostos1r   r   r   r   r   r   r   
op_SLICE_1  s     	zTraceRunner.op_SLICE_1c           	   	   C   sV   |  }|  }| }| }| }| }|j|||||||d || dS )z"
        TOS = TOS1[:TOS]
        )r   stopr   r   r   r   Nr   r   r   r   r   
op_SLICE_2  s     	zTraceRunner.op_SLICE_2c           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || dS )z&
        TOS = TOS2[TOS1:TOS]
        )r   r   r   r   r   r   Nr   )	r   r`   r   r   r   tos2r   r   r   r   r   r   
op_SLICE_3  s     	zTraceRunner.op_SLICE_3c                 C   sB   |  }|  }| }| }| }|j||||||d dS )z
        TOS[:] = TOS1
        )r   r   r   r   r   Nr   r   rM   )r   r`   r   r   r   r   r   r   r   r   r   op_STORE_SLICE_0,  s    zTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )r   r   r   r   r   r   Nr  	r   r`   r   r   r   r   r   r   r   r   r   r   op_STORE_SLICE_1>  s    zTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )r   r   r   r   r   r   Nr  r  r   r   r   op_STORE_SLICE_2R  s    zTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )r   r   r   r   r   r   Nr  )	r   r`   r   r   r   r   r   r   r   r   r   r   op_STORE_SLICE_3f  s    zTraceRunner.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_0z  s    zTraceRunner.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_1  s    zTraceRunner.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TraceRunner.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_3  s    
zTraceRunner.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)
           Nrd   Zunreachable)r   r   stepr   r   )r   r   	Exceptionr   rM   r   )r   r`   r   Zargcr   r   r   r   r  r   r   r   r   r   r   op_BUILD_SLICE  s*    zTraceRunner.op_BUILD_SLICEc                 C   sH   |  }|j||d | }|j}|j|d ||krD|j|d d S )Npredrf   )r   rM   get_jump_targetrt   rs   )r   r`   r   r  Ztarget_instZ	next_instr   r   r   _op_POP_JUMP_IF  s    zTraceRunner._op_POP_JUMP_IFc                 C   s:   |  }|j||d |j|jdd |j| d d S )Nr  r   r@   r   rf   )get_tosrM   rs   rt   r  )r   r`   r   r  r   r   r   _op_JUMP_IF_OR_POP  s    zTraceRunner._op_JUMP_IF_OR_POPc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_FORWARD_IF_NONE  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_FORWARD_IF_NOT_NONE  s    z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_BACKWARD_IF_NONE  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   s   |  || d S r   r  r   r   r   r    op_POP_JUMP_BACKWARD_IF_NOT_NONE  s    z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_FORWARD_IF_FALSE  s    z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_FORWARD_IF_TRUE  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_BACKWARD_IF_FALSE  s    z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   s   |  || d S r   r  r   r   r   r   op_POP_JUMP_BACKWARD_IF_TRUE  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUEc                 C   s   | | |j| d d S Nrf   rM   rs   r  r   r   r   r   op_JUMP_FORWARD  s    
zTraceRunner.op_JUMP_FORWARDc                 C   s   | | |j| d d S r!  r"  r   r   r   r   op_JUMP_BACKWARD  s    
zTraceRunner.op_JUMP_BACKWARDc                 C   s   | | |j| d d S r!  r"  r   r   r   r   op_JUMP_ABSOLUTE  s    
zTraceRunner.op_JUMP_ABSOLUTEc                 C   s4   | dd }|j||d |  |j|d d S )Nr   rg   rh   rf   )rz   rM   	pop_blockrs   )r   r`   r   rg   r   r   r   op_BREAK_LOOP  s    zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || | d |  d S )N)retvalZcastval)rM   r   r   	terminater   r   r   r   op_RETURN_VALUE  s    zTraceRunner.op_RETURN_VALUEc                 C   s.   |  }| }|j|||d || d S N)r   r   r   r   r`   r   valr   r   r   r   op_YIELD_VALUE  s    zTraceRunner.op_YIELD_VALUEc                 C   sv   |j dkr,d }| rHtd| |jdn|j dkr@| }ntd|j||d | rj| | n|	  d S )Nr   4The re-raising of an exception is not yet supported.r   r   )Multiple argument raise is not supported.exc)
r   ro   r   r   r   r   
ValueErrorrM   ru   r)  r   r`   r   r2  r   r   r   op_RAISE_VARARGS"  s    



zTraceRunner.op_RAISE_VARARGSc                 C   s~   t |dd u|dd ug}|jdkrHd }|rdtd| |jdn|jdkr\| }ntd|j||d |	  d S )	Nr   r   r   r/  r   r   r0  r1  )
anyrz   r   r   r   r   r   r3  rM   r)  )r   r`   r   Zin_exc_blockr2  r   r   r   r5  8  s     



c                 C   s@   g }t tD ] }| }|| || q|j||d d S )N)temps)r   r   r   rM   r   )r   r`   r   r7  itmpr   r   r   op_BEGIN_FINALLYM  s    
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  }||d  d S )Nr   )r&  reset_stackr   r`   r   blkr   r   r   op_END_FINALLYU  s    zTraceRunner.op_END_FINALLYc                 C   s&   |j dkr"d}t|| |jdd S )Nr   zGUnsupported use of a bytecode related to try..finally or a with-contextr   )r   r   r   r   )r   r`   r   r   r   r   r   op_POP_FINALLYY  s    
zTraceRunner.op_POP_FINALLYc                 C   s   d S r   r   r   r   r   r   op_CALL_FINALLY`  s    zTraceRunner.op_CALL_FINALLYc                 C   s   |   d S r   )r)  r   r   r   r   op_WITH_EXCEPT_STARTc  s    z TraceRunner.op_WITH_EXCEPT_STARTc                 C   s   | | d S r   r   r   r   r   r   op_WITH_CLEANUP_STARTf  s    z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   s   | | d S r   r   r   r   r   r   op_WITH_CLEANUP_FINISHj  s    z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   | |jd| d d S )Nr   r   rg   )
push_blockr|   r  r   r   r   r   op_SETUP_LOOPn  s    zTraceRunner.op_SETUP_LOOPc                 C   s   |  }| }|jdd}|| || |j}||j}|g}|jD ]}	|	j|jkrN||	 qNt	dd |D }
|j||||
d |
|jd|
d |j|jd d S )	Nsetup_with_exitfnprefixc                 s   s   | ]}|j V  qd S r   rh   )r   r   r   r   r   	<genexpr>  rG   z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)contextmanagerexitfnrg   r   rD  rf   )r   r   r   r=   find_exception_entryrt   Zexception_entriesr{   rM   maxrE  r|   rs   )r   r`   r   cmyieldedrL  bcZehheadZ	ehrelatedr   rg   r   r   r   op_BEFORE_WITHw  s(    


zTraceRunner.op_BEFORE_WITHc                 C   s   |  }| }|jdd}|j|||d tdk rL||jd| d || || ||jd| d |j|j	d d S )	NrG  rH  )rK  rL  )rd   	   r   rD  r   rf   )
r   r   rM   r   rE  r|   r  r   rs   rt   )r   r`   r   rO  rP  rL  r   r   r   op_SETUP_WITH  s(    

zTraceRunner.op_SETUP_WITHc                 C   s0   |j |d dd}|j||j d|d|dd d S )NF)r   rg   r;  r   )r   rg   r;  r   rl   )r|   rs   )r   r   r`   rt   rg   Zhandler_blockr   r   r   
_setup_try  s    zTraceRunner._setup_tryc                 C   s&   |  }||d || d S )N	exception)r   r   r   )r   r`   r   r   r   r   r   op_PUSH_EXC_INFO  s    zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   | | | jd||j| d d S )Nr   )rt   rg   )rM   rU  rt   r  r   r   r   r   op_SETUP_FINALLY  s    
zTraceRunner.op_SETUP_FINALLYc                 C   s   |   d S r   r   r   r   r   r   op_POP_EXCEPT  s    zTraceRunner.op_POP_EXCEPTc                 C   sh   |  }|d tdtdhvr>td|d  | |jd|  |  |  |j|jd d S )Nr   r   r   z$POP_EXCEPT got an unexpected block: r   rf   )r&  r   r   r   r   r   rs   rt   r<  r   r   r   rY    s    
c                 C   sX   |  }|d tdkr(|j|dd n|d tdkrF|j|dd |j|jd d S )Nr   r   try)r   r   withrf   )r&  r   rM   rs   rt   r<  r   r   r   op_POP_BLOCK  s    zTraceRunner.op_POP_BLOCKc                 C   s8   |  }|  }| }|j||||d || d S )N)indexr{   r   r   )r   r`   r   r]  r{   r   r   r   r   op_BINARY_SUBSCR  s
    zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  }|  }|  }|j||||d d S )N)r{   r]  r   r   )r   r`   r   r]  r{   r   r   r   r   op_STORE_SUBSCR  s    zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  }|  }|j|||d d S )N)r{   r]  r   )r   r`   r   r]  r{   r   r   r   op_DELETE_SUBSCR  s    zTraceRunner.op_DELETE_SUBSCRc           
         s   |j }tt fddt|D }  }  }t|rB|}n|}|g|}  }  }	 j||||	|d  	| d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r      rG   z'TraceRunner.op_CALL.<locals>.<listcomp>)funcr5   kw_namesr   )
r   r   r   r   r   r   r   pop_kw_namesrM   r   )
r   r`   r   nargr5   Zcallable_or_firstargZnull_or_callablecallabler   rb  r   r   r   op_CALL  s    
zTraceRunner.op_CALLc                 C   s   | |j d S r   )set_kw_namesr   r   r   r   r   op_KW_NAMES  s    zTraceRunner.op_KW_NAMESc                    sT   |j }tt fddt|D }  }  } j||||d  | d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r     rG   z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>)ra  r5   r   )r   r   r   r   r   r   rM   r   )r   r`   r   rd  r5   ra  r   r   r   r   op_CALL_FUNCTION  s    zTraceRunner.op_CALL_FUNCTIONc                    s^   |j }  }tt fddt|D }  }  } j|||||d  | d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r     rG   z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>)ra  r5   namesr   )r   r   r   r   r   r   rM   r   )r   r`   r   rd  rj  r5   ra  r   r   r   r   op_CALL_FUNCTION_KW  s    zTraceRunner.op_CALL_FUNCTION_KWc                 C   s   |j d@ rtdk rd}t||j d@ r2| }nd }| }| }tdkrdt|drd|  | }|j|||||d || d S )Nr   )rd   
   z,CALL_FUNCTION_EX with **kwargs not supportedrc   )ra  varargvarkwargr   )	r   r   r   r   r   peekr   rM   r   )r   r`   r   errmsgrn  rm  ra  r   r   r   r   op_CALL_FUNCTION_EX$  s    

zTraceRunner.op_CALL_FUNCTION_EXc                    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   r   r   r   r   r   r   8  rG   z)TraceRunner._dup_topx.<locals>.<listcomp>c                    s   g | ]}   qS r   r   r   r   r   r   r   <  rG   )origduped)r   reverserM   r   )r   r`   r   r   rr  rs  r-  r   r   r   	_dup_topx7  s    zTraceRunner._dup_topxc                 C   s6   |j }d|  krdks$n J d| ||| d S )Nr      zInvalid DUP_TOPX count)r   ru  )r   r`   r   r   r   r   r   op_DUP_TOPXC  s    zTraceRunner.op_DUP_TOPXc                 C   s   | j ||dd d S )Nr   r   ru  r   r   r   r   
op_DUP_TOPH  s    zTraceRunner.op_DUP_TOPc                 C   s   | j ||dd d S )Nr  rx  ry  r   r   r   r   op_DUP_TOP_TWOK  s    zTraceRunner.op_DUP_TOP_TWOc                 C   s   | ||j d S r   )r   ro  r   r   r   r   r   op_COPYN  s    zTraceRunner.op_COPYc                 C   s   | |j d S r   )swapr   r   r   r   r   op_SWAPQ  s    zTraceRunner.op_SWAPc                 C   s(   |  }|  }|| || d S r   r   r   )r   r`   r   firstsecondr   r   r   
op_ROT_TWOT  s    
zTraceRunner.op_ROT_TWOc                 C   s:   |  }|  }|  }|| || || d S r   r  )r   r`   r   r  r  thirdr   r   r   op_ROT_THREEZ  s    

zTraceRunner.op_ROT_THREEc                 C   sL   |  }|  }|  }|  }|| || || || d S r   r  )r   r`   r   r  r  r  Zforthr   r   r   op_ROT_FOURb  s    


zTraceRunner.op_ROT_FOURc                    sZ   |j }  } fddt|D }  } j||||d t|D ]} | qFd S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r   o  rG   z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)iterablestorestupleobj)r   r   r   r   rM   r   r   )r   r`   r   r   r  r  r  str   r   r   op_UNPACK_SEQUENCEl  s    zTraceRunner.op_UNPACK_SEQUENCEc                    sJ   |j }tt fddt|D }  } j|||d  | d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r   w  rG   z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>r   r   r   )r   r`   r   r   r   tupr   r   r   op_BUILD_TUPLEu  s
    zTraceRunner.op_BUILD_TUPLEc                    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   r   r   r   r   r   r   ~  rG   z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>c                    s   g | ]}   qS r   r   r   r   r   r   r     rG   r   )tuplesr7  	is_assignr   )r   r   r   r   lenr   rM   r   )r   r`   r   r  r7  r  r   r   r   _build_tuple_unpack|  s     
zTraceRunner._build_tuple_unpackc                 C   s   |  || d S r   r  r   r   r   r   op_BUILD_TUPLE_UNPACK_WITH_CALL  s    z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   s   |  || d S r   r  r   r   r   r   op_BUILD_TUPLE_UNPACK  s    z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   s.   |  }| }|j|||d || d S )N)
const_listr   r   )r   r`   r   r   r   r   r   r   op_LIST_TO_TUPLE  s    zTraceRunner.op_LIST_TO_TUPLEc                    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   r   r   r   r   r   r     rG   z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    s   g | ]}   qS r   r   r   r   r   r   r     rG   )keyskeytmpsvaluesr   )r   r   r   r   r   r   rM   r   )r   r`   r   r  valsr  r   r   r   r   op_BUILD_CONST_KEY_MAP  s     z"TraceRunner.op_BUILD_CONST_KEY_MAPc                    sJ   |j }tt fddt|D }  } j|||d  | d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r     rG   z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>r  r   )r   r`   r   r   r   lstr   r   r   op_BUILD_LIST  s
    zTraceRunner.op_BUILD_LISTc                 C   s@   |  }|j}||}| }| }|j|||||d d S )N)r{   r   	appendvarr   r   r   ro  r   rM   )r   r`   r   r   r]  r{   r  r   r   r   r   op_LIST_APPEND  s    
zTraceRunner.op_LIST_APPENDc                 C   s@   |  }|j}||}| }| }|j|||||d d S )N)r{   r   	extendvarr   r  )r   r`   r   r   r]  r{   r  r   r   r   r   op_LIST_EXTEND  s    
zTraceRunner.op_LIST_EXTENDc           	      C   sj   |  }|j}g }t|D ]$}| |  }}|||f q|j||d d d ||d || d S )Nr   )r   sizer   )r   r   r   r   rM   r   )	r   r`   r   dctr   r   r8  vkr   r   r   op_BUILD_MAP  s    zTraceRunner.op_BUILD_MAPc                 C   sT   |  }|  }|| }}|j}||}| }	| }
|j|||||	|
d d S )N)r{   rH   r   
setitemvarr   r  )r   r`   r   ZTOSZTOS1rH   r   r]  r{   r  r   r   r   r   
op_MAP_ADD  s    

zTraceRunner.op_MAP_ADDc                    sJ   |j }tt fddt|D }  } j|||d  | d S )Nc                    s   g | ]}   qS r   r   r   r   r   r   r     rG   z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>r  r   )r   r`   r   r   r   r   r   r   r   op_BUILD_SET  s
    zTraceRunner.op_BUILD_SETc                 C   s@   |  }|j}||}| }| }|j|||||d d S N)r{   r   	updatevarr   r  r   r`   r   r   r]  r{   r  r   r   r   r   op_SET_UPDATE  s    
zTraceRunner.op_SET_UPDATEc                 C   s@   |  }|j}||}| }| }|j|||||d d S r  r  r  r   r   r   op_DICT_UPDATE  s    
zTraceRunner.op_DICT_UPDATEc                 C   s.   |  }| }|j|||d || d S r+  r   )r   r`   r   r   r   r   r   r   op_GET_ITER  s    zTraceRunner.op_GET_ITERc                 C   sf   |  }| }| }| }|j|||||d || | }|j|dd |j|jd d S )N)iteratorpairindvalr  r  r  rf   )r  r   rM   r   r  rs   rt   )r   r`   r   r  r  r  r  rg   r   r   r   op_FOR_ITER  s    
zTraceRunner.op_FOR_ITERc                 C   s   dS )a(  Pops TOS. If TOS was not None, raises an exception. The kind
        operand corresponds to the type of generator or coroutine and
        determines the error message. The legal kinds are 0 for generator,
        1 for coroutine, and 2 for async generator.

        New in version 3.10.
        Nr   r   r   r   r   op_GEN_START  s    	zTraceRunner.op_GEN_STARTc                 C   s^   t j|j d }| }| }t| j}|jd| d}|j|||||d || d S )Nr   Zbinop_rH  )oplhsr   r   )	disZ_nb_opsr   r   r	   r/   r   rM   r   )r   r`   r   r  r   r  Zop_namer   r   r   r   op_BINARY_OP  s    
zTraceRunner.op_BINARY_OPc                 C   s.   |  }| }|j|||d || d S r+  r   r,  r   r   r   _unaryop  s    zTraceRunner._unaryopc                 C   s8   |  }|  }| }|j||||d || d S )N)r  r   r   r   )r   r`   r   r   r  r   r   r   r   	_binaryop  s
    zTraceRunner._binaryopFc              
   C   s   t dkrd }nt dk r | }ntt | }d  } } }}	|jd@ rR| }|jd@ rd| }|jd@ rv| }|jd@ r| }	| }
|j|||||||	|
d ||
 d S )Nrc         r  r   )r   codeclosureannotations
kwdefaultsdefaultsr   )r   r   r   r   r   rM   r   )r   r`   r   MAKE_CLOSUREr   r  r  r  r  r  r   r   r   r   op_MAKE_FUNCTIONG  s6    





zTraceRunner.op_MAKE_FUNCTIONc                 C   s   | j ||dd d S )NT)r  )r  r   r   r   r   op_MAKE_CLOSUREg  s    zTraceRunner.op_MAKE_CLOSUREc                 C   s$   |  }|j||d || d S r   r   r   r   r   r   op_LOAD_CLOSUREj  s    zTraceRunner.op_LOAD_CLOSUREc                 C   s&   | d}|j||d || d S )NZassertion_errorr   r   r   r   r   r   op_LOAD_ASSERTION_ERRORo  s    
z#TraceRunner.op_LOAD_ASSERTION_ERRORc                 C   s:   | d}| }| }|j||||d || d S )N	predicater  r   r   )r   r   r  rM   r   r   r`   r   r  r   r   r   r   r   op_CHECK_EXC_MATCHt  s
    
zTraceRunner.op_CHECK_EXC_MATCHc                 C   sN   | d}| }| }|j||||d |j|jd |j| d d S )Nr  r  rf   )r   r   rM   rs   rt   r  r  r   r   r   op_JUMP_IF_NOT_EXC_MATCH{  s    
z$TraceRunner.op_JUMP_IF_NOT_EXC_MATCHc                 C   sH   |  }|jdkr|   |j||d | r<| | n|  d S )Nr   r1  )r   r   rM   ro   ru   r)  r4  r   r   r   
op_RERAISE  s    
zTraceRunner.op_RERAISEc                 C   s"   |  }|j||d |  d S )Nr1  )r   rM   r)  r4  r   r   r   r    s    c                 C   s@   |  }| }|| | }|j|||d || d S r   )r   r   r   r   rM   )r   r`   r   r   extrar   r   r   r   op_LOAD_METHOD  s    
zTraceRunner.op_LOAD_METHODc                 C   s   |  || d S r   )r   r   r   r   r   r    s    c                 C   s   |  || d S r   )ri  r   r   r   r   op_CALL_METHOD  s    zTraceRunner.op_CALL_METHODN)F)r/   r0   r1   r2   r    r   rQ   ru   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
  r  r  r  r  Zop_POP_JUMP_IF_TRUEZop_POP_JUMP_IF_FALSEr  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.  r5  r:  r>  r?  r@  rA  rB  rC  rF  rR  rT  rU  rW  rX  rY  r\  r^  r_  r`  rf  rh  ri  rk  rq  ru  rw  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  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   rJ   4  s`  





	



	

						
 








rJ   c                   @   sX  e Zd ZdZdQddZdd Zdd Zd	d
 Zdd Zdd Z	e
dd Ze
dd Ze
dd Ze
dd Ze
dd Ze
dd Zdd Zdd Zdd  Zd!d" ZdRd$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdSd8d9Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dTdIdJZ&dKdL Z'dMdN Z(dOdP Z)d7S )U_StatezState of the trace
    r   c                 C   s   || _ || _|| _|| _g | _t|| _t|| _g | _	g | _
g | _d| _i | _t | _t | _t|D ]6}||v r| d}n
| d}|| j|< | | qhdS )aG  
        Parameters
        ----------
        bytecode : numba.bytecode.ByteCode
            function bytecode
        pc : int
            program counter
        nstack : int
            stackdepth at entry
        blockstack : Sequence[Dict]
            A sequence of dictionary denoting entries on the blockstack.
        Fnull$r   N)r=   _pc_initialry   _nstack_initialrP   tuple_blockstack_initialr   r   _temp_registers_insts	_outedges_terminatedr   r   r   r   r   r   r   r   )r   r?   r@   rA   rB   nullvalsr8  r   r   r   r   r      s(    



z_State.__init__c                 C   s   d | j| jS )Nz&State(pc_initial={} nstack_initial={}))r)   r  r  r#   r   r   r   r.     s    z_State.__repr__c                 C   s   | j | jfS r   )r  r  r#   r   r   r   get_identity  s    z_State.get_identityc                 C   s   t |  S r   )r!   r  r#   r   r   r   r$     s    z_State.__hash__c                 C   s   |   |  k S r   r  r*   r   r   r   r,     s    z_State.__lt__c                 C   s   |   |  kS r   r  r*   r   r   r   r-     s    z_State.__eq__c                 C   s   | j S )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )r  r#   r   r   r   rD     s    z_State.pc_initialc                 C   s   | j S )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )r  r#   r   r   r   instructions  s    z_State.instructionsc                 C   s   | j S )zaThe list of outgoing edges.

        Returns
        -------
        edges : List[State]
        r  r#   r   r   r   rW     s    z_State.outgoing_edgesc                 C   s   | j S )zThe dictionary of outgoing phi nodes.

        The keys are the name of the PHI nodes.
        The values are the outgoing states.
        )r   r#   r   r   r   outgoing_phis  s    z_State.outgoing_phisc                 C   s   | j S )z6A copy of the initial state of the blockstack
        )r  r#   r   r   r   blockstack_initial  s    z_State.blockstack_initialc                 C   s
   t | jS )zYThe current size of the stack

        Returns
        -------
        res : int
        )r  rP   r#   r   r   r   rj     s    z_State.stack_depthc                 C   s,   t | jD ]}|d tdkr
|  S q
dS )z&Find the initial *try* block.
        r   r   N)r   r  r   )r   r=  r   r   r   find_initial_try_block  s    z_State.find_initial_try_blockc                 C   s   | j S r   r  r#   r   r   r   rR     s    z_State.has_terminatedc                 C   s   | j | j S r   )r=   ry   r#   r   r   r   rp   "  s    z_State.get_instc                 C   s   |   }|j| _d S r   )rp   rt   ry   r   r   r   r   r   rv   %  s    z_State.advance_pc c                 C   sR   |s*dj || j|  j t| jd}ndj || jt| jd}| j| |S )Nz"${prefix}{offset}{opname}.{tempct})rI  r   rq   tempctz${prefix}{offset}.{tempct})rI  r   r  )r)   ry   rp   rq   lowerr  r  rM   )r   rI  r   r   r   r   r   )  s    z_State.make_tempc                 K   s0   | j |j|f |  jtt| O  _dS )zAppend new instN)r  rM   r   r   r   _flatten_inst_regsr  )r   r   r6   r   r   r   rM   ;  s    z_State.appendc                 C   s
   |  dS )Nr   )ro  r#   r   r   r   r  @  s    z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        rP   )r   r  r   r   r   ro  C  s    z_State.peekc                 C   s   | j | dS )zPush to stackN)rP   rM   )r   r   r   r   r   r   H  s    z_State.pushc                 C   s
   | j  S )zPop the stack)rP   r   r#   r   r   r   r   L  s    z
_State.popc                 C   s(   | j }||  |d  |d< || < dS )zSwap stack[idx] with the tosr   Nr  )r   r   sr   r   r   r}  P  s    z_State.swapc                 C   s   d|v sJ | j | dS )z#Push a block to blockstack
        rj   N)r   rM   )r   Zsynblkr   r   r   rE  U  s    z_State.push_blockc                 C   s$   | j d| | j |d  | _ }|S )zVReset the stack to the given stack depth.
        Returning the popped items.
        Nr  )r   r}   poppedr   r   r   r;  [  s     z_State.reset_stackTNc                 C   s>   t ||t| jd}|r*t| j|d< nd|d< ||d< |S )zMake a new block
        )r   rg   r   rj   Nr   )r   r  rP   )r   r   rg   r;  r   dr   r   r   r|   b  s    z_State.make_blockc                 C   s   | j  }| |d  |S )z)Pop a block and unwind the stack
        rj   )r   r   r;  r   r   r   r   r   r&  q  s    
z_State.pop_blockc                 C   s@   | j |}d|  kr&t| j k s,n J | j d| | _ dS )zcFind *blk* in the blockstack and remove it and all blocks above it
        from the stack.
        r   N)r   r]  r  )r   r=  r   r   r   r   r   x  s     z_State.pop_block_and_abovec                 C   s0   t |}t| jD ]}|d |kr|  S qdS )1Find the first block that matches *kind*
        r   N)r   r   r   )r   r   bsr   r   r   rz     s    z_State.get_top_blockc                 G   s6   dd |D }t | jD ]}|d |v r|  S qdS )r  c                 S   s   h | ]}t |qS r   )r   )r   r   r   r   r   	<setcomp>  rG   z._State.get_top_block_either.<locals>.<setcomp>r   N)r   r   )r   kindsr  r   r   r   get_top_block_either  s    z_State.get_top_block_eitherc                 C   s   |  dduS )zGReturns a boolean indicating if the top-block is a *try* block
        r   N)rz   r#   r   r   r   ro     s    z_State.has_active_tryc                 C   s   | j j|j S )z4Get referenced variable name from the oparg
        )r=   co_varnamesr   r  r   r   r   r     s    z_State.get_varnamec                 C   s
   d| _ dS )z!Mark block as terminated
        TNr  r#   r   r   r   r)    s    z_State.terminater   c                 C   s  t | j}|rHd|  kr(t| jks.n J t| j| }|d| }|rtd|ksXJ t|D ]}||   q`t | j}tdkr|r|d }	|	dp|	d }
||
kr|	  qqqntdk rnt
t|r|| | jt|t||t|d |   dS )zFork the state
        r   Nrc   r   ri   rg   )r@   stackr   rB   )r   rP   r  r   rM   r   r   r   getr   r   r  Edger  r)  )r   r@   r   r   rm   r  rA   r8  rB   toprg   r   r   r   rs     s6    
 



z_State.forkc                 C   s   | j | jd dS )zSplit the state
        rf   N)rs   ry   r#   r   r   r   rV     s    z_State.split_new_blockc              	   C   sz   | j r
J g }| jD ]`}t| j|jt|j|jdd t|jD d}|	| |j
 D ]\}}|j| | j |< qZq|S )z+Get states for each outgoing edges
        c                 S   s   g | ]\}}t |r|qS r   )r   )r   r8  r  r   r   r   r     s   z._State.get_outgoing_states.<locals>.<listcomp>)r?   r@   rA   rB   r  )r   r  rI   r=   r@   r  r  rB   	enumeraterM   r   r   )r   retr   r`   r   r8  r   r   r   rY     s    



z_State.get_outgoing_statesc                 C   s   dd | j D S )z
        Returns
        -------
        Dict[int, int]
            where keys are the PC
            values are the edge-pushed stack values
        c                 S   s&   i | ]}|j t|j|j d  qS r   )r@   r  r  r   )r   r   r   r   r   
<dictcomp>  s   z2_State.get_outgoing_edgepushed.<locals>.<dictcomp>r  r#   r   r   r   get_outgoing_edgepushed  s    	z_State.get_outgoing_edgepushed)r   )r  )TN)r   r   N)*r/   r0   r1   r2   r    r.   r  r$   r,   r-   propertyrD   r  rW   r  r  rj   r  rR   rp   rv   r   rM   r  ro  r   r   r}  rE  r;  r|   r&  r   rz   r  ro   r   r)  rs   rV   rY   r  r   r   r   r   r    sX   
#


	


	


%r  c                       sL   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )
StatePy311c                    s   t  j|i | d | _d S r   )superr    	_kw_namesr7   	__class__r   r   r      s    zStatePy311.__init__c                 C   s   | j }d | _ |S r   r  )r   outr   r   r   rc    s    zStatePy311.pop_kw_namesc                 C   s   | j d u sJ || _ d S r   r  )r   r-  r   r   r   rg    s    zStatePy311.set_kw_namesc                 C   s   | j }|| jd uS r   r=   rM  ry   r   rQ  r   r   r   rw     s    zStatePy311.is_in_exceptionc                 C   s   | j }|| jS r   r  r  r   r   r   rx     s    zStatePy311.get_exceptionc                 C   s&   | j D ]}|d tdkr dS qd S )Nr   r   T)r  r   )r   entr   r   r   rn     s    
zStatePy311.in_withc                 C   s   | j ddS )Nr  rH  r   r#   r   r   r   r     s    zStatePy311.make_null)r/   r0   r1   r    rc  rg  rw   rx   rn   r   __classcell__r   r   r   r   r    s   r  rc   r  )r@   r  rB   r   c                   @   s$   e Zd ZdZdd Zedd ZdS )AdaptDFAz<Adapt Flow to the old DFA class expected by Interpreter
    c                 C   s
   || _ d S r   )_flow)r   flowr   r   r   r      s    zAdaptDFA.__init__c                 C   s   | j jS r   )r	  r>   r#   r   r   r   infos  s    zAdaptDFA.infosN)r/   r0   r1   r2   r    r  r  r   r   r   r   r    s   r  AdaptBlockInfoinstsr  rB   Zactive_try_blockZoutgoing_edgepushedc                 C   s$   t t| j| j| j|  |  dS )Nr  )r  r  r  r  r  r  r  r   r   r   r   r^   #  s    r^   c                 c   sB   | D ]8}t |tr|V  qt |ttfrt|D ]
}|V  q0qdS )z<Flatten an iterable of registers used in an instruction
    N)r'   strr  r   r  )r  r   rE   r   r   r   r  -  s    
r  c                   @   sL   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dS )AdaptCFAz<Adapt Flow to the old CFA class expected by Interpreter
    c                 C   s   || _ i | _|j D ]\}}t||| j|< q| j j }|j}| }t }| j	 D ]}|
|rZ|| qZ|| | _d S r   )r	  _blocksr>   r   AdaptCFBlockr   backboner   blocksr  Zin_loopsrX   	_backbone)r   r
  r   	blockinfor  r   Zinloopblocksr   r   r   r   r    ;  s    
zAdaptCFA.__init__c                 C   s   | j jS r   )r	  r   r#   r   r   r   r   N  s    zAdaptCFA.graphc                 C   s   | j S r   )r  r#   r   r   r   r  R  s    zAdaptCFA.backbonec                 C   s   | j S r   )r  r#   r   r   r   r  V  s    zAdaptCFA.blocksc                 c   s    t | jD ]}| j| V  q
d S r   )r]   r  r  r   r   r   iterliveblocksZ  s    zAdaptCFA.iterliveblocksc                 C   s   | j j  d S r   )r	  r   r<   r#   r   r   r   r<   ^  s    zAdaptCFA.dumpN)r/   r0   r1   r2   r    r  r   r  r  r  r<   r   r   r   r   r  8  s   


r  c                   @   s   e Zd Zdd ZdS )r  c                 C   s    || _ tdd |jD | _d S )Nc                 s   s   | ]\}}|V  qd S r   r   )r   r8  r   r   r   r   rJ  e  rG   z(AdaptCFBlock.__init__.<locals>.<genexpr>)r   r  r  body)r   r  r   r   r   r   r    c  s    zAdaptCFBlock.__init__N)r/   r0   r1   r    r   r   r   r   r  b  s   r  ).r2   r  pprintr   loggingcollectionsr   r   r   	functoolsr   Znumba.core.utilsr   r   r	   Znumba.core.controlflowr
   r   Znumba.core.irr   Znumba.core.errorsr   	getLoggerr/   r:   r   r   r3   rr   objectr   r4   r9   r   rJ   r  r  rI   r   r  r  r  r^   r  r  r  r   r   r   r   <module>   sb   
 	 k           9


*