U
    ô¾|eíê  ã                   @   s   d Z ddlZddlmZ ddlZddlmZmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZ e e¡Zd
ZeZeddddhƒZe
G dd„ deƒƒZG dd„ deƒZG dd„ deƒZ dd„ Z!G dd„ deƒZ"e
G dd„ deƒƒZ#G dd„ de#ƒZ$edkre$Z%nedk r.e#Z%ne&eƒ‚eddd d!d"gƒZ'G d#d$„ d$eƒZ(ed%d&d'd!d(d)gƒZ)d*d+„ Z*d,d-„ Z+G d.d/„ d/eƒZ,G d0d1„ d1eƒZ-dS )2z)
Implement python 3.8+ bytecode analysis
é    N)Úpformat)Ú
namedtupleÚdefaultdictÚdeque)Útotal_ordering)Ú
UniqueDictÚ	PYVERSIONÚALL_BINOPS_TO_OPERATORS)ÚNEW_BLOCKERSÚCFGraph)ÚLoc)ÚUnsupportedErroré   Ú
LOAD_CONSTÚNOPÚ
LOAD_DEREFZPRECALLc                   @   sL   e Zd ZdZeddddddhƒZdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú	BlockKindz?Kinds of block to make related code safer than just `str`.
    ÚLOOPÚTRYÚEXCEPTÚFINALLYÚWITHÚWITH_FINALLYc                 C   s   || j kst‚|| _d S ©N)Ú_membersÚAssertionErrorÚ_value)ÚselfÚvalue© r   úP/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/core/byteflow.pyÚ__init__&   s    zBlockKind.__init__c                 C   s   t t| ƒ| jfƒS r   )ÚhashÚtyper   ©r   r   r   r    Ú__hash__*   s    zBlockKind.__hash__c                 C   s,   t |tƒr| j|jk S td t|ƒ¡ƒ‚d S ©Nzcannot compare to {!r}©Ú
isinstancer   r   Ú	TypeErrorÚformatr#   ©r   Úotherr   r   r    Ú__lt__-   s    
zBlockKind.__lt__c                 C   s,   t |tƒr| j|jkS td t|ƒ¡ƒ‚d S r&   r'   r+   r   r   r    Ú__eq__3   s    
zBlockKind.__eq__c                 C   s   d  | j¡S )NzBlockKind({}))r*   r   r$   r   r   r    Ú__repr__9   s    zBlockKind.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	frozensetr   r!   r%   r-   r.   r/   r   r   r   r    r      s      ýr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_lazy_pformatc                 O   s   || _ || _d S r   )ÚargsÚkwargs©r   r6   r7   r   r   r    r!   >   s    z_lazy_pformat.__init__c                 C   s   t | j| jŽS r   )r   r6   r7   r$   r   r   r    Ú__str__B   s    z_lazy_pformat.__str__N)r0   r1   r2   r!   r9   r   r   r   r    r5   =   s   r5   c                   @   sl   e Zd ZdZdd„ Zdd„ Zedkr.dd„ Znedk r@d	d„ Zneeƒ‚d
d„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚFlowziData+Control Flow analysis.

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

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

ÿ






zFlow.run©é   é   c                 C   sÚ   |  ¡ s>| ¡ r>| ¡ jtkr>|j| ¡ jd | |¡ dS | ¡  |  ¡ sÖ| 	¡ rÖt
 d| ¡ |j¡ | ¡ }| d¡}|r”|d |jkr”d }nB|jd|jd}|j|d< |j|d< |j|d	< |j|j|d
 dS d S )N©rA   Tz3.11 exception %s PC=%sr   Úend©ri   Ú
end_offsetÚstack_depthÚ
push_lasti©rA   Úextra_block)Úin_withÚhas_active_tryÚget_instÚopnameÚ_NO_RAISE_OPSÚforkÚnextÚ_adjust_except_stackÚ
advance_pcÚis_in_exceptionr;   r<   Úget_exceptionÚ_pcÚget_top_blockÚtargetÚ
make_blockri   ÚdepthÚlasti)r   ra   rb   ÚehZeh_topZeh_blockr   r   r    rU   ‹   s0    ÿþ
 ÿ



zFlow._run_handle_exceptionc                 C   sº   |  ¡ r®| ¡ jtkr®|j| ¡ jd | d¡}| |¡ |j}i }||d krb||d  |d< |d }t	dƒt
t	dƒti|d  |d	< ||d
< |jf d|d i|—Ž dS | ¡  d S )Nrh   r   Úentry_stackÚnpopÚhandlerr   r   ÚkindÚnpushro   rA   ri   T)rq   rr   rs   rt   ru   rv   r|   Úpop_block_and_aboverl   r   Ú_EXCEPT_STACK_OFFSETÚ_FINALLY_POPrx   )r   ra   rb   ÚtryblkrB   r7   r„   r   r   r    rU   §   s,    ÿ

  þýc                 C   sd   t ƒ }|D ]}|j}| |¡ q
|D ]"}|jD ]}| |j|jd¡ q.q$| d¡ | ¡  || _d S )Nr   )	r   rE   Úadd_noderY   Úadd_edgerA   Úset_entry_pointÚprocessÚcfgraph)r   Z
all_statesÚgraphrb   ÚbÚedger   r   r    r]   ¿   s    

zFlow._build_cfgc           	         s   t  d dd¡¡ ‡fdd„}‡ ‡fdd„}‡ fdd	„}‡fd
d„}|ƒ \}‰ t  dt|ƒ¡ |ƒ \}}||ƒ |||ƒ t  d dd¡¡ d S )Nz
Prune PHIsé<   ú-c                     sR   t tƒ} tƒ }ˆ jD ]4}t|jƒ}t|jƒ}| |  ||@ O  < ||O }q| |fS r   )r   ÚsetrQ   Ú
_used_regsÚ_phis)Ú	used_phisÚphi_setrb   ÚusedÚphis©ra   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 ]*\}}|ˆ kr8|| |< ||  ||f¡ q qt dt| ƒ¡ t dt|ƒ¡ | |fS )Nz
defmap: %szphismap: %s)	r   r•   rQ   Ú_outgoing_phisÚitemsrZ   r;   r<   r5   )ÚdefmapÚphismaprb   ÚphiÚrhs©r™   ra   r   r    Úfind_use_defsÞ   s    
z'Flow._prune_phis.<locals>.find_use_defsc                    sš   t tƒ}d}tt|  ¡ ƒƒD ]`\}}tt|ƒƒD ].\}}|ˆ kr0|| | O }||  ||f¡ q0|| }||@ r||8 }d}qt dt| ƒ¡ |sq–qdS )znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            FTzchanging phismap: %sN)	r   r•   r_   ÚlistrŸ   rZ   r;   r<   r5   )r¡   Z	blacklistZchangingr¢   Zdefsitesr£   rb   Ú	to_remove)r™   r   r    Úpropagate_phi_mapë   s    z+Flow._prune_phis.<locals>.propagate_phi_mapc                    s¦   i }|   ¡ D ]\}}|D ]}|| ||< qqt dt|ƒ¡ ttƒ}|D ]"}|| D ]\}}||| |< qTqHt dt|ƒ¡ ˆ jD ]}|j ¡  |j 	|| ¡ q‚d S )Nzkeep phismap: %sznew_out: %s)
rŸ   r;   r<   r5   r   ÚdictrQ   rž   ÚclearÚupdate)r˜   r¡   Úkeeprb   Zused_setr¢   Znew_outr£   rœ   r   r    Úapply_changes  s    

z'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)r;   r<   Úcenterr5   )	r   ra   r   r¥   r¨   r­   r˜   r    r¡   r   r¤   r    r^   Ë   s    


zFlow._prune_phisc                 C   s0   |  ¡ }|j| jjkrdS |jtkr(dS dS d S )NTF)rr   Úoffsetr>   Úlabelsrs   r
   ©r   rb   Úinstr   r   r    rV     s    
zFlow._is_implicit_new_blockc                 C   s8   |  ¡ }|jdkr4| j|j j}|dkr4d}t|ƒ‚dS )zÞChecks 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)rr   rs   r>   rv   r   )r   rb   Úcurrent_instÚnext_opÚmsgr   r   r    rW   "  s    
zFlow._guard_with_asN)r0   r1   r2   r3   r!   rd   r   rU   ÚNotImplementedErrorr]   r^   rV   rW   r   r   r   r    r:   F   s   :

M
r:   c                 C   s
   |   d¡S )Nz$null$)Ú
startswith)Úregr   r   r    Ú_is_null_temp_reg0  s    r¼   c                   @   s  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedkr†dd„ Znedk r˜dd„ Zneeƒ‚d d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)dLdM„ Z*dNdO„ Z+e+Z,e+Z-dPdQ„ Z.e.Z/e.Z0dRdS„ Z1dTdU„ Z2dVdW„ Z3dXdY„ Z4dZd[„ Z5d\d]„ Z6d^d_„ Z7d`da„ Z8dbdc„ Z9ddde„ Z:dfdg„ Z;dhdi„ Z<djdk„ Z=dldm„ Z>edkrüdndo„ Z?nedk rdpdo„ Z?ne‚dqdr„ Z@dsdt„ ZAdudv„ ZBdwdx„ ZCdydz„ ZDd{d|„ ZEd}d~„ ZFdd€„ ZGdd‚„ ZHdƒd„„ ZId…d†„ ZJd‡dˆ„ ZKd‰dŠ„ ZLedkrd‹dŒ„ ZMnedk r¤ddŒ„ ZMneeƒ‚dŽd„ ZNdd‘„ ZOd’d“„ ZPd”d•„ ZQd–d—„ ZRd˜d™„ ZSdšd›„ ZTdœd„ ZUdždŸ„ ZVd d¡„ ZWd¢d£„ ZXd¤d¥„ ZYd¦d§„ ZZd¨d©„ Z[dªd«„ Z\d¬d­„ Z]d®d¯„ Z^d°d±„ Z_d²d³„ Z`d´dµ„ Zad¶d·„ Zbd¸d¹„ Zcdºd»„ Zdd¼d½„ Zed¾d¿„ ZfdÀdÁ„ ZgdÂdÃ„ ZhdÄdÅ„ ZidÆdÇ„ ZjdÈdÉ„ ZkdÊdË„ ZldÌdÍ„ ZmdÎdÏ„ ZndÐdÑ„ ZodÒdÓ„ ZpdÔdÕ„ ZqdÖd×„ ZrdØdÙ„ ZsesZtesZuesZvesZwdÚdÛ„ ZxexZyexZzexZ{exZ|exZ}exZ~exZexZ€exZexZ‚exZƒexZ„exZ…exZ†exZ‡exZˆexZ‰exZŠexZ‹exZŒexZexZŽexZexZexZ‘exZ’exZ“exZ”exZ•exZ–exZ—dòdÝdÞ„Z˜dßdà„ Z™dádâ„ Zšdãdä„ Z›dådæ„ Zœdçdè„ Zedkr¶dédê„ Zžnedk rÊdëdê„ Zžneeƒ‚edkrædìdí„ ZŸnedk rúdîdí„ ZŸneeƒ‚dïdð„ Z dñS )órK   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ tƒ | _tƒ | _d S r   )rD   r   rN   r•   rQ   )r   rD   r   r   r    r!   7  s    zTraceRunner.__init__c                 C   s   t | j|ƒS r   )r   rD   )r   Úlinenor   r   r    Úget_debug_loc<  s    zTraceRunner.get_debug_locc                 C   sÔ   t dkrtt ƒ‚nHt dkrZ|jrZ|jrZ|jd }|d }|d k	rZ||jkrZ|j ¡  q qZq | ¡ }|jdkrŠt d|j	|¡ t d|j
¡ t| d |j¡d ƒ}|d k	r²|||ƒ nd|j }t||  |j¡d	‚d S )
Nre   éÿÿÿÿri   ÚCACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) found©Úloc)r   r¹   Ú_blockstackrE   Úpoprr   rs   r;   r<   r{   rR   Úgetattrr*   r   r¾   r½   )r   rb   ZtopblkÚblk_endr²   Úfnr¸   r   r   r    rS   ?  s$    



zTraceRunner.dispatchc                 C   sr   |  d¡}| |¡ |j}i }|d }||kr:|| |d< d}|d rN|d7 }||d< |jf d|d i|—Ž d	S )
zo
        Adjust stack when entering an exception handler to match expectation
        by the bytecode.
        r   rl   rƒ   é   rm   r†   rA   ri   N)r|   r‡   rl   ru   )r   rb   rŠ   rB   r7   Zexpected_depthZextra_stackr   r   r    rw   V  s    

z TraceRunner._adjust_except_stackc                 C   s   |  |¡ d S r   ©rO   r±   r   r   r    Úop_NOPj  s    zTraceRunner.op_NOPc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Ú	op_RESUMEm  s    zTraceRunner.op_RESUMEc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_CACHEp  s    zTraceRunner.op_CACHEc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Ú
op_PRECALLs  s    zTraceRunner.op_PRECALLc                 C   s   |  | ¡ ¡ | |¡ d S r   )ÚpushÚ	make_nullrO   r±   r   r   r    Úop_PUSH_NULLv  s    zTraceRunner.op_PUSH_NULLc                 C   s   |  | ¡ ¡ | |¡ d S r   )rÎ   Ú	make_temprO   r±   r   r   r    Úop_RETURN_GENERATORz  s    
zTraceRunner.op_RETURN_GENERATORc                 C   sZ   |j dkr"d}t||  |j¡d‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ dS )aF  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, we just call str() on the value.
        Pops a value from stack and pushes results back.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-FORMAT_VALUE
        r   z*format spec in f-strings not supported yetrÁ   )r   ÚresÚstrvarN)Úargr   r¾   r½   rÄ   rÑ   rO   rÎ   )r   rb   r²   r¸   r   rÔ   rÓ   r   r   r    Úop_FORMAT_VALUE‡  s    
zTraceRunner.op_FORMAT_VALUEc                    st   |j }tt‡ fdd„t|ƒD ƒƒƒ}|dkr8ˆ  ¡ g}n‡ fdd„t|d ƒD ƒ}ˆ j|||d ˆ  |d ¡ dS )	zú
        BUILD_STRING(count): Concatenates count strings from the stack and
        pushes the resulting string onto the stack.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-BUILD_STRING
        c                    s   g | ]}ˆ   ¡ ‘qS r   ©rÄ   ©Ú.0Ú_©rb   r   r    Ú
<listcomp>   s     z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>r   c                    s   g | ]}ˆ   ¡ ‘qS r   ©rÑ   rØ   rÛ   r   r    rÜ   ¥  s     rÈ   )ÚstringsÚtmpsr¿   N©rÕ   r¦   ÚreversedÚrangerÑ   rO   rÎ   )r   rb   r²   ÚcountrÞ   rß   r   rÛ   r    Úop_BUILD_STRING˜  s    zTraceRunner.op_BUILD_STRINGc                 C   s   |  ¡  d S r   r×   r±   r   r   r    Ú
op_POP_TOP©  s    zTraceRunner.op_POP_TOPre   c                 C   sH   |  ¡ }|jd? }|j|||d |jd@ r:| | ¡ ¡ | |¡ d S )NrÈ   )ÚidxrÓ   )rÑ   rÕ   rO   rÎ   rÏ   )r   rb   r²   rÓ   ræ   r   r   r    Úop_LOAD_GLOBAL­  s    

zTraceRunner.op_LOAD_GLOBALc                 C   s$   |  ¡ }|j||d | |¡ d S ©N©rÓ   ©rÑ   rO   rÎ   ©r   rb   r²   rÓ   r   r   r    rç   ¶  s    c                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_COPY_FREE_VARS½  s    zTraceRunner.op_COPY_FREE_VARSc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_MAKE_CELLÀ  s    zTraceRunner.op_MAKE_CELLc                 C   s$   |  ¡ }|j||d | |¡ d S rè   rê   rë   r   r   r    Úop_LOAD_DEREFÃ  s    zTraceRunner.op_LOAD_DEREFc                 C   s&   |  d¡}| |¡ |j||d d S )NÚconstré   )rÑ   rÎ   rO   rë   r   r   r    Úop_LOAD_CONSTÈ  s    

zTraceRunner.op_LOAD_CONSTc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)ÚitemrÓ   ©rÄ   rÑ   rO   rÎ   )r   rb   r²   rò   rÓ   r   r   r    Úop_LOAD_ATTRÍ  s    zTraceRunner.op_LOAD_ATTRc                 C   s0   |  |¡}| |¡}|j||d | |¡ d S rè   )Úget_varnamerÑ   rO   rÎ   )r   rb   r²   ÚnamerÓ   r   r   r    Úop_LOAD_FASTÓ  s    

zTraceRunner.op_LOAD_FASTc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_DELETE_FASTÙ  s    zTraceRunner.op_DELETE_FASTc                 C   s   |  ¡ }|j||d d S )N)r}   ©rÄ   rO   )r   rb   r²   r}   r   r   r    Úop_DELETE_ATTRÜ  s    zTraceRunner.op_DELETE_ATTRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r}   r   rù   )r   rb   r²   r}   r   r   r   r    Úop_STORE_ATTRà  s    zTraceRunner.op_STORE_ATTRc                 C   s   |  ¡ }|j||d d S ©N)r   rù   ©r   rb   r²   r   r   r   r    Úop_STORE_DEREFå  s    zTraceRunner.op_STORE_DEREFc                 C   s   |  ¡ }|j||d d S rü   rù   rý   r   r   r    Úop_STORE_FASTé  s    zTraceRunner.op_STORE_FASTc           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[TOS:]
        )ÚbaseÚstartrÓ   ÚslicevarÚindexvarÚnonevarNró   ©	r   rb   r²   ÚtosÚtos1rÓ   r  r  r  r   r   r    Ú
op_SLICE_1í  s     ù	zTraceRunner.op_SLICE_1c           	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[:TOS]
        )r   ÚstoprÓ   r  r  r  Nró   r  r   r   r    Ú
op_SLICE_2  s     ù	zTraceRunner.op_SLICE_2c           	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z&
        TOS = TOS2[TOS1:TOS]
        )r   r  r	  rÓ   r  r  Nró   )	r   rb   r²   r  r  Útos2rÓ   r  r  r   r   r    Ú
op_SLICE_3  s     ù	zTraceRunner.op_SLICE_3c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z
        TOS[:] = TOS1
        )r   r   r  r  r  N©rÄ   rÑ   rO   )r   rb   r²   r  r   r  r  r  r   r   r    Úop_STORE_SLICE_0,  s    úzTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )r   r  r  r   r  r  Nr  ©	r   rb   r²   r  r  r   r  r  r  r   r   r    Úop_STORE_SLICE_1>  s    ùzTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )r   r	  r   r  r  r  Nr  r  r   r   r    Úop_STORE_SLICE_2R  s    ùzTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )r   r  r	  r   r  r  Nr  )	r   rb   r²   r  r  r  r   r  r  r   r   r    Úop_STORE_SLICE_3f  s    ùzTraceRunner.op_STORE_SLICE_3c                 C   s8   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d dS )z
        del TOS[:]
        )r   r  r  r  Nr  )r   rb   r²   r  r  r  r  r   r   r    Úop_DELETE_SLICE_0z  s       þzTraceRunner.op_DELETE_SLICE_0c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[TOS:]
        )r   r  r  r  r  Nr  ©r   rb   r²   r  r  r  r  r  r   r   r    Úop_DELETE_SLICE_1‡  s    úzTraceRunner.op_DELETE_SLICE_1c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[:TOS]
        )r   r	  r  r  r  Nr  r  r   r   r    Úop_DELETE_SLICE_2™  s    úzTraceRunner.op_DELETE_SLICE_2c                 C   sB   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )r   r  r	  r  r  Nr  )r   rb   r²   r  r  r  r  r  r   r   r    Úop_DELETE_SLICE_3«  s        þzTraceRunner.op_DELETE_SLICE_3c                 C   s–   |j }|dkr,| ¡ }| ¡ }|}|}d}n6|dkrZ| ¡ }| ¡ }| ¡ }	|	}|}|}ntdƒ‚| ¡ }
| ¡ }|j||||||
d | |¡ dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
        é   Nrf   Úunreachable)r  r	  ÚsteprÓ   r  )rÕ   rÄ   Ú	ExceptionrÑ   rO   rÎ   )r   rb   r²   Zargcr  r  r  r	  r  r  r  rÓ   r   r   r    Úop_BUILD_SLICE¹  s4         ÿzTraceRunner.op_BUILD_SLICEc                 C   sH   |  ¡ }|j||d | ¡ }|j}|j|d ||krD|j|d d S )N©Úpredrh   )rÄ   rO   Úget_jump_targetrv   ru   )r   rb   r²   r  Ztarget_instZ	next_instr   r   r    Ú_op_POP_JUMP_IFÔ  s    zTraceRunner._op_POP_JUMP_IFc                 C   s:   |  ¡ }|j||d |j|jdd |j| ¡ d d S )Nr  rÈ   ©rA   rƒ   rh   )Úget_tosrO   ru   rv   r  )r   rb   r²   r  r   r   r    Ú_op_JUMP_IF_OR_POPã  s    zTraceRunner._op_JUMP_IF_OR_POPc                 C   s   |   ||¡ d S r   ©r   r±   r   r   r    Úop_POP_JUMP_FORWARD_IF_NONEì  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_FORWARD_IF_NOT_NONEï  s    z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_BACKWARD_IF_NONEò  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Ú op_POP_JUMP_BACKWARD_IF_NOT_NONEõ  s    z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_FORWARD_IF_FALSEø  s    z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_FORWARD_IF_TRUEû  s    z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_BACKWARD_IF_FALSEþ  s    z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   s   |   ||¡ d S r   r$  r±   r   r   r    Úop_POP_JUMP_BACKWARD_IF_TRUE  s    z(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUEc                 C   s   |  |¡ |j| ¡ d d S ©Nrh   ©rO   ru   r  r±   r   r   r    Úop_JUMP_FORWARD  s    
zTraceRunner.op_JUMP_FORWARDc                 C   s   |  |¡ |j| ¡ d d S r-  r.  r±   r   r   r    Úop_JUMP_BACKWARD  s    
zTraceRunner.op_JUMP_BACKWARDc                 C   s   |  |¡ |j| ¡ d d S r-  r.  r±   r   r   r    Úop_JUMP_ABSOLUTE  s    
zTraceRunner.op_JUMP_ABSOLUTEc                 C   s4   |  d¡d }|j||d | ¡  |j|d d S )Nr   ri   rj   rh   )r|   rO   Ú	pop_blockru   )r   rb   r²   ri   r   r   r    Úop_BREAK_LOOP  s    zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || ¡ | ¡ d | ¡  d S )N)ÚretvalÚcastval)rO   rÄ   rÑ   Ú	terminater±   r   r   r    Úop_RETURN_VALUE  s    zTraceRunner.op_RETURN_VALUEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)r   rÓ   ró   ©r   rb   r²   ÚvalrÓ   r   r   r    Úop_YIELD_VALUE  s    zTraceRunner.op_YIELD_VALUEc                 C   sv   |j dkr,d }| ¡ rHtd|  |j¡d‚n|j dkr@| ¡ }ntdƒ‚|j||d | ¡ rj|  |¡ n| 	¡  d S )Nr   ú4The re-raising of an exception is not yet supported.rÁ   rÈ   ú)Multiple argument raise is not supported.©Úexc)
rÕ   rq   r   r¾   r½   rÄ   Ú
ValueErrorrO   rw   r6  ©r   rb   r²   r?  r   r   r    Úop_RAISE_VARARGS"  s    

þ

zTraceRunner.op_RAISE_VARARGSc                 C   s~   t | d¡d k	| d¡d k	gƒ}|jdkrHd }|rdtd|  |j¡d‚n|jdkr\| ¡ }ntdƒ‚|j||d | 	¡  d S )	Nr   r   r   r<  rÁ   rÈ   r=  r>  )
Úanyr|   rÕ   r   r¾   r½   rÄ   r@  rO   r6  )r   rb   r²   Zin_exc_blockr?  r   r   r    rB  8  s     þ

þ

c                 C   s@   g }t tƒD ] }| ¡ }| |¡ | |¡ q|j||d d S )N)Útemps)râ   rˆ   rÑ   rO   rÎ   )r   rb   r²   rD  ÚiÚtmpr   r   r    Úop_BEGIN_FINALLYM  s    
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  ¡ }| |d ¡ d S )Nr‚   )r2  Úreset_stack©r   rb   r²   Úblkr   r   r    Úop_END_FINALLYU  s    zTraceRunner.op_END_FINALLYc                 C   s&   |j dkr"d}t||  |j¡d‚d S )Nr   zGUnsupported use of a bytecode related to try..finally or a with-contextrÁ   )rÕ   r   r¾   r½   )r   rb   r²   r¸   r   r   r    Úop_POP_FINALLYY  s    
zTraceRunner.op_POP_FINALLYc                 C   s   d S r   r   r±   r   r   r    Úop_CALL_FINALLY`  s    zTraceRunner.op_CALL_FINALLYc                 C   s   |  ¡  d S r   )r6  r±   r   r   r    Úop_WITH_EXCEPT_STARTc  s    z TraceRunner.op_WITH_EXCEPT_STARTc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_WITH_CLEANUP_STARTf  s    z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   s   |  |¡ d S r   rÉ   r±   r   r   r    Úop_WITH_CLEANUP_FINISHj  s    z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   |  |jd| ¡ d¡ d S )Nr   ©r…   ri   )Ú
push_blockr~   r  r±   r   r   r    Úop_SETUP_LOOPn  s    þÿzTraceRunner.op_SETUP_LOOPc                 C   s´   |  ¡ }| ¡ }|jdd}| |¡ | |¡ |j}| |j¡}|g}|jD ]}	|	j|jkrN| |	¡ qNt	dd„ |D ƒƒ}
|j||||
d | 
|jd|
d¡ |j|jd d S )	NÚsetup_with_exitfn©Úprefixc                 s   s   | ]}|j V  qd S r   rj   )rÙ   r   r   r   r    Ú	<genexpr>‰  s     z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)ÚcontextmanagerÚexitfnri   r   rQ  rh   )rÄ   rÑ   rÎ   r>   Úfind_exception_entryrv   Zexception_entriesr}   rO   ÚmaxrR  r~   ru   )r   rb   r²   ÚcmÚyieldedrY  ÚbcZehheadZ	ehrelatedr   ri   r   r   r    Úop_BEFORE_WITHw  s(    


þÿzTraceRunner.op_BEFORE_WITHc                 C   sŠ   |  ¡ }| ¡ }|jdd}|j|||d tdk rL| |jd| ¡ d¡ | |¡ | |¡ | |jd| ¡ d¡ |j|j	d d S )	NrT  rU  )rX  rY  )rf   é	   r   rQ  r   rh   )
rÄ   rÑ   rO   r   rR  r~   r  rÎ   ru   rv   )r   rb   r²   r\  r]  rY  r   r   r    Úop_SETUP_WITH•  s(    þÿ

þÿzTraceRunner.op_SETUP_WITHc                 C   s0   |j |d dd}|j||j d|d|dd d S )NF)r…   ri   rH  r   )r…   ri   rH  r„   rn   )r~   ru   )r   r…   rb   rv   ri   Zhandler_blockr   r   r    Ú
_setup_try±  s    ýüþzTraceRunner._setup_tryc                 C   s&   |  ¡ }| | d¡¡ | |¡ d S )NÚ	exception)rÄ   rÎ   rÑ   )r   rb   r²   r  r   r   r    Úop_PUSH_EXC_INFOÅ  s    zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   |  |¡ | jd||j| ¡ d d S )Nr   )rv   ri   )rO   rb  rv   r  r±   r   r   r    Úop_SETUP_FINALLYÊ  s    
   ÿzTraceRunner.op_SETUP_FINALLYc                 C   s   |  ¡  d S r   r×   r±   r   r   r    Úop_POP_EXCEPTÑ  s    zTraceRunner.op_POP_EXCEPTc                 C   sh   |  ¡ }|d tdƒtdƒhkr>td|d › |  |j¡d‚| ¡  | ¡  | ¡  |j|jd d S )Nr…   r   r   z$POP_EXCEPT got an unexpected block: rÁ   rh   )r2  r   r   r¾   r½   rÄ   ru   rv   rI  r   r   r    rf  Õ  s    
þc                 C   sX   |  ¡ }|d tdƒkr(|j|dd n|d tdƒkrF|j|dd |j|jd d S )Nr…   r   Útry)r…   r   Úwithrh   )r2  r   rO   ru   rv   rI  r   r   r    Úop_POP_BLOCKä  s    zTraceRunner.op_POP_BLOCKc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)Úindexr}   rÓ   ró   )r   rb   r²   rj  r}   rÓ   r   r   r    Úop_BINARY_SUBSCRì  s
    zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  ¡ }|  ¡ }|  ¡ }|j||||d d S )N)r}   rj  r   rù   )r   rb   r²   rj  r}   r   r   r   r    Úop_STORE_SUBSCRó  s    zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r}   rj  rù   )r   rb   r²   rj  r}   r   r   r    Úop_DELETE_SUBSCRù  s    zTraceRunner.op_DELETE_SUBSCRc           
         s‚   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }t|ƒrB|}n|}|f|•}ˆ  ¡ }ˆ  ¡ }	ˆ j||||	|d ˆ  	|¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ      s     z'TraceRunner.op_CALL.<locals>.<listcomp>)Úfuncr6   Úkw_namesrÓ   )
rÕ   r¦   rá   râ   rÄ   r¼   rÑ   Úpop_kw_namesrO   rÎ   )
r   rb   r²   Únargr6   Zcallable_or_firstargZnull_or_callableÚcallablerÓ   ro  r   rÛ   r    Úop_CALLþ  s    
zTraceRunner.op_CALLc                 C   s   |  |j¡ d S r   )Úset_kw_namesrÕ   r±   r   r   r    Úop_KW_NAMES  s    zTraceRunner.op_KW_NAMESc                    sT   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ     s     z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>)rn  r6   rÓ   )rÕ   r¦   rá   râ   rÄ   rÑ   rO   rÎ   )r   rb   r²   rq  r6   rn  rÓ   r   rÛ   r    Úop_CALL_FUNCTION  s    zTraceRunner.op_CALL_FUNCTIONc                    s^   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ     s     z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>)rn  r6   ÚnamesrÓ   )rÕ   rÄ   r¦   rá   râ   rÑ   rO   rÎ   )r   rb   r²   rq  rw  r6   rn  rÓ   r   rÛ   r    Úop_CALL_FUNCTION_KW  s    zTraceRunner.op_CALL_FUNCTION_KWc                 C   sŽ   |j d@ rtdk rd}t|ƒ‚|j d@ r2| ¡ }nd }| ¡ }| ¡ }tdkrdt| d¡ƒrd| ¡  | ¡ }|j|||||d | |¡ d S )NrÈ   )rf   é
   z,CALL_FUNCTION_EX with **kwargs not supportedre   )rn  ÚvarargÚvarkwargrÓ   )	rÕ   r   r   rÄ   r¼   ÚpeekrÑ   rO   rÎ   )r   rb   r²   Úerrmsgr{  rz  rn  rÓ   r   r   r    Úop_CALL_FUNCTION_EX$  s    

zTraceRunner.op_CALL_FUNCTION_EXc                    sp   ‡ fdd„t |ƒD ƒ}| ¡  ‡ fdd„t |ƒD ƒ}ˆ j|||d |D ]}ˆ  |¡ qH|D ]}ˆ  |¡ q\d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   8  s     z)TraceRunner._dup_topx.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÝ   rØ   rÛ   r   r    rÜ   <  s     )ÚorigÚduped)râ   ÚreverserO   rÎ   )r   rb   r²   rã   r  r€  r:  r   rÛ   r    Ú	_dup_topx7  s    zTraceRunner._dup_topxc                 C   s6   |j }d|  krdks$n tdƒ‚|  |||¡ d S )NrÈ   é   zInvalid DUP_TOPX count)rÕ   r   r‚  )r   rb   r²   rã   r   r   r    Úop_DUP_TOPXC  s    zTraceRunner.op_DUP_TOPXc                 C   s   | j ||dd d S )NrÈ   ©rã   ©r‚  r±   r   r   r    Ú
op_DUP_TOPH  s    zTraceRunner.op_DUP_TOPc                 C   s   | j ||dd d S )Nr  r…  r†  r±   r   r   r    Úop_DUP_TOP_TWOK  s    zTraceRunner.op_DUP_TOP_TWOc                 C   s   |  | |j¡¡ d S r   )rÎ   r|  rÕ   r±   r   r   r    Úop_COPYN  s    zTraceRunner.op_COPYc                 C   s   |  |j¡ d S r   )ÚswaprÕ   r±   r   r   r    Úop_SWAPQ  s    zTraceRunner.op_SWAPc                 C   s(   |  ¡ }|  ¡ }| |¡ | |¡ d S r   ©rÄ   rÎ   )r   rb   r²   ÚfirstÚsecondr   r   r    Ú
op_ROT_TWOT  s    
zTraceRunner.op_ROT_TWOc                 C   s:   |  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ d S r   rŒ  )r   rb   r²   r  rŽ  Úthirdr   r   r    Úop_ROT_THREEZ  s    

zTraceRunner.op_ROT_THREEc                 C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ | |¡ d S r   rŒ  )r   rb   r²   r  rŽ  r  Zforthr   r   r    Úop_ROT_FOURb  s    


zTraceRunner.op_ROT_FOURc                    sZ   |j }ˆ  ¡ }‡ fdd„t|ƒD ƒ}ˆ  ¡ }ˆ j||||d t|ƒD ]}ˆ  |¡ qFd S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   rÝ   rØ   rÛ   r   r    rÜ   o  s     z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)ÚiterableÚstoresÚtupleobj)rÕ   rÄ   râ   rÑ   rO   rá   rÎ   )r   rb   r²   rã   r“  r”  r•  Ústr   rÛ   r    Úop_UNPACK_SEQUENCEl  s    zTraceRunner.op_UNPACK_SEQUENCEc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   w  s     z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>©rŸ   rÓ   rà   )r   rb   r²   rã   rŸ   Útupr   rÛ   r    Úop_BUILD_TUPLEu  s
    zTraceRunner.op_BUILD_TUPLEc                    s|   t t‡ fdd„t|jƒD ƒƒƒ}‡ fdd„tt|ƒd ƒD ƒ}t|ƒdk}|rXˆ  ¡ g}ˆ j||||d ˆ  |d ¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   ~  s     z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÝ   rØ   rÛ   r   r    rÜ     s     rÈ   )ÚtuplesrD  Ú	is_assignr¿   )r¦   rá   râ   rÕ   ÚlenrÑ   rO   rÎ   )r   rb   r²   r›  rD  rœ  r   rÛ   r    Ú_build_tuple_unpack|  s     
zTraceRunner._build_tuple_unpackc                 C   s   |   ||¡ d S r   ©rž  r±   r   r   r    Úop_BUILD_TUPLE_UNPACK_WITH_CALL‹  s    z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   s   |   ||¡ d S r   rŸ  r±   r   r   r    Úop_BUILD_TUPLE_UNPACK  s    z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)Ú
const_listrÓ   ró   )r   rb   r²   r  rÓ   r   r   r    Úop_LIST_TO_TUPLE’  s    zTraceRunner.op_LIST_TO_TUPLEc                    sj   ˆ   ¡ }tt‡ fdd„t|jƒD ƒƒƒ}‡ fdd„t|jƒD ƒ}ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   œ  s     z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    s   g | ]}ˆ   ¡ ‘qS r   rÝ   rØ   rÛ   r   r    rÜ     s     )ÚkeysÚkeytmpsÚvaluesrÓ   )rÄ   r¦   rá   râ   rÕ   rÑ   rO   rÎ   )r   rb   r²   r¤  Úvalsr¥  rÓ   r   rÛ   r    Úop_BUILD_CONST_KEY_MAPš  s     z"TraceRunner.op_BUILD_CONST_KEY_MAPc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   ¤  s     z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>r˜  rà   )r   rb   r²   rã   rŸ   Úlstr   rÛ   r    Úop_BUILD_LIST¢  s
    zTraceRunner.op_BUILD_LISTc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)r}   r   Ú	appendvarrÓ   ©rÄ   rÕ   r|  rÑ   rO   )r   rb   r²   r   rj  r}   r«  rÓ   r   r   r    Úop_LIST_APPEND©  s    
ÿzTraceRunner.op_LIST_APPENDc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)r}   r   Ú	extendvarrÓ   r¬  )r   rb   r²   r   rj  r}   r®  rÓ   r   r   r    Úop_LIST_EXTEND²  s    
ÿzTraceRunner.op_LIST_EXTENDc           	      C   sj   |  ¡ }|j}g }t|ƒD ]$}| ¡ | ¡  }}| ||f¡ q|j||d d d… ||d | |¡ d S )Nr¿   )rŸ   ÚsizerÓ   )rÑ   rÕ   râ   rÄ   rO   rÎ   )	r   rb   r²   Údctrã   rŸ   rE  ÚvÚkr   r   r    Úop_BUILD_MAP»  s    zTraceRunner.op_BUILD_MAPc                 C   sT   |  ¡ }|  ¡ }|| }}|j}| |¡}| ¡ }	| ¡ }
|j|||||	|
d d S )N)r}   rI   r   Ú
setitemvarrÓ   r¬  )r   rb   r²   ZTOSZTOS1rI   r   rj  r}   rµ  rÓ   r   r   r    Ú
op_MAP_ADDÆ  s    

 ÿzTraceRunner.op_MAP_ADDc                    sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    s   g | ]}ˆ   ¡ ‘qS r   r×   rØ   rÛ   r   r    rÜ   Ô  s     z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>r˜  rà   )r   rb   r²   rã   rŸ   rÓ   r   rÛ   r    Úop_BUILD_SETÑ  s
    zTraceRunner.op_BUILD_SETc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S ©N)r}   r   Ú	updatevarrÓ   r¬  ©r   rb   r²   r   rj  r}   r¹  rÓ   r   r   r    Úop_SET_UPDATEÙ  s    
ÿzTraceRunner.op_SET_UPDATEc                 C   s@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S r¸  r¬  rº  r   r   r    Úop_DICT_UPDATEâ  s    
ÿzTraceRunner.op_DICT_UPDATEc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r8  ró   )r   rb   r²   r   rÓ   r   r   r    Úop_GET_ITERë  s    zTraceRunner.op_GET_ITERc                 C   sf   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d | |¡ | ¡ }|j|dd |j|jd d S )N)ÚiteratorÚpairÚindvalr  r  r!  rh   )r"  rÑ   rO   rÎ   r  ru   rv   )r   rb   r²   r¾  r¿  rÀ  r  ri   r   r   r    Úop_FOR_ITERñ  s    ÿ
zTraceRunner.op_FOR_ITERc                 C   s   dS )a(  Pops TOS. If TOS was not None, raises an exception. The kind
        operand corresponds to the type of generator or coroutine and
        determines the error message. The legal kinds are 0 for generator,
        1 for coroutine, and 2 for async generator.

        New in version 3.10.
        Nr   r±   r   r   r    Úop_GEN_STARTý  s    	zTraceRunner.op_GEN_STARTc                 C   s^   t j|j d }| ¡ }| ¡ }t| j}|jd|› d}|j|||||d | |¡ d S )NrÈ   Zbinop_rU  )ÚopÚlhsr£   rÓ   )	ÚdisZ_nb_opsrÕ   rÄ   r	   r0   rÑ   rO   rÎ   )r   rb   r²   rÃ  r£   rÄ  Úop_namerÓ   r   r   r    Úop_BINARY_OP  s    
zTraceRunner.op_BINARY_OPc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S r8  ró   r9  r   r   r    Ú_unaryop  s    zTraceRunner._unaryopc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)rÄ  r£   rÓ   ró   )r   rb   r²   r£   rÄ  rÓ   r   r   r    Ú	_binaryop  s
    zTraceRunner._binaryopFc              
   C   s¸   t dkrd }nt dk r | ¡ }ntt ƒ‚| ¡ }d  } } }}	|jd@ rR| ¡ }|jd@ rd| ¡ }|jd@ rv| ¡ }|jd@ rˆ| ¡ }	| ¡ }
|j|||||||	|
d | |
¡ d S )Nre   é   é   r  rÈ   )rö   ÚcodeÚclosureÚannotationsÚ
kwdefaultsÚdefaultsrÓ   )r   rÄ   r¹   rÕ   rÑ   rO   rÎ   )r   rb   r²   ÚMAKE_CLOSURErö   rÌ  rÍ  rÎ  rÏ  rÐ  rÓ   r   r   r    Úop_MAKE_FUNCTIONG  s6    




ø
zTraceRunner.op_MAKE_FUNCTIONc                 C   s   | j ||dd d S )NT)rÑ  )rÒ  r±   r   r   r    Úop_MAKE_CLOSUREg  s    zTraceRunner.op_MAKE_CLOSUREc                 C   s$   |  ¡ }|j||d | |¡ d S rè   rê   rë   r   r   r    Úop_LOAD_CLOSUREj  s    zTraceRunner.op_LOAD_CLOSUREc                 C   s&   |  d¡}|j||d | |¡ d S )NZassertion_errorré   rê   rë   r   r   r    Úop_LOAD_ASSERTION_ERRORo  s    
z#TraceRunner.op_LOAD_ASSERTION_ERRORc                 C   s:   |  d¡}| ¡ }| ¡ }|j||||d | |¡ d S )NÚ	predicate©r  r  r  )rÑ   rÄ   r"  rO   rÎ   ©r   rb   r²   r  r  r  r   r   r    Úop_CHECK_EXC_MATCHt  s
    
zTraceRunner.op_CHECK_EXC_MATCHc                 C   sN   |  d¡}| ¡ }| ¡ }|j||||d |j|jd |j| ¡ d d S )NrÖ  r×  rh   )rÑ   rÄ   rO   ru   rv   r  rØ  r   r   r    Úop_JUMP_IF_NOT_EXC_MATCH{  s    
z$TraceRunner.op_JUMP_IF_NOT_EXC_MATCHc                 C   sH   |  ¡ }|jdkr|  ¡  |j||d | ¡ r<|  |¡ n| ¡  d S )Nr   r>  )rÄ   rÕ   rO   rq   rw   r6  rA  r   r   r    Ú
op_RERAISE†  s    
zTraceRunner.op_RERAISEc                 C   s"   |  ¡ }|j||d | ¡  d S )Nr>  )rÄ   rO   r6  rA  r   r   r    rÛ  ’  s    c                 C   s@   |  ¡ }| ¡ }| |¡ | ¡ }|j|||d | |¡ d S rñ   )rÄ   rÏ   rÎ   rÑ   rO   )r   rb   r²   rò   ÚextrarÓ   r   r   r    Úop_LOAD_METHODž  s    
zTraceRunner.op_LOAD_METHODc                 C   s   |   ||¡ d S r   )rô   r±   r   r   r    rÝ  ¦  s    c                 C   s   |   ||¡ d S r   )rv  r±   r   r   r    Úop_CALL_METHOD«  s    zTraceRunner.op_CALL_METHODN)F)¡r0   r1   r2   r3   r!   r¾   rS   rw   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   Úop_POP_JUMP_IF_TRUEÚop_POP_JUMP_IF_FALSEr#  Úop_JUMP_IF_FALSE_OR_POPÚop_JUMP_IF_TRUE_OR_POPr%  r&  r'  r(  r)  r*  r+  r,  r/  r0  r1  r3  r7  r;  rB  rG  rK  rL  rM  rN  rO  rP  rS  r_  ra  rb  rd  re  rf  ri  rk  rl  rm  rs  ru  rv  rx  r~  r‚  r„  r‡  rˆ  r‰  r‹  r  r‘  r’  r—  rš  rž  r   r¡  r£  r¨  rª  r­  r¯  r´  r¶  r·  r»  r¼  r½  rÁ  rÂ  rÇ  rÈ  Úop_UNARY_NEGATIVEÚop_UNARY_POSITIVEÚop_UNARY_NOTÚop_UNARY_INVERTrÉ  Úop_COMPARE_OPÚop_IS_OPÚop_CONTAINS_OPÚop_INPLACE_ADDÚop_INPLACE_SUBTRACTÚop_INPLACE_MULTIPLYÚop_INPLACE_DIVIDEÚop_INPLACE_TRUE_DIVIDEÚop_INPLACE_FLOOR_DIVIDEÚop_INPLACE_MODULOÚop_INPLACE_POWERÚop_INPLACE_MATRIX_MULTIPLYÚop_INPLACE_LSHIFTÚop_INPLACE_RSHIFTÚop_INPLACE_ANDÚop_INPLACE_ORÚop_INPLACE_XORÚop_BINARY_ADDÚop_BINARY_SUBTRACTÚop_BINARY_MULTIPLYÚop_BINARY_DIVIDEÚop_BINARY_TRUE_DIVIDEÚop_BINARY_FLOOR_DIVIDEÚop_BINARY_MODULOÚop_BINARY_POWERÚop_BINARY_MATRIX_MULTIPLYÚop_BINARY_LSHIFTÚop_BINARY_RSHIFTÚop_BINARY_ANDÚop_BINARY_ORÚop_BINARY_XORrÒ  rÓ  rÔ  rÕ  rÙ  rÚ  rÛ  rÝ  rÞ  r   r   r   r    rK   4  s`  





	



	

						
 

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

        Returns
        -------
        edges : List[State]
        ©r  r$   r   r   r    rY   õ  s    z_State.outgoing_edgesc                 C   s   | j S )z‹The dictionary of outgoing phi nodes.

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

        Returns
        -------
        res : int
        )r  rR   r$   r   r   r    rl     s    z_State.stack_depthc                 C   s,   t | jƒD ]}|d tdƒkr
|  S q
dS )z&Find the initial *try* block.
        r…   r   N)rá   r  r   )r   rJ  r   r   r    Úfind_initial_try_block  s    z_State.find_initial_try_blockc                 C   s   | j S r   ©r  r$   r   r   r    rT     s    z_State.has_terminatedc                 C   s   | j | j S r   )r>   r{   r$   r   r   r    rr   "  s    z_State.get_instc                 C   s   |   ¡ }|j| _d S r   )rr   rv   r{   ©r   r²   r   r   r    rx   %  s    z_State.advance_pcÚ c                 C   sR   |s*dj || j|  ¡ j ¡ t| jƒd}ndj || jt| jƒd}| j |¡ |S )Nz"${prefix}{offset}{opname}.{tempct})rV  r¯   rs   Útempctz${prefix}{offset}.{tempct})rV  r¯   r  )r*   r{   rr   rs   Úlowerr  r  rO   )r   rV  rö   r   r   r    rÑ   )  s    üýz_State.make_tempc                 K   s0   | j  |j|f¡ |  jtt| ¡ ƒƒO  _dS )zAppend new instN)r  rO   r¯   r–   r•   Ú_flatten_inst_regsr¦  )r   r²   r7   r   r   r    rO   ;  s    z_State.appendc                 C   s
   |   d¡S )NrÈ   )r|  r$   r   r   r    r"  @  s    z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        ©rR   )r   r³  r   r   r    r|  C  s    z_State.peekc                 C   s   | j  |¡ dS )zPush to stackN)rR   rO   )r   rò   r   r   r    rÎ   H  s    z_State.pushc                 C   s
   | j  ¡ S )zPop the stack)rR   rÄ   r$   r   r   r    rÄ   L  s    z
_State.popc                 C   s(   | j }||  |d  |d< || < dS )zSwap stack[idx] with the tosr¿   Nr  )r   ræ   Úsr   r   r    rŠ  P  s    z_State.swapc                 C   s   d|kst ‚| j |¡ dS )z#Push a block to blockstack
        rl   N)r   rÃ   rO   )r   Úsynblkr   r   r    rR  U  s    z_State.push_blockc                 C   s$   | j d|… | j |d…  | _ }|S )zVReset the stack to the given stack depth.
        Returning the popped items.
        Nr  )r   r   Úpoppedr   r   r    rH  [  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…   ri   r‚   rl   Nr„   )r   r  rR   )r   r…   ri   rH  r„   Údr   r   r    r~   b  s    ýz_State.make_blockc                 C   s   | j  ¡ }|  |d ¡ |S )z)Pop a block and unwind the stack
        rl   )rÃ   rÄ   rH  ©r   r‘   r   r   r    r2  q  s    
z_State.pop_blockc                 C   s@   | j  |¡}d|  kr&t| j ƒk s,n t‚| j d|… | _ dS )zcFind *blk* in the blockstack and remove it and all blocks above it
        from the stack.
        r   N)rÃ   rj  r  r   )r   rJ  ræ   r   r   r    r‡   x  s     z_State.pop_block_and_abovec                 C   s0   t |ƒ}t| jƒD ]}|d |kr|  S qdS )ú1Find the first block that matches *kind*
        r…   N)r   rá   rÃ   )r   r…   Úbsr   r   r    r|   €  s    z_State.get_top_blockc                 G   s6   dd„ |D ƒ}t | jƒD ]}|d |kr|  S qdS )r$  c                 S   s   h | ]}t |ƒ’qS r   )r   )rÙ   r…   r   r   r    Ú	<setcomp>‹  s     z._State.get_top_block_either.<locals>.<setcomp>r…   N)rá   rÃ   )r   Úkindsr%  r   r   r    Úget_top_block_eitherˆ  s    z_State.get_top_block_eitherc                 C   s   |   d¡dk	S )zGReturns a boolean indicating if the top-block is a *try* block
        r   N)r|   r$   r   r   r    rq     s    z_State.has_active_tryc                 C   s   | j j|j S )z4Get referenced variable name from the oparg
        )r>   Úco_varnamesrÕ   r  r   r   r    rõ   •  s    z_State.get_varnamec                 C   s
   d| _ dS )z!Mark block as terminated
        TNr  r$   r   r   r    r6  š  s    z_State.terminater   c                 C   s  t | jƒ}|rHd|  kr(t| jƒks.n t‚t| jƒ| }|d|… }|rtd|ksXt‚t|ƒD ]}| |  ¡ ¡ q`t | jƒ}tdkr¼|rÎ|d }	|	 	d¡p¢|	d }
||
krº| 
¡  q†qÎq†ntdk rÆnttƒ‚|rÜ| |¡ | j t|t|ƒ|t|ƒd¡ |  ¡  dS )zFork the state
        r   Nre   r¿   rk   ri   )rA   Ústackr†   rC   )r¦   rR   r  r   râ   rO   rÑ   rÃ   r   ÚgetrÄ   r¹   r  ÚEdger
  r6  )r   rA   rƒ   r†   ro   r*  rB   rE  rC   Útopri   r   r   r    ru   Ÿ  s:    
 


  þz_State.forkc                 C   s   | j | jd dS )zSplit the state
        rh   N)ru   r{   r$   r   r   r    rX   Ä  s    z_State.split_new_blockc              	   C   sz   | j r
t‚g }| jD ]`}t| j|jt|jƒ|jdd„ t	|jƒD ƒd}| 
|¡ |j ¡ D ]\}}|j| | j |< qZq|S )z+Get states for each outgoing edges
        c                 S   s   g | ]\}}t |ƒr|‘qS r   )r¼   )rÙ   rE  r²  r   r   r    rÜ   Ò  s    ÿz._State.get_outgoing_states.<locals>.<listcomp>)r@   rA   rB   rC   r  )rž   r   r  rJ   r>   rA   r  r*  rC   Ú	enumeraterO   r—   rŸ   )r   Úretr’   rb   r¢   rE  r   r   r    r[   É  s    


 þ
z_State.get_outgoing_statesc                 C   s   dd„ | j D ƒS )z–
        Returns
        -------
        Dict[int, int]
            where keys are the PC
            values are the edge-pushed stack values
        c                 S   s&   i | ]}|j t|j|j d … ƒ“qS r   )rA   r
  r*  r†   )rÙ   r’   r   r   r    Ú
<dictcomp>ã  s   ÿ z2_State.get_outgoing_edgepushed.<locals>.<dictcomp>r  r$   r   r   r    Úget_outgoing_edgepushedÚ  s    	ÿz_State.get_outgoing_edgepushed)r   )r  )TN)r   r   N)*r0   r1   r2   r3   r!   r/   r  r%   r-   r.   ÚpropertyrE   r  rY   r  r  rl   r  rT   rr   rx   rÑ   rO   r"  r|  rÎ   rÄ   rŠ  rR  rH  r~   r2  r‡   r|   r(  rq   rõ   r6  ru   rX   r[   r1  r   r   r   r    r  ¯  sX   
#


	


	


%r  c                       sL   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )Ú
StatePy311c                    s   t ƒ j||Ž d | _d S r   )Úsuperr!   Ú	_kw_namesr8   ©Ú	__class__r   r    r!   è  s    zStatePy311.__init__c                 C   s   | j }d | _ |S r   )r5  )r   Úoutr   r   r    rp  ì  s    zStatePy311.pop_kw_namesc                 C   s   | j d kst‚|| _ d S r   )r5  r   )r   r:  r   r   r    rt  ñ  s    zStatePy311.set_kw_namesc                 C   s   | j }| | j¡d k	S r   ©r>   rZ  r{   ©r   r^  r   r   r    ry   õ  s    zStatePy311.is_in_exceptionc                 C   s   | j }| | j¡S r   r9  r:  r   r   r    rz   ù  s    zStatePy311.get_exceptionc                 C   s&   | j D ]}|d tdƒkr dS qd S )Nr…   r   T)r  r   )r   Úentr   r   r    rp   ý  s    
zStatePy311.in_withc                 C   s   | j ddS )Nr  rU  rÝ   r$   r   r   r    rÏ     s    zStatePy311.make_null)r0   r1   r2   r!   rp  rt  ry   rz   rp   rÏ   Ú__classcell__r   r   r6  r    r3  ç  s   r3  re   r,  rA   r*  rC   r†   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚAdaptDFAz<Adapt Flow to the old DFA class expected by Interpreter
    c                 C   s
   || _ d S r   )Ú_flow)r   Úflowr   r   r    r!     s    zAdaptDFA.__init__c                 C   s   | j jS r   )r>  r?   r$   r   r   r    Úinfos  s    zAdaptDFA.infosN)r0   r1   r2   r3   r!   r2  r@  r   r   r   r    r=    s   r=  ÚAdaptBlockInfoÚinstsr  Úactive_try_blockÚoutgoing_edgepushedc                 C   s$   t t| jƒ| j| j|  ¡ |  ¡ dS )N)rB  r  rC   rC  rD  )rA  r
  r  r  r  r  r1  rÛ   r   r   r    r`   #  s    ûr`   c                 c   sB   | D ]8}t |tƒr|V  qt |ttfƒrt|ƒD ]
}|V  q0qdS )z<Flatten an iterable of registers used in an instruction
    N)r(   Ústrr
  r¦   r  )r“  rò   rF   r   r   r    r  -  s    
r  c                   @   sL   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dS )ÚAdaptCFAz<Adapt Flow to the old CFA class expected by Interpreter
    c                 C   s‚   || _ i | _|j ¡ D ]\}}t||ƒ| j|< q| j j ¡ }|j}| ¡ }tƒ }| j 	¡ D ]}| 
|¡rZ| |¡ qZ|| | _d S r   )r>  Ú_blocksr?   rŸ   ÚAdaptCFBlockr   Úbackboner•   Úblocksr¤  Úin_loopsrZ   Ú	_backbone)r   r?  r¯   Ú	blockinforI  r   Úinloopblocksr‘   r   r   r    r!   ;  s    
zAdaptCFA.__init__c                 C   s   | j jS r   )r>  r   r$   r   r   r    r   N  s    zAdaptCFA.graphc                 C   s   | j S r   )rL  r$   r   r   r    rI  R  s    zAdaptCFA.backbonec                 C   s   | j S r   )rG  r$   r   r   r    rJ  V  s    zAdaptCFA.blocksc                 c   s    t | jƒD ]}| j| V  q
d S r   )r_   rJ  r#  r   r   r    ÚiterliveblocksZ  s    zAdaptCFA.iterliveblocksc                 C   s   | j j ¡  d S r   )r>  r   r=   r$   r   r   r    r=   ^  s    zAdaptCFA.dumpN)r0   r1   r2   r3   r!   r2  r   rI  rJ  rO  r=   r   r   r   r    rF  8  s   


rF  c                   @   s   e Zd Zdd„ ZdS )rH  c                 C   s    || _ tdd„ |jD ƒƒ| _d S )Nc                 s   s   | ]\}}|V  qd S r   r   )rÙ   rE  rÚ   r   r   r    rW  e  s     z(AdaptCFBlock.__init__.<locals>.<genexpr>)r¯   r
  rB  Úbody)r   rM  r¯   r   r   r    r!   c  s    zAdaptCFBlock.__init__N)r0   r1   r2   r!   r   r   r   r    rH  b  s   rH  ).r3   rÅ  Úpprintr   ÚloggingÚcollectionsr   r   r   Ú	functoolsr   Únumba.core.utilsr   r   r	   Znumba.core.controlflowr
   r   Únumba.core.irr   Únumba.core.errorsr   Ú	getLoggerr0   r;   rˆ   r‰   r4   rt   Úobjectr   r5   r:   r¼   rK   r  r3  rJ   r¹   r,  r=  rA  r`   r  rF  rH  r   r   r   r    Ú<module>   sp   
ü 	 k           9

ÿþ
*