o
    ۾iA                    @   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      )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"   G/home/ubuntu/.local/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 r0   )hashtyper2   r3   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)   r2   	TypeErrorformatr8   r3   otherr"   r"   r#   __lt__;      
zBlockKind.__lt__c                 C   s(   t |tr| j|jkS tdt|r;   r<   r@   r"   r"   r#   __eq__A   rC   zBlockKind.__eq__c                 C   s   d | jS )NzBlockKind({}))r?   r2   r9   r"   r"   r#   __repr__G      zBlockKind.__repr__N)r   r   r   __doc__	frozensetr1   r5   r:   rB   rD   rE   r"   r"   r"   r#   r)   *   s    r)   c                   @   sl   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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)r3   bytecoder"   r"   r#   r5   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"   )rO   pcnstack
blockstack)debug_filenamezpending: %sz	stack: %szstate.pc_initial: %sTzend state. edges=%sc                 S      | j S r0   )
pc_initial)xr"   r"   r#   <lambda>   s    zFlow.run.<locals>.<lambda>)keyzblock_infos %s:
%sN)StaterM   TraceRunnerfunc_idfilenamependingappendr   rJ   rK   popleftfinished_stackrU   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_infosrN   )r3   
firststaterunnerfirst_encounterstate
out_statessir"   r"   r#   runU   sF   








zFlow.run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rP   Tz3.11 exception %s PC=%sr*   endry   
end_offsetstack_depth
push_lastirP   extra_block)in_withhas_active_tryget_instopname_NO_RAISE_OPSforknext_adjust_except_stack
advance_pcis_in_exceptionrJ   rK   get_exception_pcget_top_blocktarget
make_blockry   depthlasti)r3   rq   rs   eheh_topeh_blockr"   r"   r#   rd      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 )Nrx   r*   entry_stacknpophandlerr-   r.   kindnpushr   rP   ry   Tr"   )r   r   r   r   r   r   r   pop_block_and_abover|   r)   _EXCEPT_STACK_OFFSET_FINALLY_POPr   )r3   rq   rs   tryblkrQ   kwargsr   r"   r"   r#   rd      s&   

c                 C   sd   t  }|D ]
}|j}|| q|D ]}|jD ]}||j|jd qq|d |  || _d S )Nr   )	r   rU   add_noderh   add_edgerP   set_entry_pointprocesscfgraph)r3   
all_statesgraphrs   bedger"   r"   r#   rl      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 r0   )r   setr`   
_used_regs_phis)	used_phisphi_setrs   usedphisrq   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   r`   _outgoing_phisitemsri   rJ   rK   r	   )defmapphismaprs   phirhsr   rq   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   rn   listr   ri   rJ   rK   r	   )r   	blacklistchangingr   defsitesr   rs   	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   rJ   rK   r	   r   dictr`   r   clearupdate)r   r   keeprs   used_setr   new_outr   r   r"   r#   apply_changes  s    

z'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)rJ   rK   centerr	   )	r3   rq   r   r   r   r   r   r   r   r"   r   r#   rm      s   


zFlow._prune_phisc                 C   s,   |  }|j| jjv rdS |jtv rdS dS )NTF)r   offsetrM   labelsr   r
   r3   rs   instr"   r"   r#   re     s   
zFlow._is_implicit_new_blockc                 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_TOPzGThe 'with (context manager) as (variable):' construct is not supported.N)r   r   rM   r   r   )r3   rs   current_instnext_opmsgr"   r"   r#   rf   '  s   
zFlow._guard_with_asN)r   r   r   rG   r5   rv   r   rd   NotImplementedErrorrl   rm   re   rf   r"   r"   r"   r#   rI   K   s    :

M
rI   c                 C   
   |  dS )Nz$null$)
startswith)regr"   r"   r#   _is_null_temp_reg5     
r   c                   @   sF  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zedv r6dd Zdd Zdd Zdd Zedv rKdd  Zned!k rP	 edv rYd"d# Zned$v rbd%d# Zned&v rkd'd# Zneed(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zedv rd4d5 Zd6d7 Zd8d9 Zn	ed:v rneeed;v reZeZ n	ed<v rneed=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1ed;v rd_d` Z2n
ed<v rneeed;v rdadb Z3n
ed<v rneedcdd Z4e4Z5e4Z6ed;v r1e4Z7e4Z8n
ed<v r7neededf Z9e9Z:e9Z;dgdh Z<didj Z=dkdl Z>dmdn Z?dodp Z@dqdr ZAdsdt ZBdudv ZCdwdx ZDdydz ZEeEZFd{d| ZGd}d~ ZHdd ZIed;v rdd ZJn
ed<v rneedd ZKedv rdd ZLned&v rdd ZLneedd ZMdd ZNedv rdd ZOnedv rdd ZOn
ed<v rneedd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZedv rdd Z[ned&v rdd Z[needd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcedv r=dd Zdn
ed:v rCneeedv rQdd Zened:v r[dd Zeneedd Zfed;v rmdd Zgn
ed<v rsneeddĄ ZhddƄ ZiddȄ Zjddʄ Zkdd̄ Zldd΄ 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 ZeZeZeZeZdd ZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZdddZd d Zdd Zdd Zdd Zdd	 Zd
d Zedv rgdd Zned&v rs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 ZdS (  rZ   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ t | _t | _d S r0   )rS   r   r]   r   r`   )r3   rS   r"   r"   r#   r5   <  s   zTraceRunner.__init__c                 C   s   t | j|S r0   )r   rS   )r3   linenor"   r"   r#   get_debug_locA  rF   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
)Nrw   ry   r   CACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) foundloc)r   _blockstackrU   popr   r   r   rJ   rK   r   ra   getattrr?   r   r   r   )r3   rs   topblkblk_endr   fnr   r"   r"   r#   rb   D  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   rP   ry   Nr"   )r   r   r|   r   )r3   rs   r   rQ   r   expected_depthextra_stackr"   r"   r#   r   _  s   

z TraceRunner._adjust_except_stackc                 C      | | d S r0   r^   r   r"   r"   r#   op_NOPs     zTraceRunner.op_NOPc                 C   r   r0   r   r   r"   r"   r#   	op_RESUMEv  r   zTraceRunner.op_RESUMEc                 C   r   r0   r   r   r"   r"   r#   op_CACHEy  r   zTraceRunner.op_CACHEc                 C   r   r0   r   r   r"   r"   r#   
op_PRECALL|  r   zTraceRunner.op_PRECALLc                 C      | |  || d S r0   )push	make_nullr^   r   r"   r"   r#   op_PUSH_NULL  s   zTraceRunner.op_PUSH_NULLc                 C   r   r0   )r   	make_tempr^   r   r"   r"   r#   op_RETURN_GENERATOR  s   
zTraceRunner.op_RETURN_GENERATORr   c                 C   sD   t dksJ | }| }| }|j||||d || d S )Nr   r4   resstrvar)r   r   r   r^   r   )r3   rs   r   r4   r   r   r"   r"   r#   op_FORMAT_SIMPLE  s   zTraceRunner.op_FORMAT_SIMPLEc                 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   r^   r   )r3   rs   r   r   r4   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_rs   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   r^   r   )r3   rs   r   countr  r  r"   r  r#   op_BUILD_STRING  s   zTraceRunner.op_BUILD_STRINGc                 C      |   d S r0   r   r   r"   r"   r#   
op_POP_TOP  rF   zTraceRunner.op_POP_TOPc                 C   s.   |  }| }|j|||d || d S )N)valr   )r   r   r^   r   )r3   rs   r   r   tosr"   r"   r#   
op_TO_BOOL     zTraceRunner.op_TO_BOOLr   c                 C   sL   |  }|jd? }|j|||d || |jd@ r$||  d S d S Nr   )idxr   r   r   r^   r   r   r3   rs   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   r^   r   r3   rs   r   r   r"   r"   r#   r       c                 C   r   r0   r   r   r"   r"   r#   op_COPY_FREE_VARS  r   zTraceRunner.op_COPY_FREE_VARSc                 C   r   r0   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   r^   r  r"   r"   r#   op_LOAD_CONST  s   
zTraceRunner.op_LOAD_CONSTc                 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   r^   )r3   rs   r   r&  r   r"   r"   r#   op_LOAD_ATTR  s   


zTraceRunner.op_LOAD_ATTRc           
      C   s   t dksJ t dv rTz||}W nG tyS   |j}t|j}t|j}t|j}|| }d|j|   kr<|k s?J  J |	 }	|j
||	dd ||	 Y d S w ||}|	|}	|j
||	d ||	 d S )Nr   r   r   T)r   as_load_derefr  )r   get_varname
IndexErrorrM   lenco_varnamesco_freevarsco_cellvarsr   r   r^   r   )
r3   rs   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   r^   r   )
r3   rs   r   opargoparg1oparg2name1name2r8  r9  r"   r"   r#   op_LOAD_FAST_LOAD_FAST"  s   




z"TraceRunner.op_LOAD_FAST_LOAD_FASTc                 C   sH   |j }|d@ }| }||}||}|j|||d || d S )Nr7  )store_valueload_res)r   r   r:  r   r^   r   )r3   rs   r   r;  r=  rA  	load_namerB  r"   r"   r#   op_STORE_FAST_LOAD_FAST.  s   

z#TraceRunner.op_STORE_FAST_LOAD_FASTc                 C   $   |  }|  }|j|||d d S )N)value1value2r   r^   )r3   rs   r   rF  rG  r"   r"   r#   op_STORE_FAST_STORE_FAST8     z$TraceRunner.op_STORE_FAST_STORE_FASTr%   r'   r   r   r$   c                 C   r   r0   r   r   r"   r"   r#   op_DELETE_FASTJ  r   zTraceRunner.op_DELETE_FASTc                 C      |  }|j||d d S )N)r   rH  )r3   rs   r   r   r"   r"   r#   op_DELETE_ATTRM     zTraceRunner.op_DELETE_ATTRc                 C   rE  )N)r   r4   rH  )r3   rs   r   r   r4   r"   r"   r#   op_STORE_ATTRQ  rJ  zTraceRunner.op_STORE_ATTRc                 C   rM  N)r4   rH  r3   rs   r   r4   r"   r"   r#   op_STORE_DEREFV  rO  zTraceRunner.op_STORE_DEREFc                 C   rM  rQ  rH  rR  r"   r"   r#   op_STORE_FASTZ  rO  zTraceRunner.op_STORE_FASTc           	   	   C   V   |  }|  }| }| }| }| }|j|||||||d || dS )z"
        TOS = TOS1[TOS:]
        )basestartr   slicevarindexvarnonevarNr   r   r^   r   	r3   rs   r   r  tos1r   rX  rY  rZ  r"   r"   r#   
op_SLICE_1^      	zTraceRunner.op_SLICE_1c           	   	   C   rU  )z"
        TOS = TOS1[:TOS]
        )rV  stopr   rX  rY  rZ  Nr[  r\  r"   r"   r#   
op_SLICE_2s  r_  zTraceRunner.op_SLICE_2c           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || dS )z&
        TOS = TOS2[TOS1:TOS]
        )rV  rW  r`  r   rX  rY  Nr[  )	r3   rs   r   r  r]  tos2r   rX  rY  r"   r"   r#   
op_SLICE_3  r_  zTraceRunner.op_SLICE_3c                 C   sB   |  }|  }| }| }| }|j||||||d dS )z
        TOS[:] = TOS1
        )rV  r4   rX  rY  rZ  Nr   r   r^   )r3   rs   r   r  r4   rX  rY  rZ  r"   r"   r#   op_STORE_SLICE_0     
zTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )rV  rW  rX  r4   rY  rZ  Nrd  	r3   rs   r   r  r]  r4   rX  rY  rZ  r"   r"   r#   op_STORE_SLICE_1     
zTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  }|  }|  }| }| }| }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )rV  r`  r4   rX  rY  rZ  Nrd  rg  r"   r"   r#   op_STORE_SLICE_2  ri  zTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rV  rW  r`  r4   rX  rY  Nrd  )	r3   rs   r   r  r]  rb  r4   rX  rY  r"   r"   r#   op_STORE_SLICE_3  ri  zTraceRunner.op_STORE_SLICE_3c                 C   s8   |  }| }| }| }|j|||||d dS )z
        del TOS[:]
        )rV  rX  rY  rZ  Nrd  )r3   rs   r   r  rX  rY  rZ  r"   r"   r#   op_DELETE_SLICE_0  s   
zTraceRunner.op_DELETE_SLICE_0c                 C   B   |  }|  }| }| }| }|j||||||d dS )z 
        del TOS1[TOS:]
        )rV  rW  rX  rY  rZ  Nrd  r3   rs   r   r  r]  rX  rY  rZ  r"   r"   r#   op_DELETE_SLICE_1  rf  zTraceRunner.op_DELETE_SLICE_1c                 C   rm  )z 
        del TOS1[:TOS]
        )rV  r`  rX  rY  rZ  Nrd  rn  r"   r"   r#   op_DELETE_SLICE_2
  rf  zTraceRunner.op_DELETE_SLICE_2c                 C   sB   |  }|  }|  }| }| }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )rV  rW  r`  rX  rY  Nrd  )r3   rs   r   r  r]  rb  rX  rY  r"   r"   r#   op_DELETE_SLICE_3  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)rW  r`  stepr   rX  )r   r   	Exceptionr   r^   r   )r3   rs   r   argcr  r]  rW  r`  rt  rb  rX  r   r"   r"   r#   op_BUILD_SLICE*  s*   zTraceRunner.op_BUILD_SLICEc           	   	   C   sV   |  }|  }|  }| }| }| }|j|||||||d || d S )N)rW  ry   	containerr   rX  temp_resr[  )	r3   rs   r   ry   rW  rx  ry  r   rX  r"   r"   r#   op_BINARY_SLICEF  s   
zTraceRunner.op_BINARY_SLICEc           	   	   C   sL   |  }|  }|  }|  }| }| }|j|||||||d d S )N)rW  ry   rx  r4   r   rX  rd  )	r3   rs   r   ry   rW  rx  r4   rX  r   r"   r"   r#   op_STORE_SLICEX  s   

zTraceRunner.op_STORE_SLICEc                 C   sL   |  }|j||d | }|j}|j|d ||kr$|j|d d S d S )Npredrx   )r   r^   get_jump_targetr   r   )r3   rs   r   r}  target_inst	next_instr"   r"   r#   _op_POP_JUMP_IFi  s   zTraceRunner._op_POP_JUMP_IFc                 C   s:   |  }|j||d |j|jdd |j| d d S )Nr|  r   rP   r   rx   )get_tosr^   r   r   r~  )r3   rs   r   r}  r"   r"   r#   _op_JUMP_IF_OR_POP  s   zTraceRunner._op_JUMP_IF_OR_POPc                 C      |  || d S r0   r  r   r"   r"   r#   op_POP_JUMP_FORWARD_IF_NONE     z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   r  r0   r  r   r"   r"   r#   op_POP_JUMP_FORWARD_IF_NOT_NONE  r  z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   r  r0   r  r   r"   r"   r#   op_POP_JUMP_BACKWARD_IF_NONE  r  z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   r  r0   r  r   r"   r"   r#    op_POP_JUMP_BACKWARD_IF_NOT_NONE  r  z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   r  r0   r  r   r"   r"   r#   op_POP_JUMP_FORWARD_IF_FALSE  r  z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   r  r0   r  r   r"   r"   r#   op_POP_JUMP_FORWARD_IF_TRUE  r  z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   r  r0   r  r   r"   r"   r#   op_POP_JUMP_BACKWARD_IF_FALSE  r  z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   r  r0   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 Nrx   r^   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+   ry   rz   rx   )r   r^   	pop_blockr   )r3   rs   r   ry   r"   r"   r#   op_BREAK_LOOP  s   zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || | d |  d S )Nretvalcastval)r^   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   r^   r  r  r"   r"   r#   op_RETURN_CONST  s   
zTraceRunner.op_RETURN_CONSTc                 C   .   |  }| }|j|||d || d S N)r4   r   r[  r3   rs   r   r  r   r"   r"   r#   op_YIELD_VALUE  r  zTraceRunner.op_YIELD_VALUErw   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   
ValueErrorr^   r   r  r3   rs   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-   r.   r   r  r   r   r  r  )
anyr   r   r   r   r   r   r  r^   r  )r3   rs   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   r^   r   )r3   rs   r   r  itmpr"   r"   r#   op_BEGIN_FINALLY  s   
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  }||d  d S )Nr   )r  reset_stackr3   rs   r   blkr"   r"   r#   op_END_FINALLY  rO  zTraceRunner.op_END_FINALLYc                 C   r  r0   r   r   r"   r"   r#   
op_END_FOR  rF   zTraceRunner.op_END_FORr$  c                 C   s   |   |   d S r0   r   r   r"   r"   r#   r       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   )r3   rs   r   r   r"   r"   r#   op_POP_FINALLY  s   

zTraceRunner.op_POP_FINALLYc                 C   s   d S r0   r"   r   r"   r"   r#   op_CALL_FINALLY  s   zTraceRunner.op_CALL_FINALLYc                 C   r  r0   )r  r   r"   r"   r#   op_WITH_EXCEPT_START  rF   z TraceRunner.op_WITH_EXCEPT_STARTc                 C   r   r0   r   r   r"   r"   r#   op_WITH_CLEANUP_START     z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   r   r0   r   r   r"   r"   r#   op_WITH_CLEANUP_FINISH   r  z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   | |jd| d d S )Nr+   r   ry   )
push_blockr   r~  r   r"   r"   r#   op_SETUP_LOOP$  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   s    | ]}|j V  qd S r0   rz   )r   r   r"   r"   r#   	<genexpr>?  s    z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)contextmanagerexitfnry   r,   r  rx   )r   r   r   rM   find_exception_entryr   exception_entriesr   r^   maxr  r   r   )r3   rs   r   cmyieldedr  r0  ehhead	ehrelatedr   ry   r"   r"   r#   op_BEFORE_WITH-  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  rx   )	r   r   r^   r   r  r   r~  r   r   )r3   rs   r   r  r  r  r"   r"   r#   op_SETUP_WITHK  s   

zTraceRunner.op_SETUP_WITHc                 C   s0   |j |d dd}|j||j d|d|dd d S )NF)r   ry   r  r*   )r   ry   r  r   r~   )r   r   )r3   r   rs   r   ry   handler_blockr"   r"   r#   
_setup_try^  s   
zTraceRunner._setup_tryc                 C   s&   |  }||d || d S )N	exception)r   r   r   )r3   rs   r   r  r"   r"   r#   op_PUSH_EXC_INFOr  s   zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   | | | jd||j| d d S )Nr.   )r   ry   )r^   r  r   r~  r   r"   r"   r#   op_SETUP_FINALLYw  s   

zTraceRunner.op_SETUP_FINALLYc                 C   r  r0   r   r   r"   r"   r#   op_POP_EXCEPT~  rF   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   rx   )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,   withrx   )r  r)   r^   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[  )r3   rs   r   r  r   r   r"   r"   r#   op_BINARY_SUBSCR  
   zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  }|  }|  }|j||||d d S )N)r   r  r4   rH  )r3   rs   r   r  r   r4   r"   r"   r#   op_STORE_SUBSCR  s   zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  }|  }|j|||d d S )N)r   r  rH  )r3   rs   r   r  r   r"   r"   r#   op_DELETE_SUBSCR  rJ  zTraceRunner.op_DELETE_SUBSCRc                    s   |j }tt fddt|D }tdk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   funcargskw_namesr   )r   r   r  r	  r   r   r   pop_kw_namesr   r^   r   )r3   rs   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 r0   )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   r^   r   )r3   rs   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   r^   r   )r3   rs   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   r^   r   )	r3   rs   r   r  r  r  null_or_firstargr  r   r"   r  r#   
op_CALL_KW  s   
zTraceRunner.op_CALL_KWc                 C   sZ   |j d@ r
| }nd }| }|  | }| }|j|||||d || d S )Nr   r  varargvarkwargr   )r   r   r   r^   r   r3   rs   r   r  r  r  r   r"   r"   r#   op_CALL_FUNCTION_EX  s   

zTraceRunner.op_CALL_FUNCTION_EXc                 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   r^   r   r  r"   r"   r#   r     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    r  z)TraceRunner._dup_topx.<locals>.<listcomp>c                    r   r"   r  r   r  r"   r#   r    r  )origduped)r	  reverser^   r   )r3   rs   r   r
  r  r  r  r"   r  r#   	_dup_topx  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  r4   r   )r  
const_listr   )r   r   r>   r   r   r   ci1opr   r^   r  r    r   r   r   r!   r   )	r3   rs   r   r  r   r   r  r   r  r"   r"   r#   op_CALL_INTRINSIC_1$  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  )r3   rs   r   r
  r"   r"   r#   op_DUP_TOPXG  s   $zTraceRunner.op_DUP_TOPXc                 C      | j ||dd d S )Nr   r
  r  r   r"   r"   r#   
op_DUP_TOPL     zTraceRunner.op_DUP_TOPc                 C   r  )Nrr  r   r  r   r"   r"   r#   op_DUP_TOP_TWOO  r  zTraceRunner.op_DUP_TOP_TWOc                 C   s   | ||j d S r0   )r   r  r   r   r"   r"   r#   op_COPYR  s   zTraceRunner.op_COPYc                 C   r  r0   )swapr   r   r"   r"   r#   op_SWAPU  r  zTraceRunner.op_SWAPc                 C   s(   |  }|  }|| || d S r0   r   r   )r3   rs   r   firstsecondr"   r"   r#   
op_ROT_TWOX  s   
zTraceRunner.op_ROT_TWOc                 C   s:   |  }|  }|  }|| || || d S r0   r  )r3   rs   r   r	  r
  thirdr"   r"   r#   op_ROT_THREE^  s   

zTraceRunner.op_ROT_THREEc                 C   sL   |  }|  }|  }|  }|| || || || d S r0   r  )r3   rs   r   r	  r
  r  forthr"   r"   r#   op_ROT_FOURf  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  s  r  z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)iterablestorestupleobj)r   r   r	  r   r^   r  r   )r3   rs   r   r
  r  r  r  str"   r  r#   op_UNPACK_SEQUENCEp  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  )r3   rs   r   r
  r   tupr"   r  r#   op_BUILD_TUPLEy  
   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   r+  r   r^   r   )r3   rs   r   r  r  r  r"   r  r#   _build_tuple_unpack  s    
zTraceRunner._build_tuple_unpackc                 C   r  r0   r  r   r"   r"   r#   op_BUILD_TUPLE_UNPACK_WITH_CALL     z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   r  r0   r  r   r"   r"   r#   op_BUILD_TUPLE_UNPACK  r  z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   r  )N)r  r   r[  )r3   rs   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   r^   r   )r3   rs   r   r"  valsr#  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  )r3   rs   r   r
  r   lstr"   r  r#   op_BUILD_LIST  r  zTraceRunner.op_BUILD_LISTc                 C   @   |  }|j}||}| }| }|j|||||d d S )N)r   r4   	appendvarr   r   r   r  r   r^   )r3   rs   r   r4   r  r   r*  r   r"   r"   r#   op_LIST_APPEND     

zTraceRunner.op_LIST_APPENDc                 C   r)  )N)r   r4   	extendvarr   r+  )r3   rs   r   r4   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   r^   r   )	r3   rs   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   rX   r4   
setitemvarr   r+  )r3   rs   r   TOSTOS1rX   r4   r  r   r5  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  )r3   rs   r   r
  r   r   r"   r  r#   op_BUILD_SET  s
   zTraceRunner.op_BUILD_SETc                 C   r)  N)r   r4   	updatevarr   r+  r3   rs   r   r4   r  r   r;  r   r"   r"   r#   op_SET_UPDATE  r-  zTraceRunner.op_SET_UPDATEc                 C   r)  r:  r+  r<  r"   r"   r#   op_DICT_UPDATE  r-  zTraceRunner.op_DICT_UPDATEc                 C   r  r  r[  )r3   rs   r   r4   r   r"   r"   r#   op_GET_ITER  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   rx   r$   rr  r  )	r  r   r^   r   r~  r   r   r   r   )r3   rs   r   r@  rA  rB  r}  ry   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   binop_r  )oplhsr   r   )	dis_nb_opsr   r   r   r   r   r^   r   )r3   rs   r   rF  r   rG  op_namer   r"   r"   r#   op_BINARY_OP  s   
zTraceRunner.op_BINARY_OPc                 C   r  r  r[  r  r"   r"   r#   _unaryop  r  zTraceRunner._unaryopc                 C   s8   |  }|  }| }|j||||d || d S )N)rG  r   r   r[  )r3   rs   r   r   rG  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@ r5| }|jd@ r>| }|jd@ rG| }|jd@ rP| }	| }
|j|||||||	|
d ||
 d S )	Nrw   r   r      r6  rr  r   )r/  codeclosureannotations
kwdefaultsdefaultsr   )r   r   r   r   r   r^   r   )r3   rs   r   MAKE_CLOSUREr/  rO  rP  rQ  rR  rS  r   r"   r"   r#   op_MAKE_FUNCTIONS  s:   





zTraceRunner.op_MAKE_FUNCTIONc                 C   s   t dv sJ | }| }|jdkr|j||d n+|jd@ r(|j||d n|jd@ r5|j||d n|jdkrB|j||d	 ntd
|| d S )Nr   r   )rS  rr  )rR  r6  )rQ  rN  )rP  rs  )r   r   r   set_function_attributeAssertionErrorr   )r3   rs   r   make_func_stackdatar"   r"   r#   op_SET_FUNCTION_ATTRIBUTEx  s   



z%TraceRunner.op_SET_FUNCTION_ATTRIBUTEc                 C   r  )NT)rT  )rU  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  r]  )r   r   r  r^   r   r3   rs   r   r}  r  r]  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 )Nr_  r`  rx   )r   r   r^   r   r   r~  ra  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   r^   r   r   r  r  r"   r"   r#   
op_RERAISE  s   
zTraceRunner.op_RERAISEc                 C   s"   |  }|j||d |  d S )Nr  )r   r^   r  r  r"   r"   r#   rd    s   )r'   c                 C   s@   |  }| }|| | }|j|||d || d S )Nr%  )r   r   r   r   r^   )r3   rs   r   r&  extrar   r"   r"   r#   op_LOAD_METHOD  s   
zTraceRunner.op_LOAD_METHODc                 C   r  r0   )r'  r   r"   r"   r#   rf    r  c                 C   r  r0   )r  r   r"   r"   r#   op_CALL_METHOD  r  zTraceRunner.op_CALL_METHODN)F)r   r   r   rG   r5   r   rb   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r   r#  r'  r5  r@  rD  rI  op_LOAD_FAST_CHECKop_LOAD_FAST_AND_CLEARrL  rN  rP  rS  rT  r^  ra  rc  re  rh  rj  rk  rl  ro  rp  rq  rw  rz  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!  r&  r(  r,  r/  r4  r8  r9  r=  r>  r?  rC  rD  rK  rL  op_UNARY_NEGATIVEop_UNARY_POSITIVEop_UNARY_NOTop_UNARY_INVERTrM  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_XORrU  rZ  r[  r\  r^  rb  rc  rd  rf  rg  r"   r"   r"   r#   rZ   9  s   

	



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


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




rZ   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)rM   _pc_initialr   _nstack_initialra   tuple_blockstack_initialr   r   _temp_registers_insts	_outedges_terminatedr   r   r   r   r   r	  r   r   )r3   rO   rP   rQ   rR   nullvalsr  r   r"   r"   r#   r5     s*   



z_State.__init__c                 C   s   d | j| jS )Nz&State(pc_initial={} nstack_initial={}))r?   r  r  r9   r"   r"   r#   rE      s   z_State.__repr__c                 C   s   | j | jfS r0   )r  r  r9   r"   r"   r#   get_identity  rF   z_State.get_identityc                 C   s   t |  S r0   )r7   r  r9   r"   r"   r#   r:     rF   z_State.__hash__c                 C   s   |   |  k S r0   r  r@   r"   r"   r#   rB     r  z_State.__lt__c                 C   s   |   |  kS r0   r  r@   r"   r"   r#   rD     r  z_State.__eq__c                 C   rT   )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )r  r9   r"   r"   r#   rU        z_State.pc_initialc                 C   rT   )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )r  r9   r"   r"   r#   instructions  r  z_State.instructionsc                 C   rT   )zaThe list of outgoing edges.

        Returns
        -------
        edges : List[State]
        r  r9   r"   r"   r#   rh     s   z_State.outgoing_edgesc                 C   rT   )zThe dictionary of outgoing phi nodes.

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

        Returns
        -------
        res : int
        )r+  ra   r9   r"   r"   r#   r|   8  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)   )r3   r  r"   r"   r#   find_initial_try_blockB  s
   z_State.find_initial_try_blockc                 C   rT   r0   r  r9   r"   r"   r#   rc   I  s   z_State.has_terminatedc                 C   s   | j | j S r0   )rM   r   r9   r"   r"   r#   r   L  rF   z_State.get_instc                 C   s   |   }|j| _d S r0   )r   r   r   r3   r   r"   r"   r#   r   O  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  )r?   r   r   r   lowerr+  r  r^   )r3   r  r/  r"   r"   r#   r   S  s   z_State.make_tempc                 K   s0   | j |j|f |  jtt| O  _dS )zAppend new instN)r  r^   r   r   r   _flatten_inst_regsr$  )r3   r   r   r"   r"   r#   r^   e  s   z_State.appendc                 C   r   )Nr   )r  r9   r"   r"   r#   r  j  r   z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        ra   )r3   r3  r"   r"   r#   r  m     z_State.peekc                 C   s   | j | dS )zPush to stackN)ra   r^   )r3   r&  r"   r"   r#   r   r  r  z_State.pushc                 C   s
   | j  S )zPop the stack)ra   r   r9   r"   r"   r#   r   v  s   
z
_State.popc                 C   s(   | j }||  |d |d< || < dS )zSwap stack[idx] with the tosr   Nr  )r3   r  sr"   r"   r#   r  z  s   "z_State.swapc                 C   s   d|v sJ | j | dS )z#Push a block to blockstack
        r|   N)r   r^   )r3   synblkr"   r"   r#   r    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  )r3   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   ry   r   r|   Nr   )r)   r+  ra   )r3   r   ry   r  r   dr"   r"   r#   r     s   z_State.make_blockc                 C   s   | j  }| |d  |S )z)Pop a block and unwind the stack
        r|   )r   r   r  r3   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  r+  )r3   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   )r3   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   )r3   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   r9   r"   r"   r#   r     s   z_State.has_active_tryc                 C   s   |  |jS )zBGet referenced variable name from the instruction's oparg
        )r:  r   r  r"   r"   r#   r)    r  z_State.get_varnamer;  c                 C   s   | j j| S )z4Get referenced variable name from the oparg
        )rM   r,  )r3   r;  r"   r"   r#   r:    r  z_State.get_varname_by_argc                 C   s
   d| _ dS )z!Mark block as terminated
        TNr  r9   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   Nrw   r   r{   ry   r   )rP   stackr   rR   )r   ra   r+  r	  r^   r   r   r   getr   r   r  Edger  r  )r3   rP   r   r   r   r  rQ   r  rR   topry   r"   r"   r#   r     s:   
"



z_State.forkc                 C   s   | j | jd dS )zSplit the state
        rx   N)r   r   r9   r"   r"   r#   rg     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  r2  r"   r"   r#   r    s    
z._State.get_outgoing_states.<locals>.<listcomp>)rO   rP   rQ   rR   r  )r   r  rY   rM   rP   r+  r  rR   	enumerater^   r   r   )r3   retr   rs   r   r  r"   r"   r#   rj     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 r0   )rP   r  r  r   )r   r   r"   r"   r#   
<dictcomp>  s    z2_State.get_outgoing_edgepushed.<locals>.<dictcomp>r  r9   r"   r"   r#   get_outgoing_edgepushed	  s   	z_State.get_outgoing_edgepushed)r"   )r  )TN)r   r   N),r   r   r   rG   r5   rE   r  r:   rB   rD   propertyrU   r  rh   r  r  r|   r  rc   r   r   r   r^   r  r  r   r   r  r  r  r   r  r   r   r  r   r)  intr:  r  r   rg   rj   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 r0   )superr5   	_kw_namesr3   r  r   	__class__r"   r#   r5     s   
zStatePy311.__init__c                 C   s   | j }d | _ |S r0   r  )r3   outr"   r"   r#   r    s   zStatePy311.pop_kw_namesc                 C   s   | j d u sJ || _ d S r0   r  )r3   r  r"   r"   r#   r     r6   zStatePy311.set_kw_namesc                 C   s   | j }|| jd uS r0   rM   r  r   r3   r0  r"   r"   r#   r   $  s   zStatePy311.is_in_exceptionc                 C   s   | j }|| jS r0   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)   )r3   entr"   r"   r#   r   ,  s
   
zStatePy311.in_withc                 C   s   | j ddS )Nr  r  r  r9   r"   r"   r#   r   1  rF   zStatePy311.make_null)r   r   r   r5   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 r0   )r  r5   r   r   _make_func_attrsr  r  r"   r#   r5   6  s   zStatePy313.__init__c                 K   s   | j | | d S r0   )r  r   )r3   make_func_resr   r"   r"   r#   rV  :  r  z!StatePy313.set_function_attributec                 C   s
   | j | S r0   )r  )r3   r  r"   r"   r#   get_function_attributes=  r   z"StatePy313.get_function_attributes)r   r   r   r5   rV  r  r  r"   r"   r  r#   r  5  s    r  r   r  r'   r  )rP   r  rR   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 r0   )_flow)r3   flowr"   r"   r#   r5   Q  r   zAdaptDFA.__init__c                 C      | j jS r0   )r  rN   r9   r"   r"   r#   infosT     zAdaptDFA.infosN)r   r   r   rG   r5   r  r  r"   r"   r"   r#   r  N  s
    r  AdaptBlockInfoinstsr  rR   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   )rM   r   r   r  )	inst_pairr   rY  r   r  r"   r#   process_function_attributesa  s
   

z6adapt_state_infos.<locals>.process_function_attributesr   rK  r  )
r   r  mapr  r   r  r  r  r  r  )rs   r  r  r"   r  r#   ro   `  s   ro   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  r&  rV   r"   r"   r#   r  v  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 r0   )r  _blocksrN   r   AdaptCFBlockr   backboner   blocksr"  in_loopsri   	_backbone)r3   r  r   	blockinfor  r   inloopblocksr   r"   r"   r#   r5     s   

zAdaptCFA.__init__c                 C   r  r0   )r  r   r9   r"   r"   r#   r     r  zAdaptCFA.graphc                 C   rT   r0   )r  r9   r"   r"   r#   r       zAdaptCFA.backbonec                 C   rT   r0   )r  r9   r"   r"   r#   r    r  zAdaptCFA.blocksc                 c   s"    t | jD ]}| j| V  qd S r0   )rn   r  r  r"   r"   r#   iterliveblocks  s   zAdaptCFA.iterliveblocksc                 C   s   | j j  d S r0   )r  r   rL   r9   r"   r"   r#   rL     r  zAdaptCFA.dumpN)r   r   r   rG   r5   r  r   r  r  r  rL   r"   r"   r"   r#   r    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 r0   r"   )r   r  r   r"   r"   r#   r    s    z(AdaptCFBlock.__init__.<locals>.<genexpr>)r   r  r  body)r3   r  r   r"   r"   r#   r5     s   zAdaptCFBlock.__init__N)r   r   r   r5   r"   r"   r"   r#   r    s    r  )1rG   rH  loggingcollectionsr   r   r   	functoolsr   numba.core.utilsr   r   r   r	   numba.core.controlflowr
   r   numba.core.irr   numba.core.errorsr   	getLoggerr   rJ   r   r   rH   r   enumr   r   r  r   objectr)   rI   r   rZ   r  r  r  rY   r  r  r  ro   r  r  r  r"   r"   r"   r#   <module>   sx    
  k           +  >*