o
    ixB                    @   s  d Z ddl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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dv r^ddlmZ G dd deZeZn	edv rcne ee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'G dd de'Z(edv re(Z)nedv re'Z)ned k re&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!Z0dS )/z)
Implement python 3.8+ bytecode analysis
    N)
namedtupledefaultdictdeque)total_ordering)
UniqueDict	PYVERSIONALL_BINOPS_TO_OPERATORS_lazy_pformat)NEW_BLOCKERSCFGraph)Loc)UnsupportedBytecodeError   >   NOPPRECALL
LOAD_CONST
LOAD_DEREF      r      r      )Enumc                   @   s   e Zd ZdZdZdZdS )CALL_INTRINSIC_1_Operandr      r   N)__name__
__module____qualname__INTRINSIC_STOPITERATION_ERRORUNARY_POSITIVEINTRINSIC_LIST_TO_TUPLE r$   r$   Q/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/numba/core/byteflow.pyr      s    r   r   
   r      c                   @   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`.
    >   TRYLOOPWITHEXCEPTFINALLYWITH_FINALLYc                 C   s   || j v sJ || _d S N)_members_value)selfvaluer$   r$   r%   __init__4      
zBlockKind.__init__c                 C   s   t t| | jfS r2   )hashtyper4   r5   r$   r$   r%   __hash__8   s   zBlockKind.__hash__c                 C   s(   t |tr| j|jk S tdt|Nzcannot compare to {!r}
isinstancer+   r4   	TypeErrorformatr:   r5   otherr$   r$   r%   __lt__;      
zBlockKind.__lt__c                 C   s(   t |tr| j|jkS tdt|r=   r>   rB   r$   r$   r%   __eq__A   rE   zBlockKind.__eq__c                 C   s   d | jS )NzBlockKind({}))rA   r4   r;   r$   r$   r%   __repr__G      zBlockKind.__repr__N)r   r   r    __doc__	frozensetr3   r7   r<   rD   rF   rG   r$   r$   r$   r%   r+   *   s    r+   c                   @   s   e Zd ZdZdd Zdd Zedv rdd Zned	v r d
d Zneedd Z	dd Z
dd Zedv r:dd ZdS edv rDdd ZdS ee)FlowziData+Control Flow analysis.

    Simulate execution to recover dataflow and controlflow information.
    c                 C   s*   t dt|dd d || _t | _d S )Nzbytecode dump:
%sc                 S   s   |   S r2   )dumpxr$   r$   r%   <lambda>R   s    zFlow.__init__.<locals>.<lambda>)	lazy_func)_loggerdebugr	   	_bytecoder   block_infos)r5   bytecoder$   r$   r%   r7   P   s
   zFlow.__init__c                 C   sL  t | jdddd}t| jjjd}|j| t }|jr|t	d|j |j
 }||jvryt	d|j t	d| |||j< 	 || | rKn| ||rRn| |ra| | |  nqAt	d	|j |j| | }|j| |js| |j | | t|jd
d dD ]}t| | j|j< }t	d|| qd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$   )rU   pcnstack
blockstack)debug_filenamezpending: %sz	stack: %szstate.pc_initial: %sTzend state. edges=%sc                 S      | j S r2   )
pc_initialrM   r$   r$   r%   rO      s    zFlow.run.<locals>.<lambda>)keyzblock_infos %s:
%sN)StaterS   TraceRunnerfunc_idfilenamependingappendr   rQ   rR   popleftfinished_stackr[   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_infosrT   )r5   
firststaterunnerfirst_encounterstate
out_statessir$   r$   r%   runV   sF   








zFlow.runr)   r   r   r   c                 C   s   |  s| r| jtvr|j| jd || dS |  |  sl|	 rnt
d| |j | }|d}|rK|d |jkrKd }d S |jd|jd}|j|d< |j|d< |j|d	< |j|j|d
 dS d S d S )NrV   Tz3.11 exception %s PC=%sr,   endr}   
end_offsetstack_depth
push_lastirV   extra_block)in_withhas_active_tryget_instopname_NO_RAISE_OPSforknext_adjust_except_stack
advance_pcis_in_exceptionrQ   rR   get_exception_pcget_top_blocktarget
make_blockr}   depthlasti)r5   ru   rw   eheh_topeh_blockr$   r$   r%   rh      s.   





zFlow._run_handle_exceptionr'   c                 C   s   |  rW| jtvrW|j| jd |d}|| |j}i }||d kr1||d  |d< |d }t	dt
t	dti|d  |d	< ||d
< |jdd|d i| dS |  d S )Nr|   r,   entry_stacknpophandlerr/   r0   kindnpushr   rV   r}   Tr$   )r   r   r   r   r   r   r   pop_block_and_abover   r+   _EXCEPT_STACK_OFFSET_FINALLY_POPr   )r5   ru   rw   tryblkrW   kwargsr   r$   r$   r%   rh      s&   

c                 C   sd   t  }|D ]
}|j}|| q|D ]}|jD ]}||j|jd qq|d |  || _d S )Nr   )	r   r[   add_noderl   add_edgerV   set_entry_pointprocesscfgraph)r5   
all_statesgraphrw   bedger$   r$   r%   rp      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 ]}t|j}t|j}| |  ||@ O  < ||O }q
| |fS r2   )r   setrd   
_used_regs_phis)	used_phisphi_setrw   usedphisru   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r|| |< || ||f qq	tdt|  tdt| | |fS )Nz
defmap: %szphismap: %s)	r   r   rd   _outgoing_phisitemsrm   rQ   rR   r	   )defmapphismaprw   phirhsr   ru   r$   r%   find_use_defs   s   
z'Flow._prune_phis.<locals>.find_use_defsc                    s   t t}	 d}tt|  D ]0\}}tt|D ]\}}| v r0|| | O }|| ||f q|| }||@ r?||8 }d}qtdt|  |sLdS q)znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            TFzchanging phismap: %sN)	r   r   rr   listr   rm   rQ   rR   r	   )r   	blacklistchangingr   defsitesr   rw   	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 ]
\}}||| |< q*q$tdt|  jD ]}|j  |j	||  qAd S )Nzkeep phismap: %sznew_out: %s)
r   rQ   rR   r	   r   dictrd   r   clearupdate)r   r   keeprw   used_setr   new_outr   r   r$   r%   apply_changes  s    

z'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)rQ   rR   centerr	   )	r5   ru   r   r   r   r   r   r   r   r$   r   r%   rq      s   


zFlow._prune_phisc                 C   s,   |  }|j| jjv rdS |jtv rdS dS )NTF)r   offsetrS   labelsr   r
   r5   rw   instr$   r$   r%   ri     s   
zFlow._is_implicit_new_blockr   c                 C      d S r2   r$   )r5   rw   r$   r$   r%   rj   )  s   zFlow._guard_with_asr'   r)   r   r   c                 C   s<   |  }|jdv r| j|j j}|dkrd}t|dS 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)`).>   
SETUP_WITHBEFORE_WITHPOP_TOPGThe 'with (context manager) as (variable):' construct is not supported.N)r   r   rS   r   r   )r5   rw   current_instnext_opmsgr$   r$   r%   rj   -  s   
N)r   r   r    rI   r7   rz   r   rh   NotImplementedErrorrp   rq   ri   rj   r$   r$   r$   r%   rK   K   s"    :

M
rK   c                 C   
   |  dS )Nz$null$)
startswith)regr$   r$   r%   _is_null_temp_reg=     
r   c                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Ze	dv r!eZ
n	e	dv r&nee	dd Zdd Zdd Zdd Zdd Ze	dv rGdd Zn	e	dv rLnee	dd Zdd Zd d! Ze	dv rceZn	e	dv rhnee	e	dv rud"d# Zn	e	dv rznee	e	dv rd$d% Zne	d&v rd'd% Zne	d(v rd)d% Znee	d*d+ Zd,d- Zd.d/ Zd0d1 Ze	dv rd2d3 Zn	e	dv rnee	d4d5 Zd6d7 Ze	dv rd8d9 Zd:d; Z d<d= Z!n	e	dv rnee	e	d>v reZ"eZ#n	e	d?v rnee	e	dv reZ$eZ%n
e	dv rnee	d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+dLdM Z,dNdO Z-dPdQ Z.dRdS Z/dTdU Z0dVdW Z1dXdY Z2dZd[ Z3d\d] Z4d^d_ Z5d`da Z6e	d>v rTdbdc Z7n
e	d?v rZnee	e	d>v rhddde Z8n
e	d?v rnnee	dfdg Z9e9Z:e9Z;e	d>v re9Z<e9Z=n
e	d?v rnee	dhdi Z>e>Z?e>Z@djdk ZAdldm ZBdndo ZCdpdq ZDdrds ZEdtdu ZFdvdw ZGdxdy ZHdzd{ ZId|d} ZJeJZKd~d ZLdd ZMdd ZNe	d>v rdd ZOn
e	d?v rnee	dd ZPe	dv rdd ZQne	d(v rdd ZQnee	dd ZRdd ZSe	dv rdd ZTne	dv rdd ZTn
e	d?v rnee	dd ZUdd ZVdd ZWdd ZXdd ZYdd ZZe	dv r@ne	dv rJdd Z[nee	dd Z\dd Z]dd Z^dd Z_e	dv rhdd Z`ne	d(v rrdd Z`nee	dd Zae	dv rne	dv rdd Zbnee	dd Zcdd Zddd Zedd Zfdd Zgdd Zhe	dv rdd Zin
e	dv rnee	e	dv rdd Zjne	dv rdd Zjne	dv rdd Zjnee	ddń Zke	d>v rddǄ Zln
e	d?v rnee	ddɄ Zmdd˄ Zndd̈́ Zoddτ Zpddф Zqddӄ ZrddՄ Zsddׄ Ztddل Zuddۄ Zvdd݄ Zwdd߄ Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d ZeZeZeZeZdd ZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZd!ddZdd Zd	d
 Zdd Ze	dv rne	dv rdd Znee	dd Zdd Ze	dv rdd Zne	d(v r
dd Znee	e	d>v rne	dv r!dd Zne	d(v r-dd Znee	dd Ze	dv rCdd Zn
e	dv rInee	e	dv r[dd Zd S e	dv rcd S ee	("  r^   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ t | _t | _d S r2   )rY   r   ra   r   rd   )r5   rY   r$   r$   r%   r7   D  s   zTraceRunner.__init__c                 C   s   t | j|S r2   )r   rY   )r5   linenor$   r$   r%   get_debug_locI  rH   zTraceRunner.get_debug_locc                 C   s   t dv r'|jr&|jr&|jd }|d }|d ur"||jkr"|j  nn|js
n	t dv r,ntt | }|jdkrHtd|j	| td|j
 t| d|jd }|d ur]||| d S d	|j }t|| |jd
)Nr{   r}   r   CACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) foundloc)r   _blockstackr[   popr   r   r   rQ   rR   r   re   getattrrA   r   r   r   )r5   rw   topblkblk_endr   fnr   r$   r$   r%   rf   L  s0   



zTraceRunner.dispatchc                 C   sr   | d}|| |j}i }|d }||kr|| |d< d}|d r'|d7 }||d< |jd
d|d i| d	S )zo
        Adjust stack when entering an exception handler to match expectation
        by the bytecode.
        r,   r   r      r   r   rV   r}   Nr$   )r   r   r   r   )r5   rw   r   rW   r   expected_depthextra_stackr$   r$   r%   r   g  s   

z TraceRunner._adjust_except_stackc                 C      | | d S r2   rb   r   r$   r$   r%   op_NOP{     zTraceRunner.op_NOPr   r   c                 C   r   r2   r   r   r$   r$   r%   	op_RESUME  r   zTraceRunner.op_RESUMEc                 C   r   r2   r   r   r$   r$   r%   op_CACHE  r   zTraceRunner.op_CACHEc                 C   r   r2   r   r   r$   r$   r%   
op_PRECALL  r   zTraceRunner.op_PRECALLc                 C      | |  || d S r2   )push	make_nullrb   r   r$   r$   r%   op_PUSH_NULL  s   zTraceRunner.op_PUSH_NULLc                 C   r   r2   )r   	make_temprb   r   r$   r$   r%   op_RETURN_GENERATOR  s   
zTraceRunner.op_RETURN_GENERATORr   r   c                 C   s8   |  }| }| }|j||||d || d S )Nr6   resstrvarr   r   rb   r   )r5   rw   r   r6   r   r   r$   r$   r%   op_FORMAT_SIMPLE  
   zTraceRunner.op_FORMAT_SIMPLEr'   r)   r   c                 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   N)argr   r   r   r   r   rb   r   )r5   rw   r   r   r6   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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                       g | ]}   qS r$   r   .0_rw   r$   r%   
<listcomp>      z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>r   c                    r  r$   r   r	  r  r$   r%   r    r  r   )stringstmpsr   Nr  r   reversedranger   rb   r   )r5   rw   r   countr  r  r$   r  r%   op_BUILD_STRING  s   zTraceRunner.op_BUILD_STRINGc                 C      |   d S r2   r  r   r$   r$   r%   
op_POP_TOP  rH   zTraceRunner.op_POP_TOPc                 C   s.   |  }| }|j|||d || d S )N)valr   )r   r   rb   r   )r5   rw   r   r   tosr$   r$   r%   
op_TO_BOOL     zTraceRunner.op_TO_BOOLc                 C   sL   |  }|jd? }|j|||d || |jd@ r$||  d S d S Nr   )idxr   r   r  rb   r   r   r5   rw   r   r   r  r$   r$   r%   op_LOAD_GLOBAL  s   


zTraceRunner.op_LOAD_GLOBALr)   r   c                 C   sH   |  }|jd? }|j|||d |jd@ r||  || d S r  r  r   r$   r$   r%   r!    s   

r   c                 C   $   |  }|j||d || d S Nr   r   rb   r   r5   rw   r   r   r$   r$   r%   r!       c                 C   r   r2   r   r   r$   r$   r%   op_COPY_FREE_VARS   r   zTraceRunner.op_COPY_FREE_VARSc                 C   r   r2   r   r   r$   r$   r%   op_MAKE_CELL  r   zTraceRunner.op_MAKE_CELLc                 C   r#  r$  r&  r'  r$   r$   r%   op_LOAD_DEREF  r(  zTraceRunner.op_LOAD_DEREFc                 C   s2   | dd|j  }|| |j||d d S )Nconst.r%  )r   r  r   rb   r'  r$   r$   r%   op_LOAD_CONST  s   
zTraceRunner.op_LOAD_CONSTc                 C   sP   d|j   krdk sJ  J |dd|j   }|| |j||d d S )Nr      r,  r-  r%  )r  r   r   rb   r'  r$   r$   r%   op_LOAD_SMALL_INT  s   
zTraceRunner.op_LOAD_SMALL_INTc                 C   s   |  }| }tdv r|| |jd@ r||  n$tdv r4|jd@ r.||  || ntdv r>|| ntt|j|||d d S )Nr   r   r   r&   itemr   )r   r   r   r   r  r   r   rb   )r5   rw   r   r3  r   r$   r$   r%   op_LOAD_ATTR  s   


zTraceRunner.op_LOAD_ATTRc           
      C   s   t dv rNz||}W nP tyM   |j}t|j}t|j}t|j}|| }d|j|   kr6|k s9J  J |	 }	|j
||	dd ||	 Y d S w t dv rX||}ntt |	|}	|j
||	d ||	 d S )Nr   r   T)r   as_load_derefr  r%  )r   get_varname
IndexErrorrS   lenco_varnamesco_freevarsco_cellvarsr  r   rb   r   r   )
r5   rw   r   namebcnum_varnamesnum_freevarsnum_cellvarsmax_fast_localr   r$   r$   r%   op_LOAD_FAST.  s*   


"

zTraceRunner.op_LOAD_FASTc           
      C   sf   |j }|d? }|d@ }||}||}||}||}	|j|||	d || ||	 d S )N      )res1res2)r  get_varname_by_argr   rb   r   )
r5   rw   r   opargoparg1oparg2name1name2rE  rF  r$   r$   r%   op_LOAD_FAST_LOAD_FASTK  s   




z"TraceRunner.op_LOAD_FAST_LOAD_FASTc                 C   sH   |j }|d@ }| }||}||}|j|||d || d S )NrD  )store_valueload_res)r  r   rG  r   rb   r   )r5   rw   r   rH  rJ  rN  	load_namerO  r$   r$   r%   op_STORE_FAST_LOAD_FASTW  s   

z#TraceRunner.op_STORE_FAST_LOAD_FASTc                 C   $   |  }|  }|j|||d d S )N)value1value2r   rb   )r5   rw   r   rS  rT  r$   r$   r%   op_STORE_FAST_STORE_FASTa     z$TraceRunner.op_STORE_FAST_STORE_FASTr   r&   c                 C   r   r2   r   r   r$   r$   r%   op_DELETE_FAST|  r   zTraceRunner.op_DELETE_FASTc                 C      |  }|j||d d S )N)r   rU  )r5   rw   r   r   r$   r$   r%   op_DELETE_ATTR     zTraceRunner.op_DELETE_ATTRc                 C   rR  )N)r   r6   rU  )r5   rw   r   r   r6   r$   r$   r%   op_STORE_ATTR  rW  zTraceRunner.op_STORE_ATTRc                 C   rY  N)r6   rU  r5   rw   r   r6   r$   r$   r%   op_STORE_DEREF  r[  zTraceRunner.op_STORE_DEREFc                 C   rY  r]  rU  r^  r$   r$   r%   op_STORE_FAST  r[  zTraceRunner.op_STORE_FASTc           	   	   C   V   |  }|  }| }| }| }| }|j|||||||d || dS )z"
        TOS = TOS1[TOS:]
        )basestartr   slicevarindexvarnonevarNr  	r5   rw   r   r  tos1r   rd  re  rf  r$   r$   r%   
op_SLICE_1      	zTraceRunner.op_SLICE_1c           	   	   C   ra  )z"
        TOS = TOS1[:TOS]
        )rb  stopr   rd  re  rf  Nr  rg  r$   r$   r%   
op_SLICE_2  rj  zTraceRunner.op_SLICE_2c           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || dS )z&
        TOS = TOS2[TOS1:TOS]
        )rb  rc  rk  r   rd  re  Nr  )	r5   rw   r   r  rh  tos2r   rd  re  r$   r$   r%   
op_SLICE_3  rj  zTraceRunner.op_SLICE_3c                 C   sB   |  }|  }| }| }| }|j||||||d dS )z
        TOS[:] = TOS1
        )rb  r6   rd  re  rf  Nr   r   rb   )r5   rw   r   r  r6   rd  re  rf  r$   r$   r%   op_STORE_SLICE_0     
zTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )rb  rc  rd  r6   re  rf  Nro  	r5   rw   r   r  rh  r6   rd  re  rf  r$   r$   r%   op_STORE_SLICE_1     
zTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )rb  rk  r6   rd  re  rf  Nro  rr  r$   r$   r%   op_STORE_SLICE_2  rt  zTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rb  rc  rk  r6   rd  re  Nro  )	r5   rw   r   r  rh  rm  r6   rd  re  r$   r$   r%   op_STORE_SLICE_3	  rt  zTraceRunner.op_STORE_SLICE_3c                 C   s8   |  }| }| }| }|j|||||d dS )z
        del TOS[:]
        )rb  rd  re  rf  Nro  )r5   rw   r   r  rd  re  rf  r$   r$   r%   op_DELETE_SLICE_0  s   
zTraceRunner.op_DELETE_SLICE_0c                 C   B   |  }|  }| }| }| }|j||||||d dS )z 
        del TOS1[TOS:]
        )rb  rc  rd  re  rf  Nro  r5   rw   r   r  rh  rd  re  rf  r$   r$   r%   op_DELETE_SLICE_1*  rq  zTraceRunner.op_DELETE_SLICE_1c                 C   rx  )z 
        del TOS1[:TOS]
        )rb  rk  rd  re  rf  Nro  ry  r$   r$   r%   op_DELETE_SLICE_2<  rq  zTraceRunner.op_DELETE_SLICE_2c                 C   sB   |  }|  }|  }| }| }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )rb  rc  rk  rd  re  Nro  )r5   rw   r   r  rh  rm  rd  re  r$   r$   r%   op_DELETE_SLICE_3N  s   

zTraceRunner.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)
           Nr   unreachable)rc  rk  stepr   rd  )r  r   	Exceptionr   rb   r   )r5   rw   r   argcr  rh  rc  rk  r  rm  rd  r   r$   r$   r%   op_BUILD_SLICE\  s*   zTraceRunner.op_BUILD_SLICEc           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || d S )N)rc  r}   	containerr   rd  temp_resr  )	r5   rw   r   r}   rc  r  r  r   rd  r$   r$   r%   op_BINARY_SLICEx  s   
zTraceRunner.op_BINARY_SLICEc           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d d S )N)rc  r}   r  r6   r   rd  ro  )	r5   rw   r   r}   rc  r  r6   rd  r   r$   r$   r%   op_STORE_SLICE  s   

zTraceRunner.op_STORE_SLICEc                 C   sL   |  }|j||d | }|j}|j|d ||kr$|j|d d S d S )Npredr|   )r   rb   get_jump_targetr   r   )r5   rw   r   r  target_inst	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   rV   r   r|   )get_tosrb   r   r   r  )r5   rw   r   r  r$   r$   r%   _op_JUMP_IF_OR_POP  s   zTraceRunner._op_JUMP_IF_OR_POPc                 C      |  || d S r2   r  r   r$   r$   r%   op_POP_JUMP_FORWARD_IF_NONE     z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_FORWARD_IF_NOT_NONE  r  z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_BACKWARD_IF_NONE  r  z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   r  r2   r  r   r$   r$   r%    op_POP_JUMP_BACKWARD_IF_NOT_NONE  r  z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_FORWARD_IF_FALSE  r  z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_FORWARD_IF_TRUE  r  z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_BACKWARD_IF_FALSE  r  z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   r  r2   r  r   r$   r$   r%   op_POP_JUMP_BACKWARD_IF_TRUE  r  z(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUEc                 C      | | |j| d d S Nr|   rb   r   r  r   r$   r$   r%   op_JUMP_FORWARD     
zTraceRunner.op_JUMP_FORWARDc                 C   r  r  r  r   r$   r$   r%   op_JUMP_BACKWARD  r  zTraceRunner.op_JUMP_BACKWARDc                 C   r  r  r  r   r$   r$   r%   op_JUMP_ABSOLUTE  r  zTraceRunner.op_JUMP_ABSOLUTEc                 C   s4   | dd }|j||d |  |j|d d S )Nr-   r}   r~   r|   )r   rb   	pop_blockr   )r5   rw   r   r}   r$   r$   r%   op_BREAK_LOOP  s   zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || | d |  d S )Nretvalcastval)rb   r   r   	terminater   r$   r$   r%   op_RETURN_VALUE  s   zTraceRunner.op_RETURN_VALUEc                 C   s*   | d}|j|||  d |  d S )Nr,  r  )r   rb   r  r'  r$   r$   r%   op_RETURN_CONST  s   
zTraceRunner.op_RETURN_CONSTc                 C   .   |  }| }|j|||d || d S N)r6   r   r  r5   rw   r   r  r   r$   r$   r%   op_YIELD_VALUE  r  zTraceRunner.op_YIELD_VALUEr{   c                 C   sx   |j dkrd }| rtd| |jdn|j dkr | }ntd|j||d | r6| | d S |	  d S )Nr   4The re-raising of an exception is not yet supported.r   r   )Multiple argument raise is not supported.exc)
r  r   r   r   r   r   
ValueErrorrb   r   r  r5   rw   r   r  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r$d }|r#td| |jdn|jdkr.| }ntd|j||d |	  d S )	Nr/   r0   r   r  r   r   r  r  )
anyr   r  r   r   r   r   r  rb   r  )r5   rw   r   in_exc_blockr  r$   r$   r%   r    s"   



c                 C   s@   g }t tD ]}| }|| || q|j||d d S )N)temps)r  r   r   rb   r   )r5   rw   r   r  itmpr$   r$   r%   op_BEGIN_FINALLY(  s   
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  }||d  d S )Nr   )r  reset_stackr5   rw   r   blkr$   r$   r%   op_END_FINALLY0  r[  zTraceRunner.op_END_FINALLYc                 C   r  r2   r  r   r$   r$   r%   
op_END_FOR5  rH   zTraceRunner.op_END_FORr1  c                 C   s   |   |   d S r2   r  r   r$   r$   r%   r  8     c                 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   )r5   rw   r   r   r$   r$   r%   op_POP_FINALLY@  s   

zTraceRunner.op_POP_FINALLYc                 C   r   r2   r$   r   r$   r$   r%   op_CALL_FINALLYH  s   zTraceRunner.op_CALL_FINALLYc                 C   r  r2   )r  r   r$   r$   r%   op_WITH_EXCEPT_STARTK  rH   z TraceRunner.op_WITH_EXCEPT_STARTc                 C   r   r2   r   r   r$   r$   r%   op_WITH_CLEANUP_STARTN     z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   r   r2   r   r   r$   r$   r%   op_WITH_CLEANUP_FINISHR  r  z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   | |jd| d d S )Nr-   r   r}   )
push_blockr   r  r   r$   r$   r%   op_SETUP_LOOPV  s   zTraceRunner.op_SETUP_LOOPc                 C   s   |  }| }|jdd}|| || |j}||j}|g}|jD ]}	|	j|jkr4||	 q't	dd |D }
|j||||
d |
|jd|
d |j|jd d S )	Nsetup_with_exitfnprefixc                 s       | ]}|j V  qd S r2   r~   r
  r   r$   r$   r%   	<genexpr>u      z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)contextmanagerexitfnr}   r.   r  r|   )r   r   r   rS   find_exception_entryr   exception_entriesr   rb   maxr  r   r   )r5   rw   r   cmyieldedr  r=  ehhead	ehrelatedr   r}   r$   r$   r%   op_BEFORE_WITHb  s*   



zTraceRunner.op_BEFORE_WITHc                 C   sj   |  }| }|jdd}|j|||d || || ||jd| d |j|jd d S )Nr  r  )r  r  r.   r  r|   )	r   r   rb   r   r  r   r  r   r   )r5   rw   r   r  r  r  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   r}   r  r,   )r   r}   r  r   r   )r   r   )r5   r   rw   r   r}   handler_blockr$   r$   r%   
_setup_try  s   
zTraceRunner._setup_tryc                 C   s&   |  }||d || d S )N	exception)r   r   r   )r5   rw   r   r  r$   r$   r%   op_PUSH_EXC_INFO  s   zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   | | | jd||j| d d S )Nr0   )r   r}   )rb   r  r   r  r   r$   r$   r%   op_SETUP_FINALLY  s   

zTraceRunner.op_SETUP_FINALLYc                 C   r  r2   r  r   r$   r$   r%   op_POP_EXCEPT  rH   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/   r0   z$POP_EXCEPT got an unexpected block: r   r|   )r  r+   r   r   r   r   r   r   r  r$   r$   r%   r    s   
c                 C   sX   |  }|d tdkr|j|dd n|d tdkr#|j|dd |j|jd d S )Nr   r,   try)r   r.   withr|   )r  r+   rb   r   r   r  r$   r$   r%   op_POP_BLOCK  s   zTraceRunner.op_POP_BLOCKc                 C   s8   |  }|  }| }|j||||d || d S )N)indexr   r   r  )r5   rw   r   r  r   r   r$   r$   r%   op_BINARY_SUBSCR  r  zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  }|  }|  }|j||||d d S )N)r   r  r6   rU  )r5   rw   r   r  r   r6   r$   r$   r%   op_STORE_SUBSCR  s   zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  }|  }|j|||d d S )N)r   r  rU  )r5   rw   r   r  r   r$   r$   r%   op_DELETE_SUBSCR  rW  zTraceRunner.op_DELETE_SUBSCRc                    s   |j }tt fddt|D }tdv r*  }  }t|s'|g|}d }ntdk rH  }  }	t|	r=|}n|	}|g|}  }  }
 j	|||||
d  
|
 d S )Nc                    r  r$   r  r	  r  r$   r%   r    r  z'TraceRunner.op_CALL.<locals>.<listcomp>r   r   funcargskw_namesr   )r  r   r  r  r   r   r   pop_kw_namesr   rb   r   )r5   rw   r   nargr  null_or_selfcallabler  callable_or_firstargnull_or_callabler   r$   r  r%   op_CALL  s&   

zTraceRunner.op_CALLc                 C      | |j d S r2   )set_kw_namesr  r   r$   r$   r%   op_KW_NAMES  r  zTraceRunner.op_KW_NAMESc                    sT   |j }tt fddt|D }  }  } j||||d  | d S )Nc                    r  r$   r  r	  r  r$   r%   r    r  z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>)r  r  r   )r  r   r  r  r   r   rb   r   )r5   rw   r   r  r  r  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                    r  r$   r  r	  r  r$   r%   r    r  z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>)r  r  namesr   )r  r   r   r  r  r   rb   r   )r5   rw   r   r  r  r  r  r   r$   r  r%   op_CALL_FUNCTION_KW  s   zTraceRunner.op_CALL_FUNCTION_KWc           	         sx   |j }  }tt fddt|D }  }  }t|s'|g|}  } j|||||d  | d S )Nc                    r  r$   r  r	  r  r$   r%   r    r  z*TraceRunner.op_CALL_KW.<locals>.<listcomp>r  )	r  r   r   r  r  r   r   rb   r   )	r5   rw   r   r  r  r  null_or_firstargr  r   r$   r  r%   
op_CALL_KW  s   
zTraceRunner.op_CALL_KWc                 C   sV   |  }t|r
d }|  }|   |  }| }|j|||||d || d S )Nr  varargvarkwargr   )r   r   r   rb   r   r5   rw   r   r  r  r  r   r$   r$   r%   op_CALL_FUNCTION_EX,  s   zTraceRunner.op_CALL_FUNCTION_EX)r   c                 C   sZ   |j d@ r
| }nd }| }|  | }| }|j|||||d || d S )Nr   r  )r  r   r   rb   r   r  r$   r$   r%   r   <  s   

c                 C   s   |j d@ r
| }nd }| }| }tdv r$t|dr#|  n	tdv r)ntt| }|j|||||d || d S )Nr   r"  r   r  )	r  r   r   r   peekr   r   rb   r   r  r$   r$   r%   r   L  s"   

c                    sp    fddt |D }|   fddt |D } j|||d |D ]} | q$|D ]} | q.d S )Nc                    r  r$   r  r	  r  r$   r%   r  d  r  z)TraceRunner._dup_topx.<locals>.<listcomp>c                    r  r$   r  r	  r  r$   r%   r  h  r  )origduped)r  reverserb   r   )r5   rw   r   r  r  r  r  r$   r  r%   	_dup_topxc  s   zTraceRunner._dup_topxc           	      C   s   zt |j}W n ty!   d|j d}| |j}t||dw |tjkr4|j||d |	  d S |tj
krQ| }| }|j||||d || d S |tjkrn| }| }|j||||d || d S t|)Nzop_CALL_INTRINSIC_1()r   )operand)r  r6   r   )r  
const_listr   )r   r  r@   r   r   r   ci1opr!   rb   r  r"   r   r   r   r#   r   )	r5   rw   r   r  r   r   r  r   r  r$   r$   r%   op_CALL_INTRINSIC_1p  s8   




zTraceRunner.op_CALL_INTRINSIC_1c                 C   s<   |j }d|  krdksJ d J d| ||| d S )Nr   r   zInvalid DUP_TOPX count)r  r  )r5   rw   r   r  r$   r$   r%   op_DUP_TOPX  s   $zTraceRunner.op_DUP_TOPXc                 C      | j ||dd d S )Nr   r  r  r   r$   r$   r%   
op_DUP_TOP     zTraceRunner.op_DUP_TOPc                 C   r  )Nr}  r  r  r   r$   r$   r%   op_DUP_TOP_TWO  r  zTraceRunner.op_DUP_TOP_TWOc                 C   s   | ||j d S r2   )r   r  r  r   r$   r$   r%   op_COPY  s   zTraceRunner.op_COPYc                 C   r  r2   )swapr  r   r$   r$   r%   op_SWAP  r  zTraceRunner.op_SWAPc                 C   s(   |  }|  }|| || d S r2   r   r   )r5   rw   r   firstsecondr$   r$   r%   
op_ROT_TWO  s   
zTraceRunner.op_ROT_TWOc                 C   s:   |  }|  }|  }|| || || d S r2   r  )r5   rw   r   r  r  thirdr$   r$   r%   op_ROT_THREE  s   

zTraceRunner.op_ROT_THREEc                 C   sL   |  }|  }|  }|  }|| || || || d S r2   r  )r5   rw   r   r  r  r  forthr$   r$   r%   op_ROT_FOUR  s   


zTraceRunner.op_ROT_FOURc                    sZ   |j }  } fddt|D }  } j||||d t|D ]} | q#d S )Nc                    r  r$   r  r	  r  r$   r%   r    r  z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)iterablestorestupleobj)r  r   r  r   rb   r  r   )r5   rw   r   r  r  r  r  str$   r  r%   op_UNPACK_SEQUENCE  s   zTraceRunner.op_UNPACK_SEQUENCEc                    J   |j }tt fddt|D }  } j|||d  | d S )Nc                    r  r$   r  r	  r  r$   r%   r    r  z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>r   r   r  )r5   rw   r   r  r   tupr$   r  r%   op_BUILD_TUPLE  
   zTraceRunner.op_BUILD_TUPLEc                    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    r  z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>c                    r  r$   r  r	  r  r$   r%   r    r  r   )tuplesr  	is_assignr   )r   r  r  r  r8  r   rb   r   )r5   rw   r   r'  r  r(  r$   r  r%   _build_tuple_unpack  s    
zTraceRunner._build_tuple_unpackc                 C   r  r2   r)  r   r$   r$   r%   op_BUILD_TUPLE_UNPACK_WITH_CALL     z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   r  r2   r*  r   r$   r$   r%   op_BUILD_TUPLE_UNPACK  r  z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   r  )N)r  r   r  )r5   rw   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                    r  r$   r  r	  r  r$   r%   r    r  z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    r  r$   r  r	  r  r$   r%   r    r  )keyskeytmpsvaluesr   )r   r   r  r  r  r   rb   r   )r5   rw   r   r/  valsr0  r   r$   r  r%   op_BUILD_CONST_KEY_MAP  s    z"TraceRunner.op_BUILD_CONST_KEY_MAPc                    r"  )Nc                    r  r$   r  r	  r  r$   r%   r    r  z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>r#  r  )r5   rw   r   r  r   lstr$   r  r%   op_BUILD_LIST  r&  zTraceRunner.op_BUILD_LISTc                 C   @   |  }|j}||}| }| }|j|||||d d S )N)r   r6   	appendvarr   r   r  r  r   rb   )r5   rw   r   r6   r  r   r7  r   r$   r$   r%   op_LIST_APPEND     

zTraceRunner.op_LIST_APPENDc                 C   r6  )N)r   r6   	extendvarr   r8  )r5   rw   r   r6   r  r   r;  r   r$   r$   r%   op_LIST_EXTEND  r:  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   rb   r   )	r5   rw   r   dctr  r   r  vkr$   r$   r%   op_BUILD_MAP  s   zTraceRunner.op_BUILD_MAPc                 C   sT   |  }|  }||}}|j}||}| }	| }
|j|||||	|
d d S )N)r   r\   r6   
setitemvarr   r8  )r5   rw   r   TOSTOS1r\   r6   r  r   rB  r   r$   r$   r%   
op_MAP_ADD  s   


zTraceRunner.op_MAP_ADDc                    r"  )Nc                    r  r$   r  r	  r  r$   r%   r  $  r  z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>r#  r  )r5   rw   r   r  r   r   r$   r  r%   op_BUILD_SET!  s
   zTraceRunner.op_BUILD_SETc                 C   s8   |  }| }| }| }|j|||||d d S )N)r6   r   addvarr   )r   r  r   rb   )r5   rw   r   r6   r   rG  r   r$   r$   r%   
op_SET_ADD)  s
   zTraceRunner.op_SET_ADDc                 C   r6  N)r   r6   	updatevarr   r8  r5   rw   r   r6   r  r   rJ  r   r$   r$   r%   op_SET_UPDATE0  r:  zTraceRunner.op_SET_UPDATEc                 C   r6  rI  r8  rK  r$   r$   r%   op_DICT_UPDATE9  r:  zTraceRunner.op_DICT_UPDATEc                 C   r  r  r  )r5   rw   r   r6   r   r$   r$   r%   op_GET_ITERB  r  zTraceRunner.op_GET_ITERc                 C   s   |  }| }| }| }|j|||||d || | }tdv r.|j|d ntdv r:|j|dd ntt|j|jd d S )N)iteratorpairindvalr  r   r|   r&   r}  r  )	r  r   rb   r   r  r   r   r   r   )r5   rw   r   rO  rP  rQ  r  r}   r$   r$   r%   op_FOR_ITERH  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 }| }| }|dkr/tdksJ | }|j|||||d || d S t| j	}|jd| d}|j|||||d || d S )Nr   z[]r   )oplhsr   r   binop_r  )
dis_nb_opsr  r   r   r   rb   r   r   r   )r5   rw   r   rT  r   rU  r   op_namer$   r$   r%   op_BINARY_OPg  s   
zTraceRunner.op_BINARY_OPc                 C   r  r  r  r  r$   r$   r%   _unaryopw  r  zTraceRunner._unaryopc                 C   s8   |  }|  }| }|j||||d || d S )N)rU  r   r   r  )r5   rw   r   r   rU  r   r$   r$   r%   	_binaryop  r  zTraceRunner._binaryopFc                 C   s   t dv rd }nt dv r| }ntt | }d  } } } }	}
t dv r.|jd u s-J n$|jd@ r7| }|jd@ r@| }|jd@ rI| }	|jd@ rR| }
| }|j|||||||	|
|d	 || d S )	Nr{   r   r      rC  r}  r   )r<  codeclosureannotationsannotate
kwdefaultsdefaultsr   )r   r   r   r  r   rb   r   )r5   rw   r   MAKE_CLOSUREr<  r^  r_  r`  ra  rb  rc  r   r$   r$   r%   op_MAKE_FUNCTION  s<   




zTraceRunner.op_MAKE_FUNCTIONc                 C   s   t dv sJ | }| }|jd@ r|j||d n8|jd@ r(|j||d n+|jd@ r5|j||d n|jd@ rB|j||d	 n|jd
@ rO|j||d ntd|| d S )Nr   r   )rc  r}  )rb  rC  )r`  r]  )r_     )ra  r~  )r   r   r  set_function_attributeAssertionErrorr   )r5   rw   r   make_func_stackdatar$   r$   r%   op_SET_FUNCTION_ATTRIBUTE  s   




z%TraceRunner.op_SET_FUNCTION_ATTRIBUTEc                 C   r  )NT)rd  )re  r   r$   r$   r%   op_MAKE_CLOSURE  r  zTraceRunner.op_MAKE_CLOSUREc                 C   r#  r$  r&  r'  r$   r$   r%   op_LOAD_CLOSURE  r(  zTraceRunner.op_LOAD_CLOSUREc                 C   s&   | d}|j||d || d S )Nassertion_errorr%  r&  r'  r$   r$   r%   op_LOAD_ASSERTION_ERROR  s   
z#TraceRunner.op_LOAD_ASSERTION_ERRORc                 C   s:   | d}| }| }|j||||d || d S )N	predicater  r  rh  )r   r   r  rb   r   r5   rw   r   r  r  rh  r$   r$   r%   op_CHECK_EXC_MATCH  s
   
zTraceRunner.op_CHECK_EXC_MATCHc                 C   sN   | d}| }| }|j||||d |j|jd |j| d d S )Nrp  rq  r|   )r   r   rb   r   r   r  rr  r$   r$   r%   op_JUMP_IF_NOT_EXC_MATCH  s   
z$TraceRunner.op_JUMP_IF_NOT_EXC_MATCHc                 C   sJ   |  }|jdkr|   |j||d | r| | d S |  d S )Nr   r  )r   r  rb   r   r   r  r  r$   r$   r%   
op_RERAISE  s   
zTraceRunner.op_RERAISEc                 C   s"   |  }|j||d |  d S )Nr  )r   rb   r  r  r$   r$   r%   ru    s   )r)   c                 C   s@   |  }| }|| | }|j|||d || d S )Nr2  )r   r   r   r   rb   )r5   rw   r   r3  extrar   r$   r$   r%   op_LOAD_METHOD-  s   
zTraceRunner.op_LOAD_METHODc                 C   r  r2   )r4  r   r$   r$   r%   rw  5  r  c                 C   r  r2   )r  r   r$   r$   r%   op_CALL_METHOD:  r  zTraceRunner.op_CALL_METHODc                 C   s>  t j|j dvrtd| }| }|jdd}|}dD ]\}}|  | }|j|ks4|j|kr8t	dq|  | }|jdkrLd}	t	|	|jd u sSJ |j
}
|
|j}|g}|
jD ]}|j|jkro|| qbtd	d
 |D }|| || |j||||d ||jd|d |j|jd d S )N)	__enter____exit__z#async special methods not supportedr  r  ))SWAPr}  )r{  r   )LOAD_SPECIALr   )CALLr   z0Unsupported bytecode pattern for 'LOAD_SPECIAL'.r   r   c                 s   r  r2   r~   r  r$   r$   r%   r    r  z.TraceRunner.op_LOAD_SPECIAL.<locals>.<genexpr>)r  exit_method	block_endr.   r  r|   )rW  _special_method_namesr  r   r   r   r   r   r   r   rS   r  r   r  r   rb   r  r   r  r   r   r   )r5   rw   r   r  r  methodold_instr  ar   r=  r  r  r   r}   r$   r$   r%   op_LOAD_SPECIAL?  sX   







zTraceRunner.op_LOAD_SPECIALc                 C   sF   |j }tj| tkrd}nt||}|j|||d || d S )Nrn  )r   r  )r  rW  _common_constantsrh  r   r   rb   r   )r5   rw   r   rH  r<  r   r$   r$   r%   op_LOAD_COMMON_CONSTANT  s   
z#TraceRunner.op_LOAD_COMMON_CONSTANTN)F)r   r   r    rI   r7   r   rf   r   r   r   op_NOT_TAKENr   r   r   r   r   r   r  r  r  r  op_POP_ITERr  r!  r)  r*  r+  r.  r0  r4  rB  rM  rQ  rV  op_LOAD_FAST_CHECKop_LOAD_FAST_AND_CLEARop_LOAD_FAST_BORROW$op_LOAD_FAST_BORROW_LOAD_FAST_BORROWrX  rZ  r\  r_  r`  ri  rl  rn  rp  rs  ru  rv  rw  rz  r{  r|  r  r  r  r  op_POP_JUMP_IF_TRUEop_POP_JUMP_IF_FALSEop_POP_JUMP_IF_NONEop_POP_JUMP_IF_NOT_NONEr  op_JUMP_IF_FALSE_OR_POPop_JUMP_IF_TRUE_OR_POPr  r  r  r  r  r  r  r  r  r  op_JUMP_BACKWARD_NO_INTERRUPTr  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  r  r  r  r  r!  r%  r)  r+  r-  r.  r3  r5  r9  r<  rA  rE  rF  rH  rL  rM  rN  rR  rS  rZ  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_XORre  rk  rl  rm  ro  rs  rt  ru  rw  rx  r  r  r$   r$   r$   r%   r^   A  sL   


	



































	













					&








q

	r^   c                   @   sf  e Zd ZdZdTd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dUd$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdVd8d9Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFe%fdGdHZ&dIdJ Z'dWdLdMZ(dNdO Z)dPdQ Z*dRdS Z+d7S )X_StatezState of the trace
    r$   c                 C   s   || _ || _|| _|| _g | _t|| _t|| _g | _	g | _
g | _d| _i | _t | _t | _t|D ]}||v r@| d}n| d}|| j|< | | q4d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)rS   _pc_initialr   _nstack_initialre   tuple_blockstack_initialr   r   _temp_registers_insts	_outedges_terminatedr   r   r   r   r   r  r   r   )r5   rU   rV   rW   rX   nullvalsr  r   r$   r$   r%   r7     s*   



z_State.__init__c                 C   s   d | j| jS )Nz&State(pc_initial={} nstack_initial={}))rA   r  r  r;   r$   r$   r%   rG     s   z_State.__repr__c                 C   s   | j | jfS r2   )r  r  r;   r$   r$   r%   get_identity  rH   z_State.get_identityc                 C   s   t |  S r2   )r9   r  r;   r$   r$   r%   r<     rH   z_State.__hash__c                 C   s   |   |  k S r2   r  rB   r$   r$   r%   rD     r  z_State.__lt__c                 C   s   |   |  kS r2   r  rB   r$   r$   r%   rF     r  z_State.__eq__c                 C   rZ   )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )r  r;   r$   r$   r%   r[        z_State.pc_initialc                 C   rZ   )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )r  r;   r$   r$   r%   instructions  r  z_State.instructionsc                 C   rZ   )zaThe list of outgoing edges.

        Returns
        -------
        edges : List[State]
        r  r;   r$   r$   r%   rl     s   z_State.outgoing_edgesc                 C   rZ   )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   rZ   )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
        )r8  re   r;   r$   r$   r%   r   $  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+   )r5   r  r$   r$   r%   find_initial_try_block.  s
   z_State.find_initial_try_blockc                 C   rZ   r2   r  r;   r$   r$   r%   rg   5  s   z_State.has_terminatedc                 C   s   | j | j S r2   )rS   r   r;   r$   r$   r%   r   8  rH   z_State.get_instc                 C   s   |   }|j| _d S r2   )r   r   r   r5   r   r$   r$   r%   r   ;  r  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})r  r   r   tempctz${prefix}{offset}.{tempct})r  r   r  )rA   r   r   r   lowerr8  r  rb   )r5   r  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  rb   r   r   r   _flatten_inst_regsr1  )r5   r   r   r$   r$   r%   rb   Q  s   z_State.appendc                 C   r   )Nr   )r  r;   r$   r$   r%   r  V  r   z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        re   )r5   r@  r$   r$   r%   r  Y     z_State.peekc                 C   s   | j | dS )zPush to stackN)re   rb   )r5   r3  r$   r$   r%   r   ^  r,  z_State.pushc                 C   s
   | j  S )zPop the stack)re   r   r;   r$   r$   r%   r   b  s   
z
_State.popc                 C   s(   | j }||  |d |d< || < dS )zSwap stack[idx] with the tosr   Nr  )r5   r  sr$   r$   r%   r  f  s   "z_State.swapc                 C   s   d|v sJ | j | dS )z#Push a block to blockstack
        r   N)r   rb   )r5   synblkr$   r$   r%   r  k  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  )r5   r   poppedr$   r$   r%   r  q  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   r}   r   r   Nr   )r+   r8  re   )r5   r   r}   r  r   dr$   r$   r%   r   x  s   z_State.make_blockc                 C   s   | j  }| |d  |S )z)Pop a block and unwind the stack
        r   )r   r   r  r5   r   r$   r$   r%   r    s   
z_State.pop_blockc                 C   sB   | j |}d|  krt| j k sJ  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  r8  )r5   r  r  r$   r$   r%   r     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   )r5   r   bsr$   r$   r%   r     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>  r  z._State.get_top_block_either.<locals>.<setcomp>r   N)r  r   )r5   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)r   r;   r$   r$   r%   r     s   z_State.has_active_tryc                 C   s   |  |jS )zBGet referenced variable name from the instruction's oparg
        )rG  r  r  r$   r$   r%   r6    r  z_State.get_varnamerH  c                 C   s   | j j| S )z4Get referenced variable name from the oparg
        )rS   r9  )r5   rH  r$   r$   r%   rG    r  z_State.get_varname_by_argc                 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}|r%d|  krt| jksJ  J t| j| }|d| }|r;d|ks-J t|D ]	}||   q1t | j}tdv r`|r_|d }	|	dpR|	d }
||
kr\|	  nn|sFn	tdv rent
t|rp|| | jt|t||t|d |   dS )	zFork the state
        r   Nr{   r   r   r}   r   )rV   stackr   rX   )r   re   r8  r  rb   r   r   r   getr   r   r  Edger  r  )r5   rV   r   r   r   r  rW   r  rX   topr}   r$   r$   r%   r     s:   
"



z_State.forkc                 C   s   | j | jd dS )zSplit the state
        r|   N)r   r   r;   r$   r$   r%   rk     s   z_State.split_new_blockc              	   C   sz   | j rJ g }| jD ]0}t| j|jt|j|jdd t|jD d}|	| |j
 D ]\}}|j| | j |< q-q
|S )z+Get states for each outgoing edges
        c                 S   s   g | ]
\}}t |r|qS r$   )r   )r
  r  r?  r$   r$   r%   r    s    
z._State.get_outgoing_states.<locals>.<listcomp>)rU   rV   rW   rX   r  )r   r  r]   rS   rV   r8  r  rX   	enumeraterb   r   r   )r5   retr   rw   r   r  r$   r$   r%   rn     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 r2   )rV   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   r   r    rI   r7   rG   r  r<   rD   rF   propertyr[   r  rl   r  r  r   r  rg   r   r   r   rb   r  r  r   r   r  r  r  r   r  r   r   r  r   r6  intrG  r  r   rk   rn   r  r$   r$   r$   r%   r    s\    
#


	


	


%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 r2   )superr7   	_kw_namesr5   r  r   	__class__r$   r%   r7   	  s   
zStatePy311.__init__c                 C   s   | j }d | _ |S r2   r  )r5   outr$   r$   r%   r  	  s   zStatePy311.pop_kw_namesc                 C   s   | j d u sJ || _ d S r2   r  )r5   r  r$   r$   r%   r  	  r8   zStatePy311.set_kw_namesc                 C   s   | j }|| jd uS r2   rS   r  r   r5   r=  r$   r$   r%   r   	  s   zStatePy311.is_in_exceptionc                 C   s   | j }|| jS r2   r  r  r$   r$   r%   r   	  s   zStatePy311.get_exceptionc                 C   s&   | j D ]}|d tdkr dS qd S )Nr   r.   T)r  r+   )r5   entr$   r$   r%   r   	  s
   
zStatePy311.in_withc                 C   s   | j ddS )Nr  r  r  r;   r$   r$   r%   r   	  rH   zStatePy311.make_null)r   r   r    r7   r  r  r   r   r   r   __classcell__r$   r$   r  r%   r  	  s    r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )
StatePy313c                    s    t  j|i | tt| _d S r2   )r  r7   r   r   _make_func_attrsr  r  r$   r%   r7   "	  s   zStatePy313.__init__c                 K   s   | j | | d S r2   )r  r   )r5   make_func_resr   r$   r$   r%   rg  &	  r  z!StatePy313.set_function_attributec                 C   s
   | j | S r2   )r  )r5   r  r$   r$   r%   get_function_attributes)	  r   z"StatePy313.get_function_attributes)r   r   r    r7   rg  r  r  r$   r$   r  r%   r  !	  s    r  r   r"  r)   r  )rV   r  rX   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 r2   )_flow)r5   flowr$   r$   r%   r7   =	  r   zAdaptDFA.__init__c                 C      | j jS r2   )r  rT   r;   r$   r$   r%   infos@	     zAdaptDFA.infosN)r   r   r    rI   r7   r  r  r$   r$   r$   r%   r  :	  s
    r  AdaptBlockInfoinstsr  rX   active_try_blockoutgoing_edgepushedc                    s`    fdd}t dv rtt| j}nt dv rt j}ntt t| j j   	 dS )Nc                    s8   | \}} j | }|jdkr| |d  ||fS )NMAKE_FUNCTIONr   )rS   r   r   r  )	inst_pairr   rj  r   r  r$   r%   process_function_attributesM	  s
   

z6adapt_state_infos.<locals>.process_function_attributesr   r  r  )
r   r  mapr  r   r  r  r  r  r  )rw   r  r  r$   r  r%   rs   L	  s   rs   c                 c   sD    | D ]}t |tr|V  qt |ttfrt|D ]}|V  qqdS )z<Flatten an iterable of registers used in an instruction
    N)r?   strr  r   r  )r  r3  rN   r$   r$   r%   r  b	  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 ]}|
|r9|| q-|| | _d S r2   )r  _blocksrT   r   AdaptCFBlockr   backboner   blocksr/  in_loopsrm   	_backbone)r5   r  r   	blockinfor	  r   inloopblocksr   r$   r$   r%   r7   p	  s   

zAdaptCFA.__init__c                 C   r  r2   )r  r   r;   r$   r$   r%   r   	  r  zAdaptCFA.graphc                 C   rZ   r2   )r  r;   r$   r$   r%   r	  	     zAdaptCFA.backbonec                 C   rZ   r2   )r  r;   r$   r$   r%   r
  	  r  zAdaptCFA.blocksc                 c   s"    t | jD ]}| j| V  qd S r2   )rr   r
  r  r$   r$   r%   iterliveblocks	  s   zAdaptCFA.iterliveblocksc                 C   s   | j j  d S r2   )r  r   rL   r;   r$   r$   r%   rL   	  r  zAdaptCFA.dumpN)r   r   r    rI   r7   r  r   r	  r
  r  rL   r$   r$   r$   r%   r  m	  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 r2   r$   )r
  r  r  r$   r$   r%   r  	  s    z(AdaptCFBlock.__init__.<locals>.<genexpr>)r   r  r  body)r5   r  r   r$   r$   r%   r7   	  s   zAdaptCFBlock.__init__N)r   r   r    r7   r$   r$   r$   r%   r  	  s    r  )1rI   rW  loggingcollectionsr   r   r   	functoolsr   numba.core.utilsr   r   r   r	   numba.core.controlflowr
   r   numba.core.irr   numba.core.errorsr   	getLoggerr   rQ   r   r   rJ   r   enumr   r   r	  r   objectr+   rK   r   r^   r  r  r  r]   r  r  r  rs   r  r  r  r$   r$   r$   r%   <module>   s|    
  s               >*