
    ܙd                     d   d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ  ej        e          Zd
ZeZ eh d          Ze
 G d de                      Z G d de          Z G d de          Z d Z! G d de          Z"e
 G d de                      Z# G d de#          Z$edk    re$Z%nedk     re#Z%n e&e           edg d          Z' G d de          Z( edg d          Z)d  Z*d! Z+ G d" d#e          Z, G d$ d%e          Z-dS )&z)
Implement python 3.8+ bytecode analysis
    N)pformat)
namedtupledefaultdictdeque)total_ordering)
UniqueDict	PYVERSIONALL_BINOPS_TO_OPERATORS)NEW_BLOCKERSCFGraph)Loc)UnsupportedError   >   NOPPRECALL
LOAD_CONST
LOAD_DEREFc                   J    e Zd ZdZ eh d          Zd Zd Zd Zd Z	d Z
dS )		BlockKindz?Kinds of block to make related code safer than just `str`.
    >   TRYLOOPWITHEXCEPTFINALLYWITH_FINALLYc                 *    || j         v sJ || _        d S N)_members_value)selfvalues     3lib/python3.11/site-packages/numba/core/byteflow.py__init__zBlockKind.__init__&   s     %%%%    c                 H    t          t          |           | j        f          S r   )hashtyper   r    s    r"   __hash__zBlockKind.__hash__*   s    T$ZZ-...r$   c                     t          |t                    r| j        |j        k     S t          d                    t          |                              Nzcannot compare to {!r}
isinstancer   r   	TypeErrorformatr'   r    others     r"   __lt__zBlockKind.__lt__-   sG    eY'' 	J;--4;;DKKHHIIIr$   c                     t          |t                    r| j        |j        k    S t          d                    t          |                              r+   r,   r0   s     r"   __eq__zBlockKind.__eq__3   sG    eY'' 	J;%,..4;;DKKHHIIIr$   c                 6    d                     | j                  S )NzBlockKind({}))r/   r   r(   s    r"   __repr__zBlockKind.__repr__9   s    %%dk222r$   N)__name__
__module____qualname____doc__	frozensetr   r#   r)   r2   r4   r6    r$   r"   r   r      s         y     H  / / /J J JJ J J3 3 3 3 3r$   r   c                       e Zd Zd Zd ZdS )_lazy_pformatc                 "    || _         || _        d S r   )argskwargs)r    r@   rA   s      r"   r#   z_lazy_pformat.__init__>   s    	r$   c                 .    t          | j        i | j        S r   )r   r@   rA   r(   s    r"   __str__z_lazy_pformat.__str__B   s    	1T[111r$   N)r7   r8   r9   r#   rC   r<   r$   r"   r>   r>   =   s2          2 2 2 2 2r$   r>   c                   t    e Zd ZdZd Zd Zedk    rd Znedk     rd Zn ee          d Z	d Z
d	 Zd
 ZdS )FlowziData+Control Flow analysis.

    Simulate execution to recover dataflow and controlflow information.
    c                     t                               d|                                           || _        t	                      | _        d S )Nzbytecode dump:
%s)_loggerdebugdump	_bytecoder   block_infos)r    bytecodes     r"   r#   zFlow.__init__K   s8    *HMMOO<<<!%<<r$   c                    t          | j        ddd          }t          | j        j        j                  }|j                            |           t                      }|j        rzt          	                    d|j                   |j        
                                }||j        vr/t          	                    d|j                   t          	                    d|           |||j        <   	 |                    |           |                                rnW|                     ||          rn@|                     |          r*|                     |           |                                 nt          	                    d	|j                   |j                            |           |                                }|j                            |           |j        z|                     |j                   |                     |           t5          |j        d
           D ]<}t7          |          x| j        |j        <   }t          	                    d||           =dS )a  Run a trace over the bytecode over all reachable path.

        The trace starts at bytecode offset 0 and gathers stack and control-
        flow information by partially interpreting each bytecode.
        Each ``State`` instance in the trace corresponds to a basic-block.
        The State instances forks when a jump instruction is encountered.
        A newly forked state is then added to the list of pending states.
        The trace ends when there are no more pending states.
        r   r<   )rL   pcnstack
blockstack)debug_filenamezpending: %sz	stack: %szstate.pc_initial: %sTzend state. edges=%sc                     | j         S r   )
pc_initial)xs    r"   <lambda>zFlow.run.<locals>.<lambda>   s    1< r$   )keyzblock_infos %s:
%sN)StaterJ   TraceRunnerfunc_idfilenamependingappendr   rG   rH   popleftfinished_stackrS   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_infosrK   )r    
firststaterunnerfirst_encounterstate
out_statessis          r"   runzFlow.runP   sS    DNq&(* * *
DN,B,KLLLj)))
 %,, n 	2MM-888N**,,EFO++k5<8884e<<<49 01"OOE***++-- "55feDD "!66u== " //666!11333!" 3U5IJJJ##E***"6688
%%j1115 n 	2: 	(((   FO1G1GHHH 	< 	<E6G6N6NNDU-.MM/;;;;	< 	<r$         c                 0   |                                 sx|                                rd|                                j        t          vrD|                    |                                j                   |                    |           dS |                                 |                                 s|	                                rt                              d|                                |j                   |                                }|                    d          }|r|d         |j        k    rd }d S |                    d|j                  }|j        |d<   |j        |d<   |j        |d	<   |                    |j        |
           dS d S d S )NrN   Tz3.11 exception %s PC=%sr   endrz   
end_offsetstack_depth
push_lastirN   extra_block)in_withhas_active_tryget_instopname_NO_RAISE_OPSforknext_adjust_except_stack
advance_pcis_in_exceptionrG   rH   get_exception_pcget_top_blocktarget
make_blockrz   depthlasti)r    ro   rq   eheh_topeh_blocks         r"   rb   zFlow._run_handle_exception   s   ==?? $((**$NN$$+=@@

enn..3
444++E222t  """ }} $5+@+@+B+B $MM";"'"5"5"7"7D D D,,..B"0077F 	$&-29"<"<#'#(#3#3Ery#3#I#I13.24(/13.

eiX
FFF#t$ $ $ $r$   c                 D   |                                 r|                                j        t          vr|                    |                                j                   |                    d          }|                    |           |j        }i }||d         k    r||d         z
  |d<   |d         }t          d          t          t          d          t          i|d                  |d	<   ||d
<    |j        dd|d         i| dS |                                 d S )Nry   r   entry_stacknpophandlerr   r   kindnpushr   rN   rz   Tr<   )r   r   r   r   r   r   r   pop_block_and_abover}   r   _EXCEPT_STACK_OFFSET_FINALLY_POPr   )r    ro   rq   tryblkrO   rA   r   s          r"   rb   zFlow._run_handle_exception   s.   $$&& #NN$$+=@@

enn..3
444,,U33))&111*F=111%+f].C%CF6N +h'')=i((,# &/##w )0}%
66fUm6v666t  """""r$   c                 $   t                      }|D ]}|j        }|                    |           |D ]-}|j        D ]#}|                    |j        |j        d           $.|                    d           |                                 || _        d S )Nr   )	r   rS   add_noderf   add_edgerN   set_entry_pointprocesscfgraph)r    
all_statesgraphrq   bedges         r"   rj   zFlow._build_cfg   s    		 	 	E ANN1 	= 	=E, = =u/!<<<<=a   r$   c                   	 t                               d                    dd                     fd}	fd}	fd}fd} |            \  }	t                               dt          |                      |            \  }} ||            |||           t                               d	                    dd                     d S )
Nz
Prune PHIs<   -c                      t          t                    } t                      }j        D ]B}t          |j                  }t          |j                  }| |xx         ||z  z  cc<   ||z  }C| |fS r   )r   setr^   
_used_regs_phis)	used_phisphi_setrq   usedphisro   s        r"   get_used_phis_per_statez1Flow._prune_phis.<locals>.get_used_phis_per_state   s    #C((IeeG    5+,,5;''%   D4K/   4g%%r$   c                  v   i } t          t                    }j        D ]G}|j                                        D ]+\  }}|vr|| |<   ||                             ||f           ,Ht                              dt          |                      t                              dt          |                     | |fS )Nz
defmap: %szphismap: %s)	r   r   r^   _outgoing_phisitemsrg   rG   rH   r>   )defmapphismaprq   phirhsr   ro   s        r"   find_use_defsz'Flow._prune_phis.<locals>.find_use_defs   s    F!#&&G 3 3 % 4 : : < < 3 3HC'))&+sCL$$c5\2222	3
 MM,f(=(=>>>MM-w)?)?@@@7?"r$   c                    t          t                    }	 d}t          t          |                                                     D ]g\  }}t          t          |                    D ]1\  }}|v r(|| |         z  }||                             ||f           2||         }||z  r||z  }d}ht                              dt          |                      |sdS )znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            TFzchanging phismap: %sN)	r   r   rl   listr   rg   rG   rH   r>   )	r   	blacklistchangingr   defsitesr   rq   	to_remover   s	           r"   propagate_phi_mapz+Flow._prune_phis.<locals>.propagate_phi_map   s     $C((I %+D,A,A%B%B ( (MC&,T(^^&<&< = =
U'>>$4H%cN..U|<<< )#I 8+ ( I-#'4mG6L6LMMM Er$   c                    i }|                                  D ]\  }}|D ]}||         ||<   t                              dt          |                     t	          t
                    }|D ]}||         D ]\  }}|||         |<   t                              dt          |                     j        D ];}|j                                         |j        	                    ||                    <d S )Nzkeep phismap: %sznew_out: %s)
r   rG   rH   r>   r   dictr^   r   clearupdate)	r   r   keeprq   used_setr   new_outr   ro   s	           r"   apply_changesz'Flow._prune_phis.<locals>.apply_changes  s   D#,??#4#4 - -x# - -C 'DII-MM,mD.A.ABBB!$''G . ."&s) . .JC*-GEN3''. MM-w)?)?@@@ < <$**,,,$++GEN;;;;< <r$   zUsed_phis: %szDONE Prune PHIs)rG   rH   centerr>   )
r    ro   r   r   r   r   r   r   r   r   s
    `       @r"   rk   zFlow._prune_phis   s   l))"c22333	& 	& 	& 	& 	&	# 	# 	# 	# 	# 	#	 	 	 	 	,	< 	< 	< 	< 	<  5466	7o}Y'?'?@@@'-//'"""i)))'..r37788888r$   c                 x    |                                 }|j        | j        j        v rdS |j        t
          v rdS dS )NTF)r   offsetrJ   labelsr   r   r    rq   insts      r"   rc   zFlow._is_implicit_new_block  s?    ~~;$.///4[L((45r$   c                     |                                 }|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   rJ   r   r   )r    rq   current_instnext_opmsgs        r"   rd   zFlow._guard_with_as"  se     ~~''"???n\%67>G)##$ 's+++ @?##r$   N)r7   r8   r9   r:   r#   rt   r	   rb   NotImplementedErrorrj   rk   rc   rd   r<   r$   r"   rE   rE   F   s         ( ( (
8< 8< 8<t G	$ 	$ 	$ 	$6 
W			# 	# 	# 	#, "!),,,
 
 
K9 K9 K9Z  , , , , ,r$   rE   c                 ,    |                      d          S )Nz$null$)
startswith)regs    r"   _is_null_temp_regr   0  s    >>(###r$   c                   n   e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zedk    rd Znedk     rd Zn ee          d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+e+Z,e+Z-d* Z.e.Z/e.Z0d+ Z1d, Z2d- Z3d. Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>edk    rd9 Z?nedk     rd: Z?ned; Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFdB ZGdC ZHdD ZIdE ZJdF ZKdG ZLedk    rdH ZMnedk     rdI ZMn ee          dJ ZNdK ZOdL ZPdM ZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWdT ZXdU ZYdV ZZdW Z[dX Z\dY Z]dZ Z^d[ Z_d\ Z`d] Zad^ Zbd_ Zcd` Zdda Zedb Zfdc Zgdd Zhde Zidf Zjdg Zkdh Zldi Zmdj Zndk Zodl Zpdm Zqdn Zrdo ZsesZtesZuesZvesZwdp ZxexZyexZzexZ{exZ|exZ}exZ~exZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZexZd~drZds Zdt Zdu Zdv Zdw Zedk    rdx Znedk     rdy Zn ee          edk    rdz Znedk     rd{ Zn ee          d| Zd}S )rX   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 `    || _         t                      | _        t                      | _        d S r   )rQ   r   r[   r   r^   )r    rQ   s     r"   r#   zTraceRunner.__init__7  s$    ,wwr$   c                 ,    t          | j        |          S r   )r   rQ   )r    linenos     r"   get_debug_loczTraceRunner.get_debug_loc<  s    4&///r$   c                    t           dk    rt          t                     t           dk    rR|j        rK|j        rD|j        d         }|d         }|%||j        k    r|j                                         nn|j        D|                                }|j        dk    rAt                              d|j	        |           t                              d|j
                   t          | d                    |j                  d           }| |||           d S d|j        z  }t          ||                     |j                  	          )
Nru   rz   CACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) foundloc)r	   r   _blockstackrS   popr   r   rG   rH   r   r_   getattrr/   r   r   r   )r    rq   topblkblk_endr   fnr   s          r"   r`   zTraceRunner.dispatch?  s=   w%i000'!!e&7!# *2. -&7e6F+F+F%))++++ #  ~~;'!!MM3UYEEEMM*el333T7>>$+66==>BudOOOOO84;FC"3D,>,>t{,K,KLLLLr$   c                     |                     d          }|                    |           |j        }i }|d         }||k    r||z
  |d<   d}|d         r|dz  }||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   rN   rz   Nr<   )r   r   r}   r   )r    rq   r   rO   rA   expected_depthextra_stacks          r"   r   z TraceRunner._adjust_except_stackV  s    
 $$U++!!&)))".N""#n4F6N, 	1K%w
..fUm.v.....r$   c                 0    |                     |           d S r   r\   r   s      r"   op_NOPzTraceRunner.op_NOPj      Tr$   c                 0    |                     |           d S r   r   r   s      r"   	op_RESUMEzTraceRunner.op_RESUMEm  r   r$   c                 0    |                     |           d S r   r   r   s      r"   op_CACHEzTraceRunner.op_CACHEp  r   r$   c                 0    |                     |           d S r   r   r   s      r"   
op_PRECALLzTraceRunner.op_PRECALLs  r   r$   c                 ~    |                     |                                           |                    |           d S r   )push	make_nullr\   r   s      r"   op_PUSH_NULLzTraceRunner.op_PUSH_NULLv  s6    

5??$$%%%Tr$   c                 ~    |                     |                                           |                    |           d S r   )r   	make_tempr\   r   s      r"   op_RETURN_GENERATORzTraceRunner.op_RETURN_GENERATORz  s8     	

5??$$%%%Tr$   c                 F   |j         dk    r+d}t          ||                     |j                            |                                }|                                }|                                }|                    ||||           |                    |           dS )aF  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, we just call str() on the value.
        Pops a value from stack and pushes results back.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-FORMAT_VALUE
        r   z*format spec in f-strings not supported yetr   )r!   resstrvarN)argr   r   r   r   r  r\   r   )r    rq   r   r   r!   r  r  s          r"   op_FORMAT_VALUEzTraceRunner.op_FORMAT_VALUE  s     8q==>C"3D,>,>t{,K,KLLLL		""ooTC???

3r$   c                 Z   |j         }t          t          fdt          |          D                                 }|dk    r                                g}nfdt          |dz
            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                 8    g | ]}                                 S r<   r   .0_rq   s     r"   
<listcomp>z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>  s!     C C C C C Cr$   r   c                 8    g | ]}                                 S r<   r  r  s     r"   r  z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>  s#    @@@!EOO%%@@@r$   r   )stringstmpsr   Nr  r   reversedranger  r\   r   )r    rq   r   countr  r  s    `    r"   op_BUILD_STRINGzTraceRunner.op_BUILD_STRING  s     x C C C CeEll C C CDDEEA::OO%%&DD@@@@uUQY/?/?@@@DT7666

48r$   c                 .    |                                  d S r   r
  r   s      r"   
op_POP_TOPzTraceRunner.op_POP_TOP  s    		r$   ru   c                     |                                 }|j        dz	  }|                    |||           |j        dz  r'|                    |                                           |                    |           d S )Nr   )idxr  )r  r  r\   r   r   )r    rq   r   r  r  s        r"   op_LOAD_GLOBALzTraceRunner.op_LOAD_GLOBAL  sq    //##C(a-CLL3CL000x!| .

5??,,---JJsOOOOOr$   c                     |                                 }|                    ||           |                    |           d S Nr  r  r\   r   r    rq   r   r  s       r"   r  zTraceRunner.op_LOAD_GLOBAL  s:    //##CLL3L'''JJsOOOOOr$   c                 0    |                     |           d S r   r   r   s      r"   op_COPY_FREE_VARSzTraceRunner.op_COPY_FREE_VARS  r   r$   c                 0    |                     |           d S r   r   r   s      r"   op_MAKE_CELLzTraceRunner.op_MAKE_CELL  r   r$   c                     |                                 }|                    ||           |                    |           d S r  r   r!  s       r"   op_LOAD_DEREFzTraceRunner.op_LOAD_DEREF  :    ooTs###

3r$   c                     |                     d          }|                    |           |                    ||           d S )Nconstr  )r  r   r\   r!  s       r"   op_LOAD_CONSTzTraceRunner.op_LOAD_CONST  s>    oog&&

3Ts#####r$   c                     |                                 }|                                }|                    |||           |                    |           d S N)itemr  r   r  r\   r   )r    rq   r   r.  r  s        r"   op_LOAD_ATTRzTraceRunner.op_LOAD_ATTR  sI    yy{{ooT#...

3r$   c                     |                     |          }|                    |          }|                    ||           |                    |           d S r  )get_varnamer  r\   r   )r    rq   r   namer  s        r"   op_LOAD_FASTzTraceRunner.op_LOAD_FAST  sO      &&ood##Ts###

3r$   c                 0    |                     |           d S r   r   r   s      r"   op_DELETE_FASTzTraceRunner.op_DELETE_FAST  r   r$   c                 \    |                                 }|                    ||           d S )N)r   r   r\   )r    rq   r   r   s       r"   op_DELETE_ATTRzTraceRunner.op_DELETE_ATTR  s+    T&)))))r$   c                     |                                 }|                                 }|                    |||           d S )N)r   r!   r8  )r    rq   r   r   r!   s        r"   op_STORE_ATTRzTraceRunner.op_STORE_ATTR  s:    		T&66666r$   c                 \    |                                 }|                    ||           d S N)r!   r8  r    rq   r   r!   s       r"   op_STORE_DEREFzTraceRunner.op_STORE_DEREF  +    		T'''''r$   c                 \    |                                 }|                    ||           d S r=  r8  r>  s       r"   op_STORE_FASTzTraceRunner.op_STORE_FAST  r@  r$   c           	      X   |                                 }|                                 }|                                }|                                }|                                }|                                }|                    |||||||           |                    |           dS )z"
        TOS = TOS1[TOS:]
        )basestartr  slicevarindexvarnonevarNr/  	r    rq   r   tostos1r  rF  rG  rH  s	            r"   
op_SLICE_1zTraceRunner.op_SLICE_1  s     iikkyy{{oo??$$??$$//## 	 	
 	
 	
 	

3r$   c           	      X   |                                 }|                                 }|                                }|                                }|                                }|                                }|                    |||||||           |                    |           dS )z"
        TOS = TOS1[:TOS]
        )rD  stopr  rF  rG  rH  Nr/  rI  s	            r"   
op_SLICE_2zTraceRunner.op_SLICE_2  s     iikkyy{{oo??$$??$$//## 	 	
 	
 	
 	

3r$   c           	      X   |                                 }|                                 }|                                 }|                                }|                                }|                                }|                    |||||||           |                    |           dS )z&
        TOS = TOS2[TOS1:TOS]
        )rD  rE  rN  r  rF  rG  Nr/  )	r    rq   r   rJ  rK  tos2r  rF  rG  s	            r"   
op_SLICE_3zTraceRunner.op_SLICE_3  s     iikkyy{{yy{{oo??$$??$$ 	 	
 	
 	
 	

3r$   c                    |                                 }|                                 }|                                }|                                }|                                }|                    ||||||           dS )z
        TOS[:] = TOS1
        )rD  r!   rF  rG  rH  Nr   r  r\   )r    rq   r   rJ  r!   rF  rG  rH  s           r"   op_STORE_SLICE_0zTraceRunner.op_STORE_SLICE_0,  s     iikk		??$$??$$//## 	 	
 	
 	
 	
 	
r$   c           	      .   |                                 }|                                 }|                                 }|                                }|                                }|                                }|                    |||||||           dS )z#
        TOS1[TOS:] = TOS2
        )rD  rE  rF  r!   rG  rH  NrT  	r    rq   r   rJ  rK  r!   rF  rG  rH  s	            r"   op_STORE_SLICE_1zTraceRunner.op_STORE_SLICE_1>  s     iikkyy{{		??$$??$$//## 	 	
 	
 	
 	
 	
r$   c           	      .   |                                 }|                                 }|                                 }|                                }|                                }|                                }|                    |||||||           dS )z#
        TOS1[:TOS] = TOS2
        )rD  rN  r!   rF  rG  rH  NrT  rW  s	            r"   op_STORE_SLICE_2zTraceRunner.op_STORE_SLICE_2R  s     iikkyy{{		??$$??$$//## 	 	
 	
 	
 	
 	
r$   c           	      .   |                                 }|                                 }|                                 }|                                 }|                                }|                                }|                    |||||||           dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rD  rE  rN  r!   rF  rG  NrT  )	r    rq   r   rJ  rK  rQ  r!   rF  rG  s	            r"   op_STORE_SLICE_3zTraceRunner.op_STORE_SLICE_3f  s     iikkyy{{yy{{		??$$??$$ 	 	
 	
 	
 	
 	
r$   c                     |                                 }|                                }|                                }|                                }|                    |||||           dS )z
        del TOS[:]
        )rD  rF  rG  rH  NrT  )r    rq   r   rJ  rF  rG  rH  s          r"   op_DELETE_SLICE_0zTraceRunner.op_DELETE_SLICE_0z  so     iikk??$$??$$//##sX 	 	
 	
 	
 	
 	
r$   c                    |                                 }|                                 }|                                }|                                }|                                }|                    ||||||           dS )z 
        del TOS1[TOS:]
        )rD  rE  rF  rG  rH  NrT  r    rq   r   rJ  rK  rF  rG  rH  s           r"   op_DELETE_SLICE_1zTraceRunner.op_DELETE_SLICE_1  s     iikkyy{{??$$??$$//## 	 	
 	
 	
 	
 	
r$   c                    |                                 }|                                 }|                                }|                                }|                                }|                    ||||||           dS )z 
        del TOS1[:TOS]
        )rD  rN  rF  rG  rH  NrT  r`  s           r"   op_DELETE_SLICE_2zTraceRunner.op_DELETE_SLICE_2  s     iikkyy{{??$$??$$//## 	 	
 	
 	
 	
 	
r$   c                    |                                 }|                                 }|                                 }|                                }|                                }|                    ||||||           dS )z$
        del TOS2[TOS1:TOS]
        )rD  rE  rN  rF  rG  NrT  )r    rq   r   rJ  rK  rQ  rF  rG  s           r"   op_DELETE_SLICE_3zTraceRunner.op_DELETE_SLICE_3  s|     iikkyy{{yy{{??$$??$$t4cH 	 	
 	
 	
 	
 	
r$   c                    |j         }|dk    r/|                                }|                                }|}|}d}nX|dk    rC|                                }|                                }|                                }	|	}|}|}nt          d          |                                }
|                                }|                    ||||||
           |                    |           dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
           Nrv   unreachable)rE  rN  stepr  rF  )r  r   	Exceptionr  r\   r   )r    rq   r   argcrJ  rK  rE  rN  ri  rQ  rF  r  s               r"   op_BUILD_SLICEzTraceRunner.op_BUILD_SLICE  s     x199))++C99;;DEDDDQYY))++C99;;D99;;DEDDDM***??$$ooDtx 	 	
 	
 	
 	

3r$   c                     |                                 }|                    ||           |                                }|j        }|                    |           ||k    r|                    |           d S d S )Npredry   )r   r\   get_jump_targetr   r   )r    rq   r   ro  target_inst	next_insts         r"   _op_POP_JUMP_IFzTraceRunner._op_POP_JUMP_IF  s    yy{{T%%%**,,I	 	

i
   )##JJ+J&&&&& $#r$   c                     |                                 }|                    ||           |                    |j        d           |                    |                                           d S )Nrn  r   rN   r   ry   )get_tosr\   r   r   rp  )r    rq   r   ro  s       r"   _op_JUMP_IF_OR_POPzTraceRunner._op_JUMP_IF_OR_POP  sc    }}T%%%

dia
(((

d**,,
-----r$   c                 2    |                      ||           d S r   rs  r   s      r"   op_POP_JUMP_FORWARD_IF_NONEz'TraceRunner.op_POP_JUMP_FORWARD_IF_NONE      UD)))))r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_FORWARD_IF_NOT_NONEz+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_BACKWARD_IF_NONEz(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"    op_POP_JUMP_BACKWARD_IF_NOT_NONEz,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_FORWARD_IF_FALSEz(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_FORWARD_IF_TRUEz'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_BACKWARD_IF_FALSEz)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSE  r{  r$   c                 2    |                      ||           d S r   ry  r   s      r"   op_POP_JUMP_BACKWARD_IF_TRUEz(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUE  r{  r$   c                     |                     |           |                    |                                           d S Nry   r\   r   rp  r   s      r"   op_JUMP_FORWARDzTraceRunner.op_JUMP_FORWARD  :    T

d**,,
-----r$   c                     |                     |           |                    |                                           d S r  r  r   s      r"   op_JUMP_BACKWARDzTraceRunner.op_JUMP_BACKWARD  r  r$   c                     |                     |           |                    |                                           d S r  r  r   s      r"   op_JUMP_ABSOLUTEzTraceRunner.op_JUMP_ABSOLUTE  r  r$   c                     |                     d          d         }|                    ||           |                                 |                    |           d S )Nr   rz   r{   ry   )r   r\   	pop_blockr   )r    rq   r   rz   s       r"   op_BREAK_LOOPzTraceRunner.op_BREAK_LOOP  sZ    !!&))%0Ts###

c
r$   c                     |                     ||                                |                                           |                                 d S )N)retvalcastval)r\   r   r  	terminater   s      r"   op_RETURN_VALUEzTraceRunner.op_RETURN_VALUE  sB    T%))++u7H7HIIIr$   c                     |                                 }|                                }|                    |||           |                    |           d S N)r!   r  r/  r    rq   r   valr  s        r"   op_YIELD_VALUEzTraceRunner.op_YIELD_VALUE  I    iikkooT#...

3r$   c                    |j         dk    r@d }|                                r)t          d|                     |j                            n/|j         dk    r|                                }nt          d          |                    ||           |                                r|                     |           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  r    rq   r   r  s       r"   op_RAISE_VARARGSzTraceRunner.op_RAISE_VARARGS"  s    x1}} '')) *N ..t{;;   
 Qiikk !LMMMLL3L'''##%% "))%00000!!!!!r$   c                    t          |                    d          d u|                    d          d ug          }|j        dk    r.d }|r)t          d|                     |j                            n/|j        dk    r|                                }nt          d          |                    ||           |	                                 d S )	Nr   r   r   r  r   r   r  r  )
anyr   r  r   r   r   r   r  r\   r  )r    rq   r   in_exc_blockr  s        r"   r  zTraceRunner.op_RAISE_VARARGS8  s    ##H--T9##I..d:   L x1}} *N ..t{;;   
 Qiikk !LMMMLL3L'''OOr$   c                     g }t          t                    D ]@}|                                }|                    |           |                    |           A|                    ||           d S )N)temps)r  r   r  r\   r   )r    rq   r   r  itmps         r"   op_BEGIN_FINALLYzTraceRunner.op_BEGIN_FINALLYM  sm    +,, 	 	A//##CLLJJsOOOOT'''''r$   c                 d    |                                 }|                    |d                    d S )Nr   )r  reset_stackr    rq   r   blks       r"   op_END_FINALLYzTraceRunner.op_END_FINALLYU  s0    oo#m,-----r$   c                 r    |j         dk    r+d}t          ||                     |j                            d S )Nr   zGUnsupported use of a bytecode related to try..finally or a with-contextr   )r  r   r   r   )r    rq   r   r   s       r"   op_POP_FINALLYzTraceRunner.op_POP_FINALLYY  s>    8q==(C"3D,>,>t{,K,KLLLL =r$   c                     d S r   r<   r   s      r"   op_CALL_FINALLYzTraceRunner.op_CALL_FINALLY`  s    r$   c                 .    |                                  d S r   )r  r   s      r"   op_WITH_EXCEPT_STARTz TraceRunner.op_WITH_EXCEPT_STARTc  s    r$   c                 0    |                     |           d S r   r   r   s      r"   op_WITH_CLEANUP_STARTz!TraceRunner.op_WITH_CLEANUP_STARTf      Tr$   c                 0    |                     |           d S r   r   r   s      r"   op_WITH_CLEANUP_FINISHz"TraceRunner.op_WITH_CLEANUP_FINISHj  r  r$   c                 ~    |                     |                    d|                                                     d S )Nr   r   rz   )
push_blockr   rp  r   s      r"   op_SETUP_LOOPzTraceRunner.op_SETUP_LOOPn  sN    ((**   	
 	
 	
 	
 	
r$   c                 j   |                                 }|                                }|                    d          }|                    |           |                    |           |j        }|                    |j                  }|g}|j        D ]'}	|	j        |j        k    r|                    |	           (t          d |D                       }
|                    ||||
           |
                    |                    d|
                     |                    |j                   d S )Nsetup_with_exitfnprefixc              3   $   K   | ]}|j         V  d S r   r{   )r  r   s     r"   	<genexpr>z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>  s$      --R"&------r$   )contextmanagerexitfnrz   r   r  ry   )r   r  r   rJ   find_exception_entryr   exception_entriesr   r\   maxr  r   r   )r    rq   r   cmyieldedr  bcehhead	ehrelatedr   rz   s              r"   op_BEFORE_WITHzTraceRunner.op_BEFORE_WITHw  s;   YY[[//##(;<<

6

7 _((33H	& 	% 	%ByFM))  $$$--9-----T"VEEE   	
 	
 	
 	

di
     r$   c                 B   |                                 }|                                }|                    d          }|                    |||           t          dk     r<|                    |                    d|                                                     |                    |           |                    |           |                    |                    d|                                                     |                    |j	                   d S )	Nr  r  )r  r  )rv   	   r   r  r   ry   )
r   r  r\   r	   r  r   rp  r   r   r   )r    rq   r   r  r  r  s         r"   op_SETUP_WITHzTraceRunner.op_SETUP_WITH  s   YY[[//##(;<<T"V<<< v  ',,.. !     	

6

7((**   	
 	
 	
 	

di
     r$   c           	          |                     |d d          }|                    ||                     d|d|                     d S )NF)r   rz   r  r   )r   rz   r  r   r   )r   r   )r    r   rq   r   rz   handler_blocks         r"   
_setup_tryzTraceRunner._setup_try  su     (( ) 
 
 	

((!%	 )   	 	
 	
 	
 	
 	
r$   c                     |                                 }|                    |                    d                     |                    |           d S )N	exception)r   r   r  )r    rq   r   rJ  s       r"   op_PUSH_EXC_INFOzTraceRunner.op_PUSH_EXC_INFO  s@    iikk

5??;//000

3r$   c                     |                     |           |                     d||j        |                                           d S )Nr   )r   rz   )r\   r  r   rp  r   s      r"   op_SETUP_FINALLYzTraceRunner.op_SETUP_FINALLY  sP    Tu49$2F2F2H2H 	 	
 	
 	
 	
 	
r$   c                 .    |                                  d S r   r
  r   s      r"   op_POP_EXCEPTzTraceRunner.op_POP_EXCEPT  s    IIKKKKKr$   c                    |                                 }|d         t          d          t          d          hvr2t          d|d          |                     |j                            |                                 |                                 |                                 |                    |j                   d S )Nr   r   r   z$POP_EXCEPT got an unexpected block: r   ry   )r  r   r   r   r   r   r   r   r  s       r"   r  zTraceRunner.op_POP_EXCEPT  s    //##C6{9X#6#6	)8L8L"MMM&H3v;HH**4;77    IIKKKIIKKKIIKKKJJ$)J$$$$$r$   c                 &   |                                 }|d         t          d          k    r|                    |d           n0|d         t          d          k    r|                    |d           |                    |j                   d S )Nr   r   try)r   r   withry   )r  r   r\   r   r   r  s       r"   op_POP_BLOCKzTraceRunner.op_POP_BLOCK  s    oov;)E****LLEL****[If----LLFL+++

di
     r$   c                     |                                 }|                                 }|                                }|                    ||||           |                    |           d S )N)indexr   r  r/  )r    rq   r   r  r   r  s         r"   op_BINARY_SUBSCRzTraceRunner.op_BINARY_SUBSCR  sX    		ooTv3???

3r$   c                     |                                 }|                                 }|                                 }|                    ||||           d S )N)r   r  r!   r8  )r    rq   r   r  r   r!   s         r"   op_STORE_SUBSCRzTraceRunner.op_STORE_SUBSCR  sI    				T&UCCCCCr$   c                     |                                 }|                                 }|                    |||           d S )N)r   r  r8  )r    rq   r   r  r   s        r"   op_DELETE_SUBSCRzTraceRunner.op_DELETE_SUBSCR  s:    		T&66666r$   c                    |j         }t          t          fdt          |          D                                 }                                }                                }t          |          r|}n|}|g|}                                }                                }	                    ||||	|           	                    |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z'TraceRunner.op_CALL.<locals>.<listcomp>   !    ???aeiikk???r$   )funcr@   kw_namesr  )
r  r   r  r  r   r   r  pop_kw_namesr\   r   )
r    rq   r   nargr@   callable_or_firstargnull_or_callablecallabler  r  s
    `        r"   op_CALLzTraceRunner.op_CALL  s    xH????5;;???@@AA$yy{{ 99;;-.. 	1+HH'H(040Doo%%''TthCPPP

3r$   c                 :    |                     |j                   d S r   )set_kw_namesr  r   s      r"   op_KW_NAMESzTraceRunner.op_KW_NAMES  s    48$$$$$r$   c                 ,   |j         }t          t          fdt          |          D                                 }                                }                                }                    ||||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>  r  r$   )r  r@   r  )r  r   r  r  r   r  r\   r   )r    rq   r   r  r@   r  r  s    `     r"   op_CALL_FUNCTIONzTraceRunner.op_CALL_FUNCTION  s    xH????5;;???@@AAyy{{ooT4S999

3r$   c                 V   |j         }                                }t          t          fdt	          |          D                                 }                                }                                }                    |||||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>  r  r$   )r  r@   namesr  )r  r   r   r  r  r  r\   r   )r    rq   r   r  r  r@   r  r  s    `      r"   op_CALL_FUNCTION_KWzTraceRunner.op_CALL_FUNCTION_KW  s    x		H????5;;???@@AAyy{{ooT4u#FFF

3r$   c                    |j         dz  rt          dk     rd}t          |          |j         dz  r|                                }nd }|                                }|                                }t          dk    r6t	          |                    d                    r|                                 |                                }|                    |||||           |                    |           d S )Nr   )rv   
   z,CALL_FUNCTION_EX with **kwargs not supportedru   )r  varargvarkwargr  )	r  r	   r   r   r   peekr  r\   r   )r    rq   r   errmsgr  r  r  r  s           r"   op_CALL_FUNCTION_EXzTraceRunner.op_CALL_FUNCTION_EX$  s    8a< 	+I//CF"6***8a< 	yy{{HHHyy{{ A// 		ooTVhCPPP

3r$   c                 4   fdt          |          D             }|                                 fdt          |          D             }                    |||           |D ]}                    |           |D ]}                    |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z)TraceRunner._dup_topx.<locals>.<listcomp>8  s!    222		222r$   c                 8    g | ]}                                 S r<   r  r  s     r"   r  z)TraceRunner._dup_topx.<locals>.<listcomp><  s#    999q""999r$   )origduped)r  reverser\   r   )r    rq   r   r  r  r  r  s    `     r"   	_dup_topxzTraceRunner._dup_topx7  s    2222U5\\222 :999E%LL999TE222 	 	CJJsOOOO 	 	CJJsOOOO	 	r$   c                 t    |j         }d|cxk    rdk    sn J d            |                     |||           d S )Nr      zInvalid DUP_TOPX count)r  r  )r    rq   r   r  s       r"   op_DUP_TOPXzTraceRunner.op_DUP_TOPXC  sG    EQ 8udE*****r$   c                 6    |                      ||d           d S )Nr   r  r  r   s      r"   
op_DUP_TOPzTraceRunner.op_DUP_TOPH       ud!,,,,,r$   c                 6    |                      ||d           d S )Nrg  r  r  r   s      r"   op_DUP_TOP_TWOzTraceRunner.op_DUP_TOP_TWOK  r  r$   c                 `    |                     |                    |j                             d S r   )r   r  r  r   s      r"   op_COPYzTraceRunner.op_COPYN  s(    

5::dh''(((((r$   c                 :    |                     |j                   d S r   )swapr  r   s      r"   op_SWAPzTraceRunner.op_SWAPQ  s    

48r$   c                     |                                 }|                                 }|                    |           |                    |           d S r   r   r   )r    rq   r   firstseconds        r"   
op_ROT_TWOzTraceRunner.op_ROT_TWOT  sF    		

5

6r$   c                     |                                 }|                                 }|                                 }|                    |           |                    |           |                    |           d S r   r"  )r    rq   r   r#  r$  thirds         r"   op_ROT_THREEzTraceRunner.op_ROT_THREEZ  se    				

5

5

6r$   c                 N   |                                 }|                                 }|                                 }|                                 }|                    |           |                    |           |                    |           |                    |           d S r   r"  )r    rq   r   r#  r$  r'  forths          r"   op_ROT_FOURzTraceRunner.op_ROT_FOURb  s    						

5

5

5

6r$   c                    |j         }                                }fdt          |          D             }                                }                    ||||           t          |          D ]}                    |           d S )Nc                 8    g | ]}                                 S r<   r  r  s     r"   r  z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>o  s#    :::%//##:::r$   )iterablestorestupleobj)r  r   r  r  r\   r  r   )r    rq   r   r  r.  r/  r0  sts    `      r"   op_UNPACK_SEQUENCEzTraceRunner.op_UNPACK_SEQUENCEl  s    99;;::::U5\\:::??$$THVhOOO6"" 	 	BJJrNNNN	 	r$   c                    |j         }t          t          fdt          |          D                                 }                                }                    |||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>w  !    AAAquyy{{AAAr$   r   r  r  )r    rq   r   r  r   tups    `    r"   op_BUILD_TUPLEzTraceRunner.op_BUILD_TUPLEu  t    XAAAAE%LLAAABBCCooTC000

3r$   c                    t          t          fdt          |j                  D                                 }fdt          t	          |          dz
            D             }t	          |          dk    }|r                                g}                    ||||                               |d                    d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>~  s!    EEE		EEEr$   c                 8    g | ]}                                 S r<   r  r  s     r"   r  z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>  s#    CCCq""CCCr$   r   )tuplesr  	is_assignr   )r   r  r  r  lenr  r\   r   )r    rq   r   r=  r  r>  s    `    r"   _build_tuple_unpackzTraceRunner._build_tuple_unpack|  s    hEEEEU48__EEEFFGGCCCCE#f++/,B,BCCC KK1$	 	)__&&(ET&KKK

59r$   c                 2    |                      ||           d S r   r@  r   s      r"   op_BUILD_TUPLE_UNPACK_WITH_CALLz+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALL  s      -----r$   c                 2    |                      ||           d S r   rB  r   s      r"   op_BUILD_TUPLE_UNPACKz!TraceRunner.op_BUILD_TUPLE_UNPACK  s      -----r$   c                     |                                 }|                                }|                    |||           |                    |           d S )N)
const_listr  r/  )r    rq   r   rJ  r  s        r"   op_LIST_TO_TUPLEzTraceRunner.op_LIST_TO_TUPLE  sK     iikkooTcs333

3r$   c                 j                                    }t          t          fdt          |j                  D                                 }fdt          |j                  D             }                                }                    |||||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>  s!    CCCaeiikkCCCr$   c                 8    g | ]}                                 S r<   r  r  s     r"   r  z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>  s#    >>>5??$$>>>r$   )keyskeytmpsvaluesr  )r   r   r  r  r  r  r\   r   )r    rq   r   rL  valsrM  r  s    `     r"   op_BUILD_CONST_KEY_MAPz"TraceRunner.op_BUILD_CONST_KEY_MAP  s    yy{{HCCCC5??CCCDDEE>>>>eDHoo>>>ooTgdLLL

3r$   c                    |j         }t          t          fdt          |          D                                 }                                }                    |||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>  r5  r$   r6  r  )r    rq   r   r  r   lsts    `    r"   op_BUILD_LISTzTraceRunner.op_BUILD_LIST  r9  r$   c                     |                                 }|j        }|                    |          }|                                }|                                }|                    |||||           d S )N)r   r!   	appendvarr  r   r  r  r  r\   )r    rq   r   r!   r  r   rV  r  s           r"   op_LIST_APPENDzTraceRunner.op_LIST_APPEND  u    		E""OO%%	ooT& 	 	 	 	 	 	r$   c                     |                                 }|j        }|                    |          }|                                }|                                }|                    |||||           d S )N)r   r!   	extendvarr  rW  )r    rq   r   r!   r  r   r[  r  s           r"   op_LIST_EXTENDzTraceRunner.op_LIST_EXTEND  rY  r$   c                 P   |                                 }|j        }g }t          |          D ]A}|                                |                                }}|                    ||f           B|                    ||d d d         ||           |                    |           d S )Nr   )r   sizer  )r  r  r  r   r\   r   )	r    rq   r   dctr  r   r  vks	            r"   op_BUILD_MAPzTraceRunner.op_BUILD_MAP  s    oou 	! 	!A99;;		qALL!Q    Tttt5cBBB

3r$   c                    |                                 }|                                 }||}}|j        }|                    |          }|                                }	|                                }
|                    |||||	|
           d S )N)r   rV   r!   
setitemvarr  rW  )r    rq   r   TOSTOS1rV   r!   r  r   rd  r  s              r"   
op_MAP_ADDzTraceRunner.op_MAP_ADD  s    iikkyy{{CUE""__&&
ooT&c * 	 	5 	5 	5 	5 	5r$   c                    |j         }t          t          fdt          |          D                                 }                                }                    |||                               |           d S )Nc                 8    g | ]}                                 S r<   r
  r  s     r"   r  z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>  r5  r$   r6  r  )r    rq   r   r  r   r  s    `    r"   op_BUILD_SETzTraceRunner.op_BUILD_SET  st    XAAAAE%LLAAABBCCooTC000

3r$   c                     |                                 }|j        }|                    |          }|                                }|                                }|                    |||||           d S N)r   r!   	updatevarr  rW  r    rq   r   r!   r  r   rm  r  s           r"   op_SET_UPDATEzTraceRunner.op_SET_UPDATE  rY  r$   c                     |                                 }|j        }|                    |          }|                                }|                                }|                    |||||           d S rl  rW  rn  s           r"   op_DICT_UPDATEzTraceRunner.op_DICT_UPDATE  rY  r$   c                     |                                 }|                                }|                    |||           |                    |           d S r  r/  )r    rq   r   r!   r  s        r"   op_GET_ITERzTraceRunner.op_GET_ITER  sI    		ooTC000

3r$   c                    |                                 }|                                }|                                }|                                }|                    |||||           |                    |           |                                }|                    |d           |                    |j                   d S )N)iteratorpairindvalro  rg  ru  ry   )rv  r  r\   r   rp  r   r   )r    rq   r   ru  rv  rw  ro  rz   s           r"   op_FOR_ITERzTraceRunner.op_FOR_ITER  s    ==??  ""  TH4 	 	  	  	 

6""$$

c
"""

di
     r$   c                     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   s      r"   op_GEN_STARTzTraceRunner.op_GEN_START  s	     	r$   c                 D   t           j        |j                 d         }|                                }|                                }t          |         j        }|                    d|           }|                    |||||           |                    |           d S )Nr   binop_r  )oplhsr   r  )	dis_nb_opsr  r   r
   r7   r  r\   r   )r    rq   r   r}  r   r~  op_namer  s           r"   op_BINARY_OPzTraceRunner.op_BINARY_OP  s    ["1%iikkiikk)"-6oo%7g%7%7o88Tbcs<<<

3r$   c                     |                                 }|                                }|                    |||           |                    |           d S r  r/  r  s        r"   _unaryopzTraceRunner._unaryop  r  r$   c                     |                                 }|                                 }|                                }|                    ||||           |                    |           d S )N)r~  r   r  r/  )r    rq   r   r   r~  r  s         r"   	_binaryopzTraceRunner._binaryop  sX    iikkiikkooTs555

3r$   Fc           
      >   t           dk    rd }n4t           dk     r|                                }nt          t                     |                                }d x}x}x}}	|j        dz  r|                                }|j        dz  r|                                }|j        dz  r|                                }|j        dz  r|                                }	|                                }
|                    |||||||	|
           |                    |
           d S )Nru         rg  r   )r3  codeclosureannotations
kwdefaultsdefaultsr  )r	   r   r   r  r  r\   r   )r    rq   r   MAKE_CLOSUREr3  r  r  r  r  r  r  s              r"   op_MAKE_FUNCTIONzTraceRunner.op_MAKE_FUNCTIONG  s"    DD  99;;DD%i000yy{{8<<<+<
X8c> 	"iikkG8c> 	&))++K8c> 	%J8c> 	#yy{{Hoo#! 	 		
 		
 		
 	

3r$   c                 6    |                      ||d           d S )NT)r  )r  r   s      r"   op_MAKE_CLOSUREzTraceRunner.op_MAKE_CLOSUREg  s#    eT=====r$   c                     |                                 }|                    ||           |                    |           d S r  r   r!  s       r"   op_LOAD_CLOSUREzTraceRunner.op_LOAD_CLOSUREj  r(  r$   c                     |                     d          }|                    ||           |                    |           d S )Nassertion_errorr  r   r!  s       r"   op_LOAD_ASSERTION_ERRORz#TraceRunner.op_LOAD_ASSERTION_ERRORo  s=    oo/00Ts###

3r$   c                     |                     d          }|                                }|                                }|                    ||||           |                    |           d S )N	predicatero  rJ  rK  )r  r   rv  r\   r   r    rq   r   ro  rJ  rK  s         r"   op_CHECK_EXC_MATCHzTraceRunner.op_CHECK_EXC_MATCHt  s_    {++iikk}}T#D999

4r$   c                 8   |                     d          }|                                }|                                }|                    ||||           |                    |j                   |                    |                                           d S )Nr  r  ry   )r  r   r\   r   r   rp  r  s         r"   op_JUMP_IF_NOT_EXC_MATCHz$TraceRunner.op_JUMP_IF_NOT_EXC_MATCH{  s     {++iikkyy{{T#D999

di
   

d**,,
-----r$   c                    |                                 }|j        dk    r|                                  |                    ||           |                                r|                     |           d S |                                 d S )Nr   r  )r   r  r\   r   r   r  r  s       r"   
op_RERAISEzTraceRunner.op_RERAISE  s    ))++Cx1}}		LL3L'''##%% "))%00000!!!!!r$   c                     |                                 }|                    ||           |                                 d S )Nr  )r   r\   r  r  s       r"   r  zTraceRunner.op_RERAISE  s;    ))++CLL3L'''OOr$   c                    |                                 }|                                }|                    |           |                                }|                    |||           |                    |           d S r-  )r   r   r   r  r\   )r    rq   r   r.  extrar  s         r"   op_LOAD_METHODzTraceRunner.op_LOAD_METHOD  sj    99;;DOO%%EJJu//##CLLDcL222JJsOOOOOr$   c                 2    |                      ||           d S r   )r0  r   s      r"   r  zTraceRunner.op_LOAD_METHOD  s    eT*****r$   c                 2    |                      ||           d S r   )r  r   s      r"   op_CALL_METHODzTraceRunner.op_CALL_METHOD  s    eT*****r$   N)F)r7   r8   r9   r:   r#   r   r`   r   r   r   r   r   r   r  r  r  r  r	   r  r   r#  r%  r'  r+  r0  r4  r6  r9  r;  r?  rB  rL  rO  rR  rU  rX  rZ  r\  r^  ra  rc  re  rl  rs  op_POP_JUMP_IF_TRUEop_POP_JUMP_IF_FALSErw  op_JUMP_IF_FALSE_OR_POPop_JUMP_IF_TRUE_OR_POPrz  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+  r2  r8  r@  rC  rE  rH  rP  rT  rX  r\  rb  rg  rj  ro  rq  rs  rx  rz  r  r  op_UNARY_NEGATIVEop_UNARY_POSITIVEop_UNARY_NOTop_UNARY_INVERTr  op_COMPARE_OPop_IS_OPop_CONTAINS_OPop_INPLACE_ADDop_INPLACE_SUBTRACTop_INPLACE_MULTIPLYop_INPLACE_DIVIDEop_INPLACE_TRUE_DIVIDEop_INPLACE_FLOOR_DIVIDEop_INPLACE_MODULOop_INPLACE_POWERop_INPLACE_MATRIX_MULTIPLYop_INPLACE_LSHIFTop_INPLACE_RSHIFTop_INPLACE_ANDop_INPLACE_ORop_INPLACE_XORop_BINARY_ADDop_BINARY_SUBTRACTop_BINARY_MULTIPLYop_BINARY_DIVIDEop_BINARY_TRUE_DIVIDEop_BINARY_FLOOR_DIVIDEop_BINARY_MODULOop_BINARY_POWERop_BINARY_MATRIX_MULTIPLYop_BINARY_LSHIFTop_BINARY_RSHIFTop_BINARY_ANDop_BINARY_ORop_BINARY_XORr  r  r  r  r  r  r  r  r  r<   r$   r"   rX   rX   4  s0	          
0 0 0M M M./ / /(              "  "   G	 	 	 	 
W			 	 	 	
 "!),,,      
$ $ $
      * * *7 7 7
( ( (( ( (  *  *  *
 
 
$
 
 
(
 
 
(
 
 
(
 
 

 
 
$
 
 
$
 
 
  6
' 
' 
' **. . . 1/* * ** * ** * ** * ** * ** * ** * ** * *. . .. . .. . .       G	" 	" 	" 	"* 
W			 	 	 	& "!( ( (. . .M M M        
 
 
! ! !<! ! !8
 
 
(  

 
 
 G	 	 	 	 
W			% 	% 	% 	% "!),,,! ! !  D D D7 7 7
   % % %      &
 
 
+ + +
- - -- - -) ) )              . . .. . .          	 	 		5 	5 	5        
! 
! 
!	 	 	     ! LO   MHNN##!&'! !*!!NMNM"" %& O )  MLM   @> > >  
  
  . . . G
	" 
	" 
	" 
	" 
W			 	 	 	 "!),,,
 G	 	 	 	 
W			+ 	+ 	+ 	+ "!),,,+ + + + +r$   rX   c                   X   e Zd ZdZd,dZd Zd Zd Zd Zd Z	e
d	             Ze
d
             Ze
d             Ze
d             Ze
d             Ze
d             Zd Zd Zd Zd Zd-dZd Zd Zd Zd Zd Zd Zd Zd Zd.dZd  Zd! Z d" Z!d# Z"d$ Z#d% Z$d& Z%d/d(Z&d) Z'd* Z(d+ Z)dS )0_StatezState of the trace
    r<   c                    || _         || _        || _        || _        g | _        t          |          | _        t          |          | _        g | _	        g | _
        g | _        d| _        i | _        t                      | _        t!                      | _        t%          |          D ]P}||v r|                     d          }n|                     d          }|| j        |<   |                     |           Qd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)rJ   _pc_initialr   _nstack_initialr_   tuple_blockstack_initialr   r   _temp_registers_insts	_outedges_terminatedr   r   r   r   r   r  r  r   )r    rL   rN   rO   rP   nullvalsr  r   s           r"   r#   z_State.__init__  s     "%#(#4#4 
++! 
(ll%%v 	 	AH}}nnW--nnU++DJsOIIcNNNN	 	r$   c                 B    d                     | j        | j                  S )Nz&State(pc_initial={} nstack_initial={}))r/   r  r  r(   s    r"   r6   z_State.__repr__  s%    7>>d2
 
 	
r$   c                     | j         | j        fS r   )r  r  r(   s    r"   get_identityz_State.get_identity  s     $"677r$   c                 D    t          |                                           S r   )r&   r  r(   s    r"   r)   z_State.__hash__  s    D%%''(((r$   c                 V    |                                  |                                 k     S r   r  r0   s     r"   r2   z_State.__lt__  s%      ""U%7%7%9%999r$   c                 V    |                                  |                                 k    S r   r  r0   s     r"   r4   z_State.__eq__  s%      ""e&8&8&:&:::r$   c                     | j         S )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )r  r(   s    r"   rS   z_State.pc_initial  s    
 r$   c                     | j         S )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )r  r(   s    r"   instructionsz_State.instructions  s    
 {r$   c                     | j         S )zaThe list of outgoing edges.

        Returns
        -------
        edges : List[State]
        r  r(   s    r"   rf   z_State.outgoing_edges  s     ~r$   c                     | j         S )zThe dictionary of outgoing phi nodes.

        The keys are the name of the PHI nodes.
        The values are the outgoing states.
        )r   r(   s    r"   outgoing_phisz_State.outgoing_phis  s     ""r$   c                     | j         S )z6A copy of the initial state of the blockstack
        )r  r(   s    r"   blockstack_initialz_State.blockstack_initial  s     ''r$   c                 *    t          | j                  S )zYThe current size of the stack

        Returns
        -------
        res : int
        )r?  r_   r(   s    r"   r}   z_State.stack_depth  s     4;r$   c                 n    t          | j                  D ]}|d         t          d          k    r|c S  dS )z&Find the initial *try* block.
        r   r   N)r  r  r   )r    r  s     r"   find_initial_try_blockz_State.find_initial_try_block  sM     D455 	 	C6{i....


 /	 	r$   c                     | j         S r   r  r(   s    r"   ra   z_State.has_terminated  s    r$   c                 &    | j         | j                 S r   )rJ   r   r(   s    r"   r   z_State.get_inst"  s    ~dh''r$   c                 F    |                                  }|j        | _        d S r   )r   r   r   r    r   s     r"   r   z_State.advance_pc%  s    }}9r$    c                 P   |sZd                     || j        |                                 j                                        t          | j                            }n/d                     || j        t          | j                            }| j                            |           |S )Nz"${prefix}{offset}{opname}.{tempct})r  r   r   tempctz${prefix}{offset}.{tempct})r  r   r  )r/   r   r   r   lowerr?  r  r\   )r    r  r3  s      r"   r  z_State.make_temp)  s     	7>>x}}-33554/00	 ?  DD 066x4/00 7  D 	##D)))r$   c                     | j                             |j        |f           | xj        t	          t          |                                                    z  c_        dS )zAppend new instN)r  r\   r   r   r   _flatten_inst_regsrN  )r    r   rA   s      r"   r\   z_State.append;  sL    DK011131&--//BBCCCr$   c                 ,    |                      d          S )Nr   )r  r(   s    r"   rv  z_State.get_tos@  s    yy||r$   c                     | j         |          S )z-Return the k'th element on the stack
        r_   )r    ra  s     r"   r  z_State.peekC  s     {A2r$   c                 :    | j                             |           dS )zPush to stackN)r_   r\   )r    r.  s     r"   r   z_State.pushH  s    4     r$   c                 4    | j                                         S )zPop the stack)r_   r   r(   s    r"   r   z
_State.popL  s    {   r$   c                 F    | j         }||          |d         c|d<   || <   dS )zSwap stack[idx] with the tosr   Nr  )r    r  ss      r"   r  z_State.swapP  s,    KC4!B%"q#wwwr$   c                 F    d|v sJ | j                             |           dS )z#Push a block to blockstack
        r}   N)r   r\   )r    synblks     r"   r  z_State.push_blockU  s2     &&&&'''''r$   c                 N    | j         d|         | j         |d         c| _         }|S )zVReset the stack to the given stack depth.
        Returning the popped items.
        Nr  )r    r   poppeds      r"   r  z_State.reset_stack[  s-     #k&5&14;uvv3FVr$   TNc                     t          |          |t          | j                  d}|rt          | j                  |d<   nd|d<   ||d<   |S )zMake a new block
        )r   rz   r   r}   Nr   )r   r?  r_   )r    r   rz   r  r   ds         r"   r   z_State.make_blockb  sb     dOOt{++
 

  	$"4;//Am#Am)r$   c                 n    | j                                         }|                     |d                    |S )z)Pop a block and unwind the stack
        r}   )r   r   r  r    r   s     r"   r  z_State.pop_blockq  s6       ""=)***r$   c                     | j                             |          }d|cxk    rt          | j                   k     sn J | j         d|         | _         dS )zcFind *blk* in the blockstack and remove it and all blocks above it
        from the stack.
        r   N)r   r  r?  )r    r  r  s      r"   r   z_State.pop_block_and_abovex  sd     $$S))C////#d.////////+DSD1r$   c                 r    t          |          }t          | j                  D ]}|d         |k    r|c S dS )1Find the first block that matches *kind*
        r   N)r   r  r   )r    r   bss      r"   r   z_State.get_top_block  sP     4+,, 	 	B&zT!!			 "	 	r$   c                 h    d |D             }t          | j                  D ]}|d         |v r|c S dS )r  c                 ,    h | ]}t          |          S r<   )r   )r  r   s     r"   	<setcomp>z._State.get_top_block_either.<locals>.<setcomp>  s    333T4333r$   r   N)r  r   )r    kindsr  s      r"   get_top_block_eitherz_State.get_top_block_either  sX     43U3334+,, 	 	B&zU""			 #	 	r$   c                 0    |                      d          duS )zGReturns a boolean indicating if the top-block is a *try* block
        r   N)r   r(   s    r"   r   z_State.has_active_try  s     !!%((44r$   c                 0    | j         j        |j                 S )z4Get referenced variable name from the oparg
        )rJ   co_varnamesr  r  s     r"   r2  z_State.get_varname  s     ~)$(33r$   c                     d| _         dS )z!Mark block as terminated
        TNr  r(   s    r"   r  z_State.terminate  s      r$   r   c           
      *   t          | j                  }|rDd|cxk    rt          | j                  k    sn J t          | j                  |z
  }|d|         }|rAd|k    sJ t          |          D ])}|                    |                                            *t          | j                  }t          dk    rF|rC|d         }	|	                    d          p|	d         }
||
k    r|	                                 nn|Cn t          dk     rnt          t                    |r|                    |           | j                            t          |t          |          |t          |                               |                                  dS )zFork the state
        r   Nru   r   r|   rz   )rN   stackr   rP   )r   r_   r?  r  r\   r  r   r	   getr   r   r  Edger  r  )r    rN   r   r   r   r  rO   r  rP   toprz   s              r"   r   z_State.fork  s    T[!! 	#0000DK 0 0000000%%,F'6'NE 	/::::5\\ / /T^^--....$*++
  nggl++9s5z99NN$$$$     %i000 	+k***duUZ((
 
 
 	 	 	 	r$   c                 <    |                      | j                   dS )zSplit the state
        ry   N)r   r   r(   s    r"   re   z_State.split_new_block  s      			TX	r$   c                 d   | j         rJ g }| j        D ]}t          | j        |j        t          |j                  |j        d t          |j                  D                       }|	                    |           |j
                                        D ]\  }}|j        |         | j         |<   |S )z+Get states for each outgoing edges
        c                 6    g | ]\  }}t          |          |S r<   )r   )r  r  r`  s      r"   r  z._State.get_outgoing_states.<locals>.<listcomp>  s8     $= $= $=$!Q'8';';$=A $= $= $=r$   )rL   rN   rO   rP   r  )r   r  rW   rJ   rN   r?  r  rP   	enumerater\   r   r   )r    retr   rq   r   r  s         r"   rh   z_State.get_outgoing_states  s     &&&&N 	9 	9D4>dg!$TZT_$= $=)DJ2G2G $= $= $=> > >E JJu+++-- 9 9Q+/:a=#C((9
r$   c                 $    d | j         D             S )z
        Returns
        -------
        Dict[int, int]
            where keys are the PC
            values are the edge-pushed stack values
        c                 ^    i | ]*}|j         t          |j        |j         d                    +S r   )rN   r  r  r   )r  r   s     r"   
<dictcomp>z2_State.get_outgoing_edgepushed.<locals>.<dictcomp>  sC     , , , tz4:+,,788 , , ,r$   r  r(   s    r"   get_outgoing_edgepushedz_State.get_outgoing_edgepushed  s%    , , N, , , 	,r$   )r<   )r  )TN)r   r   N)*r7   r8   r9   r:   r#   r6   r  r)   r2   r4   propertyrS   r  rf   r  r  r}   r  ra   r   r   r  r\   rv  r  r   r   r  r  r  r   r  r   r   r  r   r2  r  r   re   rh   r#  r<   r$   r"   r  r    s        ! ! ! !F
 
 

8 8 8) ) ): : :; ; ;     X    X   X # # X# ( ( X(
     X        ( ( (     $D D D
    
! ! !! ! !( ( (
( ( (       2 2 2    5 5 5
4 4 4
     
# # # #J  
  "
, 
, 
, 
, 
,r$   r  c                   B     e Zd Z fdZd Zd Zd Zd Zd Zd Z	 xZ
S )
StatePy311c                 H     t                      j        |i | d | _        d S r   )superr#   	_kw_names)r    r@   rA   	__class__s      r"   r#   zStatePy311.__init__  s*    $)&)))r$   c                 "    | j         }d | _         |S r   r)  )r    outs     r"   r  zStatePy311.pop_kw_names  s    n
r$   c                 &    | j         J || _         d S r   r,  )r    r  s     r"   r  zStatePy311.set_kw_names  s    ~%%%r$   c                 H    | j         }|                    | j                  d uS r   rJ   r  r   r    r  s     r"   r   zStatePy311.is_in_exception  s$    ^&&tx00<<r$   c                 D    | j         }|                    | j                  S r   r0  r1  s     r"   r   zStatePy311.get_exception  s    ^&&tx000r$   c                 R    | j         D ]}|d         t          d          k    r dS d S )Nr   r   T)r  r   )r    ents     r"   r   zStatePy311.in_with  sA    + 	 	C6{i////tt 0	 	r$   c                 .    |                      d          S )Nr  r  r  r(   s    r"   r   zStatePy311.make_null  s    ~~W~---r$   )r7   r8   r9   r#   r  r  r   r   r   r   __classcell__)r*  s   @r"   r&  r&    s              
  = = =1 1 1  
. . . . . . .r$   r&  ru   r  )rN   r  rP   r   c                   .    e Zd ZdZd Zed             ZdS )AdaptDFAz<Adapt Flow to the old DFA class expected by Interpreter
    c                     || _         d S r   )_flow)r    flows     r"   r#   zAdaptDFA.__init__  s    


r$   c                     | j         j        S r   )r:  rK   r(   s    r"   infoszAdaptDFA.infos  s    z%%r$   N)r7   r8   r9   r:   r#   r$  r=  r<   r$   r"   r8  r8    sH            & & X& & &r$   r8  AdaptBlockInfoinstsr  rP   active_try_blockoutgoing_edgepushedc                     t          t          | j                  | j        | j        |                                 |                                           S )Nr?  )r>  r  r  r  r  r  r#  )rq   s    r"   rm   rm   #  sQ    E&'')+5577!99;;   r$   c              #      K   | D ]N}t          |t                    r|V  t          |t          t          f          rt	          |          D ]}|V  OdS )z<Flatten an iterable of registers used in an instruction
    N)r-   strr  r   r  )r.  r.  rT   s      r"   r  r  -  sw         dC   	JJJJudm,, 	'--   r$   c                   f    e Zd ZdZd Zed             Zed             Zed             Zd Z	d Z
dS )	AdaptCFAz<Adapt Flow to the old CFA class expected by Interpreter
    c                    || _         i | _        |j                                        D ]\  }}t	          ||          | j        |<   | j         j                                        }|j        }|                                }t                      }| j        	                                D ],}|
                    |          r|                    |           -||z
  | _        d S r   )r:  _blocksrK   r   AdaptCFBlockr   backboner   blocksrL  in_loopsrg   	_backbone)r    r;  r   	blockinforK  r   inloopblocksr   s           r"   r#   zAdaptCFA.__init__;  s    
!%!1!7!7!9!9 	C 	CFI#/	6#B#BDL  :%..00>>## uu!!## 	$ 	$A~~a   $  ###!L0r$   c                     | j         j        S r   )r:  r   r(   s    r"   r   zAdaptCFA.graphN  s    z!!r$   c                     | j         S r   )rN  r(   s    r"   rK  zAdaptCFA.backboneR  s
    ~r$   c                     | j         S r   )rI  r(   s    r"   rL  zAdaptCFA.blocksV  s
    |r$   c              #   V   K   t          | j                  D ]}| j        |         V  d S r   )rl   rL  r  s     r"   iterliveblockszAdaptCFA.iterliveblocksZ  s>      $$ 	! 	!A+a.    	! 	!r$   c                 B    | j         j                                         d S r   )r:  r   rI   r(   s    r"   rI   zAdaptCFA.dump^  s    
!!!!!r$   N)r7   r8   r9   r:   r#   r$  r   rK  rL  rU  rI   r<   r$   r"   rG  rG  8  s         1 1 1& " " X"   X   X! ! !" " " " "r$   rG  c                       e Zd Zd ZdS )rJ  c                 Z    || _         t          d |j        D                       | _        d S )Nc              3       K   | ]	\  }}|V  
d S r   r<   )r  r  r  s      r"   r  z(AdaptCFBlock.__init__.<locals>.<genexpr>e  s&      881!888888r$   )r   r  r@  body)r    rO  r   s      r"   r#   zAdaptCFBlock.__init__c  s-    88	88888			r$   N)r7   r8   r9   r#   r<   r$   r"   rJ  rJ  b  s#        9 9 9 9 9r$   rJ  ).r:   r  pprintr   loggingcollectionsr   r   r   	functoolsr   numba.core.utilsr   r	   r
   numba.core.controlflowr   r   numba.core.irr   numba.core.errorsr   	getLoggerr7   rG   r   r   r;   r   objectr   r>   rE   r   rX   r  r&  rW   r   r  r8  r>  rm   r  rG  rJ  r<   r$   r"   <module>re     sZ    


        6 6 6 6 6 6 6 6 6 6 $ $ $ $ $ $ K K K K K K K K K K 8 8 8 8 8 8 8 8       . . . . . . '
H
%
% #	      3 3 3 3 3 3 3 3@2 2 2 2 2F 2 2 2g, g, g, g, g,6 g, g, g,T$ $ $x+ x+ x+ x+ x+& x+ x+ x+v# t, t, t, t, t,V t, t, t,n	. . . . . . . .> EEEE

i
(
(( z&@@@AA& & & & &v & & &        '" '" '" '" '"v '" '" '"T9 9 9 9 96 9 9 9 9 9r$   