o
    ºiA ã                   @   sÐ  d Z ddlZddlZddlmZmZmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZmZ ddlmZ ddlmZ e e¡Zd	ZeZeh d
£ƒZedv r^ddlmZ G dd„ deƒZeZn	edv rcne eƒ‚eG dd„ de!ƒƒZ"G dd„ de!ƒZ#dd„ Z$G dd„ de!ƒZ%eG dd„ de!ƒƒZ&G dd„ de&ƒZ'G dd„ de'ƒZ(edv r¦e(Z)nedv r­e'Z)ned k r´e&Z)ne eƒ‚ed!g d"¢ƒZ*G d#d$„ d$e!ƒZ+ed%g d&¢ƒZ,d'd(„ Z-d)d*„ Z.G d+d,„ d,e!ƒZ/G d-d.„ d.e!ƒZ0dS )/z)
Implement python 3.8+ bytecode analysis
é    N)Ú
namedtupleÚdefaultdictÚdeque)Útotal_ordering)Ú
UniqueDictÚ	PYVERSIONÚALL_BINOPS_TO_OPERATORSÚ_lazy_pformat)ÚNEW_BLOCKERSÚCFGraph)ÚLoc)ÚUnsupportedBytecodeErroré   >   ÚNOPÚPRECALLÚ
LOAD_CONSTÚ
LOAD_DEREF©©é   é   ©r   é   )ÚEnumc                   @   s   e Zd ZdZdZdZdS )ÚCALL_INTRINSIC_1_Operandr   é   r   N)Ú__name__Ú
__module__Ú__qualname__ÚINTRINSIC_STOPITERATION_ERRORÚUNARY_POSITIVEÚINTRINSIC_LIST_TO_TUPLE© r"   r"   úP/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/numba/core/byteflow.pyr      s    r   ©©r   é
   ©r   é   c                   @   sD   e Zd ZdZeh d£ƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dS )Ú	BlockKindz?Kinds of block to make related code safer than just `str`.
    >   ÚTRYÚLOOPÚWITHÚEXCEPTÚFINALLYÚWITH_FINALLYc                 C   s   || j v sJ ‚|| _d S ©N)Ú_membersÚ_value)ÚselfÚvaluer"   r"   r#   Ú__init__4   ó   
zBlockKind.__init__c                 C   s   t t| ƒ| jfƒS r0   )ÚhashÚtyper2   ©r3   r"   r"   r#   Ú__hash__8   s   zBlockKind.__hash__c                 C   s(   t |tƒr| j|jk S td t|ƒ¡ƒ‚©Nzcannot compare to {!r}©Ú
isinstancer)   r2   Ú	TypeErrorÚformatr8   ©r3   Úotherr"   r"   r#   Ú__lt__;   ó   
zBlockKind.__lt__c                 C   s(   t |tƒr| j|jkS td t|ƒ¡ƒ‚r;   r<   r@   r"   r"   r#   Ú__eq__A   rC   zBlockKind.__eq__c                 C   s   d  | j¡S )NzBlockKind({}))r?   r2   r9   r"   r"   r#   Ú__repr__G   ó   zBlockKind.__repr__N)r   r   r   Ú__doc__Ú	frozensetr1   r5   r:   rB   rD   rE   r"   r"   r"   r#   r)   *   s    r)   c                   @   sl   e Zd ZdZdd„ Zdd„ Zedv rdd„ Zned	v r d
d„ Zneeƒ‚dd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚFlowziData+Control Flow analysis.

    Simulate execution to recover dataflow and controlflow information.
    c                 C   s"   t  d| ¡ ¡ || _tƒ | _d S )Nzbytecode dump:
%s)Ú_loggerÚdebugÚdumpÚ	_bytecoder   Úblock_infos)r3   Úbytecoder"   r"   r#   r5   P   s   zFlow.__init__c                 C   sL  t | jdddd}t| jjjd}|j |¡ tƒ }|jr|t 	d|j¡ |j 
¡ }||jvryt 	d|j¡ t 	d|¡ |||j< 	 | |¡ | ¡ rKn|  ||¡rRn|  |¡ra|  |¡ | ¡  nqAt 	d	|j¡ |j |¡ | ¡ }|j |¡ |js|  |j¡ |  |¡ t|jd
d„ dD ]}t|ƒ | j|j< }t 	d||¡ qdS )aì  Run a trace over the bytecode over all reachable path.

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

ÿ





òæ
þzFlow.run©r'   r   r   c                 C   sà   |  ¡ s| ¡ r| ¡ jtvr|j| ¡ jd | |¡ dS | ¡  |  ¡ sl| 	¡ rnt
 d| ¡ |j¡ | ¡ }| d¡}|rK|d |jkrKd }d S |jd|jd}|j|d< |j|d< |j|d	< |j|j|d
 dS d S d S )N©rP   Tz3.11 exception %s PC=%sr*   Úend©ry   Ú
end_offsetÚstack_depthÚ
push_lasti©rP   Úextra_block)Úin_withÚhas_active_tryÚget_instÚopnameÚ_NO_RAISE_OPSÚforkÚnextÚ_adjust_except_stackÚ
advance_pcÚis_in_exceptionrJ   rK   Úget_exceptionÚ_pcÚget_top_blockÚtargetÚ
make_blockry   ÚdepthÚlasti)r3   rq   rs   ÚehÚeh_topÚeh_blockr"   r"   r#   rd      s.   ÿ

ÿ



òzFlow._run_handle_exception©r%   c                 C   sº   |  ¡ rW| ¡ jtvrW|j| ¡ jd | d¡}| |¡ |j}i }||d kr1||d  |d< |d }t	dƒt
t	dƒti|d  |d	< ||d
< |jdd|d i|¤Ž dS | ¡  d S )Nrx   r*   Úentry_stackÚnpopÚhandlerr-   r.   ÚkindÚnpushr   rP   ry   Tr"   )r   r‚   rƒ   r„   r…   r†   rŒ   Úpop_block_and_abover|   r)   Ú_EXCEPT_STACK_OFFSETÚ_FINALLY_POPrˆ   )r3   rq   rs   ÚtryblkrQ   Úkwargsr—   r"   r"   r#   rd   ¬   s&   

þýc                 C   sd   t ƒ }|D ]
}|j}| |¡ q|D ]}|jD ]}| |j|jd¡ qq| d¡ | ¡  || _d S )Nr   )	r   rU   Úadd_noderh   Úadd_edgerP   Úset_entry_pointÚprocessÚcfgraph)r3   Ú
all_statesÚgraphrs   ÚbÚedger"   r"   r#   rl   Ä   s   
ÿ

zFlow._build_cfgc           	         s   t  d dd¡¡ ‡fdd„}‡ ‡fdd„}‡ fdd	„}‡fd
d„}|ƒ \}‰ t  dt|ƒ¡ |ƒ \}}||ƒ |||ƒ t  d dd¡¡ d S )Nz
Prune PHIsé<   ú-c                     sR   t tƒ} tƒ }ˆ jD ]}t|jƒ}t|jƒ}| |  ||@ O  < ||O }q
| |fS r0   )r   Úsetr`   Ú
_used_regsÚ_phis)Ú	used_phisÚphi_setrs   ÚusedÚphis©rq   r"   r#   Úget_used_phis_per_stateØ   s   



z1Flow._prune_phis.<locals>.get_used_phis_per_statec                     sv   i } t tƒ}ˆjD ]}|j ¡ D ]\}}|ˆ vr|| |< ||  ||f¡ qq	t dt| ƒ¡ t dt|ƒ¡ | |fS )Nz
defmap: %szphismap: %s)	r   rª   r`   Ú_outgoing_phisÚitemsri   rJ   rK   r	   )ÚdefmapÚphismaprs   ÚphiÚrhs©r®   rq   r"   r#   Úfind_use_defsã   s   
üz'Flow._prune_phis.<locals>.find_use_defsc                    sš   t tƒ}	 d}tt|  ¡ ƒƒD ]0\}}tt|ƒƒD ]\}}|ˆ v r0|| | O }||  ||f¡ q|| }||@ r?||8 }d}qt dt| ƒ¡ |sLdS q)znAn iterative dataflow algorithm to find the definition
            (the source) of each PHI node.
            TFzchanging phismap: %sN)	r   rª   rn   Úlistr´   ri   rJ   rK   r	   )r¶   Ú	blacklistÚchangingr·   Údefsitesr¸   rs   Ú	to_remove)r®   r"   r#   Úpropagate_phi_mapð   s$   €€òz+Flow._prune_phis.<locals>.propagate_phi_mapc                    s¦   i }|   ¡ D ]\}}|D ]}|| ||< qqt dt|ƒ¡ ttƒ}|D ]}|| D ]
\}}||| |< q*q$t dt|ƒ¡ ˆ jD ]}|j ¡  |j 	|| ¡ qAd S )Nzkeep phismap: %sznew_out: %s)
r´   rJ   rK   r	   r   Údictr`   r³   ÚclearÚupdate)r­   r¶   Úkeeprs   Úused_setr·   Únew_outr¸   r±   r"   r#   Úapply_changes  s    ÿÿ

þz'Flow._prune_phis.<locals>.apply_changeszUsed_phis: %szDONE Prune PHIs)rJ   rK   Úcenterr	   )	r3   rq   r²   rº   rÀ   rÇ   r­   rµ   r¶   r"   r¹   r#   rm   Ð   s   


zFlow._prune_phisc                 C   s,   |  ¡ }|j| jjv rdS |jtv rdS dS )NTF)r‚   ÚoffsetrM   Úlabelsrƒ   r
   ©r3   rs   Úinstr"   r"   r#   re     s   
zFlow._is_implicit_new_blockc                 C   s<   |  ¡ }|jdv r| j|j j}|dkrd}t|ƒ‚dS dS )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)r‚   rƒ   rM   r†   r   )r3   rs   Úcurrent_instÚnext_opÚmsgr"   r"   r#   rf   '  s   
úzFlow._guard_with_asN)r   r   r   rG   r5   rv   r   rd   ÚNotImplementedErrorrl   rm   re   rf   r"   r"   r"   r#   rI   K   s    :

M
rI   c                 C   ó
   |   d¡S )Nz$null$)Ú
startswith)Úregr"   r"   r#   Ú_is_null_temp_reg5  ó   
r×   c                   @   sF  e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zedv r6dd„ Zdd„ Zdd„ Zdd„ Zedv rKdd „ Zned!k rP	 edv rYd"d#„ Zned$v rbd%d#„ Zned&v rkd'd#„ Zneeƒ‚d(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zedv r˜d4d5„ Zd6d7„ Zd8d9„ Zn	ed:v rneeƒ‚ed;v rªeZeZ n	ed<v r¯neeƒ‚d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUdV„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1ed;v rd_d`„ Z2n
ed<v rneeƒ‚ed;v rdadb„ Z3n
ed<v rneeƒ‚dcdd„ Z4e4Z5e4Z6ed;v r1e4Z7e4Z8n
ed<v r7neeƒ‚dedf„ Z9e9Z:e9Z;dgdh„ Z<didj„ Z=dkdl„ Z>dmdn„ Z?dodp„ Z@dqdr„ ZAdsdt„ ZBdudv„ ZCdwdx„ ZDdydz„ ZEeEZFd{d|„ ZGd}d~„ ZHdd€„ ZIed;v rƒdd‚„ ZJn
ed<v r‰neeƒ‚dƒd„„ ZKed…v r›d†d‡„ ZLned&v r¥dˆd‡„ ZLneeƒ‚d‰dŠ„ ZMd‹dŒ„ ZNedv r»ddŽ„ ZOnedv rÅddŽ„ ZOn
ed<v rËneeƒ‚d‘d’„ ZPd“d”„ ZQd•d–„ ZRd—d˜„ ZSd™dš„ ZTd›dœ„ ZUddž„ ZVdŸd „ ZWd¡d¢„ ZXd£d¤„ ZYd¥d¦„ ZZed…v rd§d¨„ Z[ned&v rd©d¨„ Z[neeƒ‚dªd«„ Z\d¬d­„ Z]d®d¯„ Z^d°d±„ Z_d²d³„ Z`d´dµ„ Zad¶d·„ Zbd¸d¹„ Zcedv r=dºd»„ Zdn
ed:v rCneeƒ‚edv rQd¼d½„ Zened:v r[d¾d½„ Zeneeƒ‚d¿dÀ„ Zfed;v rmdÁdÂ„ Zgn
ed<v rsneeƒ‚dÃdÄ„ ZhdÅdÆ„ ZidÇdÈ„ ZjdÉdÊ„ ZkdËdÌ„ ZldÍdÎ„ ZmdÏdÐ„ ZndÑdÒ„ 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ö„ Zd÷dø„ Z‚dùdú„ ZƒeƒZ„eƒZ…eƒZ†eƒZ‡dûdü„ ZˆeˆZ‰eˆZŠeˆZ‹eˆZŒeˆZeˆZŽeˆZeˆZeˆZ‘eˆZ’eˆZ“eˆZ”eˆZ•eˆZ–eˆZ—eˆZ˜eˆZ™eˆZšeˆZ›eˆZœeˆZeˆZžeˆZŸeˆZ eˆZ¡eˆZ¢eˆZ£eˆZ¤eˆZ¥eˆZ¦eˆZ§ddþdÿ„Z¨d d„ Z©dd„ Zªdd„ Z«dd„ Z¬dd	„ Z­d
d„ Z®ed…v rgdd„ Z¯ned&v rsdd„ Z¯neeƒ‚ed;v r}nedv rŠdd„ Z°ned&v r–dd„ Z°neeƒ‚dd„ Z±dS (  rZ   zLTrace runner contains the states for the trace and the opcode dispatch.
    c                 C   s   || _ tƒ | _tƒ | _d S r0   )rS   r   r]   rª   r`   )r3   rS   r"   r"   r#   r5   <  s   zTraceRunner.__init__c                 C   s   t | j|ƒS r0   )r   rS   )r3   Úlinenor"   r"   r#   Úget_debug_locA  rF   zTraceRunner.get_debug_locc                 C   sØ   t dv r'|jr&|jr&|jd }|d }|d ur"||jkr"|j ¡  nn|js
n	t dv r,ntt ƒ‚| ¡ }|jdkrHt d|j	|¡ t d|j
¡ t| d |j¡d ƒ}|d ur]|||ƒ d S d	|j }t||  |j¡d
‚)Nrw   éÿÿÿÿry   r”   ÚCACHEzdispatch pc=%s, inst=%szstack %szop_{}z$Use of unsupported opcode (%s) found©Úloc)r   Ú_blockstackrU   ÚpoprÓ   r‚   rƒ   rJ   rK   r‹   ra   Úgetattrr?   r   rÚ   rÙ   )r3   rs   ÚtopblkÚblk_endrÌ   ÚfnrÒ   r"   r"   r#   rb   D  s0   
ú€


ÿzTraceRunner.dispatchc                 C   sr   |  d¡}| |¡ |j}i }|d }||kr|| |d< d}|d r'|d7 }||d< |jd
d|d i|¤Ž d	S )zo
        Adjust stack when entering an exception handler to match expectation
        by the bytecode.
        r*   r|   r–   é   r}   r™   rP   ry   Nr"   )rŒ   rš   r|   r…   )r3   rs   r   rQ   rž   Úexpected_depthÚextra_stackr"   r"   r#   r‡   _  s   

z TraceRunner._adjust_except_stackc                 C   ó   |  |¡ d S r0   ©r^   rË   r"   r"   r#   Úop_NOPs  ó   zTraceRunner.op_NOPc                 C   rè   r0   ré   rË   r"   r"   r#   Ú	op_RESUMEv  rë   zTraceRunner.op_RESUMEc                 C   rè   r0   ré   rË   r"   r"   r#   Úop_CACHEy  rë   zTraceRunner.op_CACHEc                 C   rè   r0   ré   rË   r"   r"   r#   Ú
op_PRECALL|  rë   zTraceRunner.op_PRECALLc                 C   ó   |  | ¡ ¡ | |¡ d S r0   )ÚpushÚ	make_nullr^   rË   r"   r"   r#   Úop_PUSH_NULL  s   zTraceRunner.op_PUSH_NULLc                 C   rï   r0   )rð   Ú	make_tempr^   rË   r"   r"   r#   Úop_RETURN_GENERATORƒ  s   
zTraceRunner.op_RETURN_GENERATOR©r   c                 C   sD   t dksJ ‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ d S )Nr   ©r4   ÚresÚstrvar)r   rà   ró   r^   rð   )r3   rs   rÌ   r4   rø   r÷   r"   r"   r#   Úop_FORMAT_SIMPLE‘  s   zTraceRunner.op_FORMAT_SIMPLEc                 C   sZ   |j dkrd}t||  |j¡d‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ dS )aF  
        FORMAT_VALUE(flags): flags argument specifies format spec which is
        not supported yet. Currently, we just call str() on the value.
        Pops a value from stack and pushes results back.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-FORMAT_VALUE
        r   z*format spec in f-strings not supported yetrÝ   rö   N)Úargr   rÚ   rÙ   rà   ró   r^   rð   )r3   rs   rÌ   rÒ   r4   rø   r÷   r"   r"   r#   Úop_FORMAT_VALUE™  s   

ÿzTraceRunner.op_FORMAT_VALUEc                    st   |j }tt‡ fdd„t|ƒD ƒƒƒ}|dkrˆ  ¡ g}n‡ fdd„t|d ƒD ƒ}ˆ j|||d ˆ  |d ¡ dS )	zú
        BUILD_STRING(count): Concatenates count strings from the stack and
        pushes the resulting string onto the stack.
        Required for supporting f-strings.
        https://docs.python.org/3/library/dis.html#opcode-BUILD_STRING
        c                    ó   g | ]}ˆ   ¡ ‘qS r"   ©rà   ©Ú.0Ú_©rs   r"   r#   Ú
<listcomp>³  ó    z/TraceRunner.op_BUILD_STRING.<locals>.<listcomp>r   c                    rü   r"   ©ró   rþ   r  r"   r#   r  ¸  r  rå   )ÚstringsÚtmpsrÛ   N©rú   r»   ÚreversedÚrangeró   r^   rð   )r3   rs   rÌ   Úcountr  r  r"   r  r#   Úop_BUILD_STRING«  s   zTraceRunner.op_BUILD_STRINGc                 C   ó   |  ¡  d S r0   rý   rË   r"   r"   r#   Ú
op_POP_TOP¼  rF   zTraceRunner.op_POP_TOPc                 C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)Úvalr÷   )ró   rà   r^   rð   )r3   rs   rÌ   r÷   Útosr"   r"   r#   Ú
op_TO_BOOLÀ  ó   zTraceRunner.op_TO_BOOLr   c                 C   sL   |  ¡ }|jd? }|j|||d | |¡ |jd@ r$| | ¡ ¡ d S d S ©Nrå   )Úidxr÷   ©ró   rú   r^   rð   rñ   ©r3   rs   rÌ   r÷   r  r"   r"   r#   Úop_LOAD_GLOBALÊ  s   


ÿzTraceRunner.op_LOAD_GLOBAL©r'   r   c                 C   sH   |  ¡ }|jd? }|j|||d |jd@ r| | ¡ ¡ | |¡ d S r  r  r  r"   r"   r#   r  Ô  s   

r”   c                 C   ó$   |  ¡ }|j||d | |¡ d S ©N©r÷   ©ró   r^   rð   ©r3   rs   rÌ   r÷   r"   r"   r#   r  Ý  ó   c                 C   rè   r0   ré   rË   r"   r"   r#   Úop_COPY_FREE_VARSä  rë   zTraceRunner.op_COPY_FREE_VARSc                 C   rè   r0   ré   rË   r"   r"   r#   Úop_MAKE_CELLç  rë   zTraceRunner.op_MAKE_CELLc                 C   r  r  r  r  r"   r"   r#   Úop_LOAD_DEREFê  r  zTraceRunner.op_LOAD_DEREFc                 C   s2   |  d¡d|j›  }| |¡ |j||d d S )NÚconstÚ.r  )ró   rú   rð   r^   r  r"   r"   r#   Úop_LOAD_CONSTï  s   
zTraceRunner.op_LOAD_CONSTc                 C   s˜   |  ¡ }| ¡ }tdv r| |¡ |jd@ r| | ¡ ¡ n$tdv r4|jd@ r.| | ¡ ¡ | |¡ ntdv r>| |¡ nttƒ‚|j|||d d S )Nrõ   rå   ©r   r$   ©Úitemr÷   )rà   ró   r   rð   rú   rñ   rÓ   r^   )r3   rs   rÌ   r&  r÷   r"   r"   r#   Úop_LOAD_ATTRõ  s   

€
zTraceRunner.op_LOAD_ATTRc           
      C   sØ   t dksJ ‚t dv rTz| |¡}W nG tyS   |j}t|jƒ}t|jƒ}t|jƒ}|| }d|j|   kr<|k s?J ‚ J ‚| 	¡ }	|j
||	dd | |	¡ Y d S w | |¡}| 	|¡}	|j
||	d | |	¡ d S )Nr   rõ   r   T)r÷   Úas_load_derefr  )r   Úget_varnameÚ
IndexErrorrM   ÚlenÚco_varnamesÚco_freevarsÚco_cellvarsrú   ró   r^   rð   )
r3   rs   rÌ   ÚnameÚbcÚnum_varnamesÚnum_freevarsÚnum_cellvarsÚmax_fast_localr÷   r"   r"   r#   Úop_LOAD_FAST  s(   


"
ñ

zTraceRunner.op_LOAD_FASTc           
      C   sf   |j }|d? }|d@ }| |¡}| |¡}| |¡}| |¡}	|j|||	d | |¡ | |	¡ d S )Né   é   )Úres1Úres2)rú   Úget_varname_by_argró   r^   rð   )
r3   rs   rÌ   ÚopargÚoparg1Úoparg2Úname1Úname2r8  r9  r"   r"   r#   Úop_LOAD_FAST_LOAD_FAST"  s   




z"TraceRunner.op_LOAD_FAST_LOAD_FASTc                 C   sH   |j }|d@ }| ¡ }| |¡}| |¡}|j|||d | |¡ d S )Nr7  )Ústore_valueÚload_res)rú   rà   r:  ró   r^   rð   )r3   rs   rÌ   r;  r=  rA  Ú	load_namerB  r"   r"   r#   Úop_STORE_FAST_LOAD_FAST.  s   

z#TraceRunner.op_STORE_FAST_LOAD_FASTc                 C   ó$   |  ¡ }|  ¡ }|j|||d d S )N)Úvalue1Úvalue2©rà   r^   )r3   rs   rÌ   rF  rG  r"   r"   r#   Úop_STORE_FAST_STORE_FAST8  ó   z$TraceRunner.op_STORE_FAST_STORE_FAST©r%   r'   r   r   r$   c                 C   rè   r0   ré   rË   r"   r"   r#   Úop_DELETE_FASTJ  rë   zTraceRunner.op_DELETE_FASTc                 C   ó   |  ¡ }|j||d d S )N)r   rH  )r3   rs   rÌ   r   r"   r"   r#   Úop_DELETE_ATTRM  ó   zTraceRunner.op_DELETE_ATTRc                 C   rE  )N)r   r4   rH  )r3   rs   rÌ   r   r4   r"   r"   r#   Úop_STORE_ATTRQ  rJ  zTraceRunner.op_STORE_ATTRc                 C   rM  ©N)r4   rH  ©r3   rs   rÌ   r4   r"   r"   r#   Úop_STORE_DEREFV  rO  zTraceRunner.op_STORE_DEREFc                 C   rM  rQ  rH  rR  r"   r"   r#   Úop_STORE_FASTZ  rO  zTraceRunner.op_STORE_FASTc           	   	   C   óV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[TOS:]
        )ÚbaseÚstartr÷   ÚslicevarÚindexvarÚnonevarN©rà   ró   r^   rð   ©	r3   rs   rÌ   r  Útos1r÷   rX  rY  rZ  r"   r"   r#   Ú
op_SLICE_1^  ó    ù	zTraceRunner.op_SLICE_1c           	   	   C   rU  )z"
        TOS = TOS1[:TOS]
        )rV  Ústopr÷   rX  rY  rZ  Nr[  r\  r"   r"   r#   Ú
op_SLICE_2s  r_  zTraceRunner.op_SLICE_2c           	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z&
        TOS = TOS2[TOS1:TOS]
        )rV  rW  r`  r÷   rX  rY  Nr[  )	r3   rs   rÌ   r  r]  Útos2r÷   rX  rY  r"   r"   r#   Ú
op_SLICE_3ˆ  r_  zTraceRunner.op_SLICE_3c                 C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z
        TOS[:] = TOS1
        )rV  r4   rX  rY  rZ  N©rà   ró   r^   )r3   rs   rÌ   r  r4   rX  rY  rZ  r"   r"   r#   Úop_STORE_SLICE_0  ó   
úzTraceRunner.op_STORE_SLICE_0c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )rV  rW  rX  r4   rY  rZ  Nrd  ©	r3   rs   rÌ   r  r]  r4   rX  rY  rZ  r"   r"   r#   Úop_STORE_SLICE_1¯  ó   
ùzTraceRunner.op_STORE_SLICE_1c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )rV  r`  r4   rX  rY  rZ  Nrd  rg  r"   r"   r#   Úop_STORE_SLICE_2Ã  ri  zTraceRunner.op_STORE_SLICE_2c           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )rV  rW  r`  r4   rX  rY  Nrd  )	r3   rs   rÌ   r  r]  rb  r4   rX  rY  r"   r"   r#   Úop_STORE_SLICE_3×  ri  zTraceRunner.op_STORE_SLICE_3c                 C   s8   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d dS )z
        del TOS[:]
        )rV  rX  rY  rZ  Nrd  )r3   rs   rÌ   r  rX  rY  rZ  r"   r"   r#   Úop_DELETE_SLICE_0ë  s   
þzTraceRunner.op_DELETE_SLICE_0c                 C   óB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[TOS:]
        )rV  rW  rX  rY  rZ  Nrd  ©r3   rs   rÌ   r  r]  rX  rY  rZ  r"   r"   r#   Úop_DELETE_SLICE_1ø  rf  zTraceRunner.op_DELETE_SLICE_1c                 C   rm  )z 
        del TOS1[:TOS]
        )rV  r`  rX  rY  rZ  Nrd  rn  r"   r"   r#   Úop_DELETE_SLICE_2
  rf  zTraceRunner.op_DELETE_SLICE_2c                 C   sB   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )rV  rW  r`  rX  rY  Nrd  )r3   rs   rÌ   r  r]  rb  rX  rY  r"   r"   r#   Úop_DELETE_SLICE_3  s   

þzTraceRunner.op_DELETE_SLICE_3c                 C   s–   |j }|dkr| ¡ }| ¡ }|}|}d}n|dkr-| ¡ }| ¡ }| ¡ }	|	}|}|}ntdƒ‚| ¡ }
| ¡ }|j||||||
d | |¡ dS )z<
        slice(TOS1, TOS) or slice(TOS2, TOS1, TOS)
        é   Nr   Úunreachable)rW  r`  Ústepr÷   rX  )rú   rà   Ú	Exceptionró   r^   rð   )r3   rs   rÌ   Úargcr  r]  rW  r`  rt  rb  rX  r÷   r"   r"   r#   Úop_BUILD_SLICE*  s*   ÿzTraceRunner.op_BUILD_SLICEc           	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ d S )N)rW  ry   Ú	containerr÷   rX  Útemp_resr[  )	r3   rs   rÌ   ry   rW  rx  ry  r÷   rX  r"   r"   r#   Úop_BINARY_SLICEF  s   
þzTraceRunner.op_BINARY_SLICEc           	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d d S )N)rW  ry   rx  r4   r÷   rX  rd  )	r3   rs   rÌ   ry   rW  rx  r4   rX  r÷   r"   r"   r#   Úop_STORE_SLICEX  s   

þzTraceRunner.op_STORE_SLICEc                 C   sL   |  ¡ }|j||d | ¡ }|j}|j|d ||kr$|j|d d S d S )N©Úpredrx   )rà   r^   Úget_jump_targetr†   r…   )r3   rs   rÌ   r}  Útarget_instÚ	next_instr"   r"   r#   Ú_op_POP_JUMP_IFi  s   ÿzTraceRunner._op_POP_JUMP_IFc                 C   s:   |  ¡ }|j||d |j|jdd |j| ¡ d d S )Nr|  rå   ©rP   r–   rx   )Úget_tosr^   r…   r†   r~  )r3   rs   rÌ   r}  r"   r"   r#   Ú_op_JUMP_IF_OR_POP€  s   zTraceRunner._op_JUMP_IF_OR_POPc                 C   ó   |   ||¡ d S r0   ©r  rË   r"   r"   r#   Úop_POP_JUMP_FORWARD_IF_NONE‰  ó   z'TraceRunner.op_POP_JUMP_FORWARD_IF_NONEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_FORWARD_IF_NOT_NONEŒ  rˆ  z+TraceRunner.op_POP_JUMP_FORWARD_IF_NOT_NONEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_BACKWARD_IF_NONE  rˆ  z(TraceRunner.op_POP_JUMP_BACKWARD_IF_NONEc                 C   r…  r0   r†  rË   r"   r"   r#   Ú op_POP_JUMP_BACKWARD_IF_NOT_NONE’  rˆ  z,TraceRunner.op_POP_JUMP_BACKWARD_IF_NOT_NONEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_FORWARD_IF_FALSE•  rˆ  z(TraceRunner.op_POP_JUMP_FORWARD_IF_FALSEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_FORWARD_IF_TRUE˜  rˆ  z'TraceRunner.op_POP_JUMP_FORWARD_IF_TRUEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_BACKWARD_IF_FALSE›  rˆ  z)TraceRunner.op_POP_JUMP_BACKWARD_IF_FALSEc                 C   r…  r0   r†  rË   r"   r"   r#   Úop_POP_JUMP_BACKWARD_IF_TRUEž  rˆ  z(TraceRunner.op_POP_JUMP_BACKWARD_IF_TRUEc                 C   ó   |  |¡ |j| ¡ d d S ©Nrx   ©r^   r…   r~  rË   r"   r"   r#   Úop_JUMP_FORWARD¡  ó   
zTraceRunner.op_JUMP_FORWARDc                 C   r  r‘  r’  rË   r"   r"   r#   Úop_JUMP_BACKWARD¥  r”  zTraceRunner.op_JUMP_BACKWARDc                 C   r  r‘  r’  rË   r"   r"   r#   Úop_JUMP_ABSOLUTE«  r”  zTraceRunner.op_JUMP_ABSOLUTEc                 C   s4   |  d¡d }|j||d | ¡  |j|d d S )Nr+   ry   rz   rx   )rŒ   r^   Ú	pop_blockr…   )r3   rs   rÌ   ry   r"   r"   r#   Úop_BREAK_LOOP¯  s   zTraceRunner.op_BREAK_LOOPc                 C   s$   |j || ¡ | ¡ d | ¡  d S )N©ÚretvalÚcastval)r^   rà   ró   Ú	terminaterË   r"   r"   r#   Úop_RETURN_VALUE¶  s   zTraceRunner.op_RETURN_VALUEc                 C   s*   |  d¡}|j|||  ¡ d | ¡  d S )Nr!  r™  )ró   r^   rœ  r  r"   r"   r#   Úop_RETURN_CONST»  s   
zTraceRunner.op_RETURN_CONSTc                 C   ó.   |  ¡ }| ¡ }|j|||d | |¡ d S ©N)r4   r÷   r[  ©r3   rs   rÌ   r  r÷   r"   r"   r#   Úop_YIELD_VALUEÄ  r  zTraceRunner.op_YIELD_VALUErw   c                 C   sx   |j dkrd }| ¡ rtd|  |j¡d‚n|j dkr | ¡ }ntdƒ‚|j||d | ¡ r6|  |¡ d S | 	¡  d S )Nr   ú4The re-raising of an exception is not yet supported.rÝ   rå   ú)Multiple argument raise is not supported.©Úexc)
rú   r   r   rÚ   rÙ   rà   Ú
ValueErrorr^   r‡   rœ  ©r3   rs   rÌ   r¦  r"   r"   r#   Úop_RAISE_VARARGSË  s   

þÿ

zTraceRunner.op_RAISE_VARARGSc                 C   s~   t | d¡d u| d¡d ugƒ}|jdkr$d }|r#td|  |j¡d‚n|jdkr.| ¡ }ntdƒ‚|j||d | 	¡  d S )	Nr-   r.   r   r£  rÝ   rå   r¤  r¥  )
ÚanyrŒ   rú   r   rÚ   rÙ   rà   r§  r^   rœ  )r3   rs   rÌ   Úin_exc_blockr¦  r"   r"   r#   r©  á  s"   þ

þÿ

c                 C   s@   g }t tƒD ]}| ¡ }| |¡ | |¡ q|j||d d S )N)Útemps)r	  r›   ró   r^   rð   )r3   rs   rÌ   r¬  ÚiÚtmpr"   r"   r#   Úop_BEGIN_FINALLYö  s   
zTraceRunner.op_BEGIN_FINALLYc                 C   s   |  ¡ }| |d ¡ d S )Nr•   )r—  Úreset_stack©r3   rs   rÌ   Úblkr"   r"   r#   Úop_END_FINALLYþ  rO  zTraceRunner.op_END_FINALLYc                 C   r  r0   rý   rË   r"   r"   r#   Ú
op_END_FOR  rF   zTraceRunner.op_END_FORr$  c                 C   s   |  ¡  |  ¡  d S r0   rý   rË   r"   r"   r#   r´    ó   c                 C   s&   |j dkrd}t||  |j¡d‚d S )Nr   zGUnsupported use of a bytecode related to try..finally or a with-contextrÝ   )rú   r   rÚ   rÙ   )r3   rs   rÌ   rÒ   r"   r"   r#   Úop_POP_FINALLY  s   

ÿýzTraceRunner.op_POP_FINALLYc                 C   s   d S r0   r"   rË   r"   r"   r#   Úop_CALL_FINALLY  s   zTraceRunner.op_CALL_FINALLYc                 C   r  r0   )rœ  rË   r"   r"   r#   Úop_WITH_EXCEPT_START  rF   z TraceRunner.op_WITH_EXCEPT_STARTc                 C   rè   r0   ré   rË   r"   r"   r#   Úop_WITH_CLEANUP_START  ó   z!TraceRunner.op_WITH_CLEANUP_STARTc                 C   rè   r0   ré   rË   r"   r"   r#   Úop_WITH_CLEANUP_FINISH   rº  z"TraceRunner.op_WITH_CLEANUP_FINISHc                 C   s   |  |jd| ¡ d¡ d S )Nr+   ©r˜   ry   )Ú
push_blockrŽ   r~  rË   r"   r"   r#   Úop_SETUP_LOOP$  s   þÿzTraceRunner.op_SETUP_LOOPc                 C   s´   |  ¡ }| ¡ }|jdd}| |¡ | |¡ |j}| |j¡}|g}|jD ]}	|	j|jkr4| |	¡ q't	dd„ |D ƒƒ}
|j||||
d | 
|jd|
d¡ |j|jd d S )	NÚsetup_with_exitfn©Úprefixc                 s   s    | ]}|j V  qd S r0   rz   )rÿ   r‘   r"   r"   r#   Ú	<genexpr>?  s   € z-TraceRunner.op_BEFORE_WITH.<locals>.<genexpr>)ÚcontextmanagerÚexitfnry   r,   r¼  rx   )rà   ró   rð   rM   Úfind_exception_entryr†   Úexception_entriesr   r^   Úmaxr½  rŽ   r…   )r3   rs   rÌ   ÚcmÚyieldedrÄ  r0  ÚehheadÚ	ehrelatedr‘   ry   r"   r"   r#   Úop_BEFORE_WITH-  s*   



€þÿzTraceRunner.op_BEFORE_WITHc                 C   sj   |  ¡ }| ¡ }|jdd}|j|||d | |¡ | |¡ | |jd| ¡ d¡ |j|jd d S )Nr¿  rÀ  )rÃ  rÄ  r,   r¼  rx   )	rà   ró   r^   rð   r½  rŽ   r~  r…   r†   )r3   rs   rÌ   rÈ  rÉ  rÄ  r"   r"   r#   Úop_SETUP_WITHK  s   

þÿzTraceRunner.op_SETUP_WITHc                 C   s0   |j |d dd}|j||j d|d|dd d S )NF)r˜   ry   r°  r*   )r˜   ry   r°  r—   r~   )rŽ   r…   )r3   r˜   rs   r†   ry   Úhandler_blockr"   r"   r#   Ú
_setup_try^  s   ýü
þzTraceRunner._setup_tryc                 C   s&   |  ¡ }| | d¡¡ | |¡ d S )NÚ	exception)rà   rð   ró   )r3   rs   rÌ   r  r"   r"   r#   Úop_PUSH_EXC_INFOr  s   zTraceRunner.op_PUSH_EXC_INFOc                 C   s&   |  |¡ | jd||j| ¡ d d S )Nr.   )r†   ry   )r^   rÏ  r†   r~  rË   r"   r"   r#   Úop_SETUP_FINALLYw  s   

ÿzTraceRunner.op_SETUP_FINALLYc                 C   r  r0   rý   rË   r"   r"   r#   Úop_POP_EXCEPT~  rF   zTraceRunner.op_POP_EXCEPTc                 C   sh   |  ¡ }|d tdƒtdƒhvrtd|d › |  |j¡d‚| ¡  | ¡  | ¡  |j|jd d S )Nr˜   r-   r.   z$POP_EXCEPT got an unexpected block: rÝ   rx   )r—  r)   r   rÚ   rÙ   rà   r…   r†   r±  r"   r"   r#   rÓ  ‚  s   
þc                 C   sX   |  ¡ }|d tdƒkr|j|dd n|d tdƒkr#|j|dd |j|jd d S )Nr˜   r*   Útry)r˜   r,   Úwithrx   )r—  r)   r^   r…   r†   r±  r"   r"   r#   Úop_POP_BLOCK‘  s   zTraceRunner.op_POP_BLOCKc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)Úindexr   r÷   r[  )r3   rs   rÌ   r×  r   r÷   r"   r"   r#   Úop_BINARY_SUBSCR™  ó
   zTraceRunner.op_BINARY_SUBSCRc                 C   s.   |  ¡ }|  ¡ }|  ¡ }|j||||d d S )N)r   r×  r4   rH  )r3   rs   rÌ   r×  r   r4   r"   r"   r#   Úop_STORE_SUBSCR   s   zTraceRunner.op_STORE_SUBSCRc                 C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r   r×  rH  )r3   rs   rÌ   r×  r   r"   r"   r#   Úop_DELETE_SUBSCR¦  rJ  zTraceRunner.op_DELETE_SUBSCRc                    sº   |j }tt‡ fdd„t|ƒD ƒƒƒ}tdkr*ˆ  ¡ }ˆ  ¡ }t|ƒs'|g|¢}d }ntdk rHˆ  ¡ }ˆ  ¡ }	t|	ƒr=|}n|	}|g|¢}ˆ  ¡ }ˆ  ¡ }
ˆ j	|||||
d ˆ  
|
¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  ­  r  z'TraceRunner.op_CALL.<locals>.<listcomp>r   ©ÚfuncÚargsÚkw_namesr÷   )rú   r»   r  r	  r   rà   r×   Úpop_kw_namesró   r^   rð   )r3   rs   rÌ   ÚnargrÞ  Únull_or_selfÚcallablerß  Úcallable_or_firstargÚnull_or_callabler÷   r"   r  r#   Úop_CALL«  s&   

zTraceRunner.op_CALLc                 C   ó   |  |j¡ d S r0   )Úset_kw_namesrú   rË   r"   r"   r#   Úop_KW_NAMESÃ  rˆ  zTraceRunner.op_KW_NAMESc                    sT   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j||||d ˆ  |¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  È  r  z0TraceRunner.op_CALL_FUNCTION.<locals>.<listcomp>)rÝ  rÞ  r÷   )rú   r»   r  r	  rà   ró   r^   rð   )r3   rs   rÌ   rá  rÞ  rÝ  r÷   r"   r  r#   Úop_CALL_FUNCTIONÆ  s   zTraceRunner.op_CALL_FUNCTIONc                    s^   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  Ò  r  z3TraceRunner.op_CALL_FUNCTION_KW.<locals>.<listcomp>)rÝ  rÞ  Únamesr÷   )rú   rà   r»   r  r	  ró   r^   rð   )r3   rs   rÌ   rá  rë  rÞ  rÝ  r÷   r"   r  r#   Úop_CALL_FUNCTION_KWÏ  s   zTraceRunner.op_CALL_FUNCTION_KWc           	         sx   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }t|ƒs'|g|¢}ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  Ý  r  z*TraceRunner.op_CALL_KW.<locals>.<listcomp>rÜ  )	rú   rà   r»   r  r	  r×   ró   r^   rð   )	r3   rs   rÌ   rá  rß  rÞ  Únull_or_firstargrã  r÷   r"   r  r#   Ú
op_CALL_KWÚ  s   
ÿzTraceRunner.op_CALL_KWc                 C   sZ   |j d@ r
| ¡ }nd }| ¡ }| ¡  | ¡ }| ¡ }|j|||||d | |¡ d S )Nrå   ©rÝ  ÚvarargÚvarkwargr÷   )rú   rà   ró   r^   rð   ©r3   rs   rÌ   rñ  rð  rÝ  r÷   r"   r"   r#   Úop_CALL_FUNCTION_EXî  s   

ÿzTraceRunner.op_CALL_FUNCTION_EXc                 C   s„   |j d@ r
| ¡ }nd }| ¡ }| ¡ }tdv r$t| d¡ƒr#| ¡  n	tdv r)nttƒ‚| ¡ }|j|||||d | |¡ d S )Nrå   r  r”   rï  )	rú   rà   r   r×   ÚpeekrÓ   ró   r^   rð   rò  r"   r"   r#   ró     s"   

€ÿc                    sp   ‡ fdd„t |ƒD ƒ}| ¡  ‡ fdd„t |ƒD ƒ}ˆ j|||d |D ]}ˆ  |¡ q$|D ]}ˆ  |¡ q.d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r    r  z)TraceRunner._dup_topx.<locals>.<listcomp>c                    rü   r"   r  rþ   r  r"   r#   r    r  )ÚorigÚduped)r	  Úreverser^   rð   )r3   rs   rÌ   r
  rõ  rö  r  r"   r  r#   Ú	_dup_topx  s   ÿzTraceRunner._dup_topxc           	      C   sä   zt |jƒ}W n ty!   d|j› d}|  |j¡}t||d‚w |tjkr4|j||d | 	¡  d S |tj
krQ| ¡ }| ¡ }|j||||d | |¡ d S |tjkrn| ¡ }| ¡ }|j||||d | |¡ d S t|ƒ‚)Nzop_CALL_INTRINSIC_1(ú)rÝ   )Úoperand)rú  r4   r÷   )rú  Ú
const_listr÷   )r   rú   r>   rÚ   rÙ   r   Úci1opr   r^   rœ  r    rà   ró   rð   r!   rÓ   )	r3   rs   rÌ   rú  rÒ   rÞ   r  r÷   r  r"   r"   r#   Úop_CALL_INTRINSIC_1$  s8   ý

ÿ

ÿ
zTraceRunner.op_CALL_INTRINSIC_1c                 C   s<   |j }d|  krdksJ dƒ‚ J dƒ‚|  |||¡ d S )Nrå   r   zInvalid DUP_TOPX count)rú   rø  )r3   rs   rÌ   r
  r"   r"   r#   Úop_DUP_TOPXG  s   $zTraceRunner.op_DUP_TOPXc                 C   ó   | j ||dd d S )Nrå   ©r
  ©rø  rË   r"   r"   r#   Ú
op_DUP_TOPL  ó   zTraceRunner.op_DUP_TOPc                 C   rÿ  )Nrr  r   r  rË   r"   r"   r#   Úop_DUP_TOP_TWOO  r  zTraceRunner.op_DUP_TOP_TWOc                 C   s   |  | |j¡¡ d S r0   )rð   rô  rú   rË   r"   r"   r#   Úop_COPYR  s   zTraceRunner.op_COPYc                 C   rç  r0   )Úswaprú   rË   r"   r"   r#   Úop_SWAPU  rˆ  zTraceRunner.op_SWAPc                 C   s(   |  ¡ }|  ¡ }| |¡ | |¡ d S r0   ©rà   rð   )r3   rs   rÌ   ÚfirstÚsecondr"   r"   r#   Ú
op_ROT_TWOX  s   
zTraceRunner.op_ROT_TWOc                 C   s:   |  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ d S r0   r  )r3   rs   rÌ   r	  r
  Úthirdr"   r"   r#   Úop_ROT_THREE^  s   

zTraceRunner.op_ROT_THREEc                 C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ | |¡ d S r0   r  )r3   rs   rÌ   r	  r
  r  Úforthr"   r"   r#   Úop_ROT_FOURf  s   


zTraceRunner.op_ROT_FOURc                    sZ   |j }ˆ  ¡ }‡ fdd„t|ƒD ƒ}ˆ  ¡ }ˆ j||||d t|ƒD ]}ˆ  |¡ q#d S )Nc                    rü   r"   r  rþ   r  r"   r#   r  s  r  z2TraceRunner.op_UNPACK_SEQUENCE.<locals>.<listcomp>)ÚiterableÚstoresÚtupleobj)rú   rà   r	  ró   r^   r  rð   )r3   rs   rÌ   r
  r  r  r  Ústr"   r  r#   Úop_UNPACK_SEQUENCEp  s   ÿzTraceRunner.op_UNPACK_SEQUENCEc                    óJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  {  r  z.TraceRunner.op_BUILD_TUPLE.<locals>.<listcomp>©r´   r÷   r  )r3   rs   rÌ   r
  r´   Útupr"   r  r#   Úop_BUILD_TUPLEy  ó
   zTraceRunner.op_BUILD_TUPLEc                    s|   t t‡ fdd„t|jƒD ƒƒƒ}‡ fdd„tt|ƒd ƒD ƒ}t|ƒdk}|r,ˆ  ¡ g}ˆ j||||d ˆ  |d ¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r  ‚  r  z3TraceRunner._build_tuple_unpack.<locals>.<listcomp>c                    rü   r"   r  rþ   r  r"   r#   r  ƒ  r  rå   )Útuplesr¬  Ú	is_assignrÛ   )r»   r  r	  rú   r+  ró   r^   rð   )r3   rs   rÌ   r  r¬  r  r"   r  r#   Ú_build_tuple_unpack€  s    
zTraceRunner._build_tuple_unpackc                 C   r…  r0   ©r  rË   r"   r"   r#   Úop_BUILD_TUPLE_UNPACK_WITH_CALL  ó   z+TraceRunner.op_BUILD_TUPLE_UNPACK_WITH_CALLc                 C   r…  r0   r  rË   r"   r"   r#   Úop_BUILD_TUPLE_UNPACK“  rˆ  z!TraceRunner.op_BUILD_TUPLE_UNPACKc                 C   rŸ  )N)rû  r÷   r[  )r3   rs   rÌ   r  r÷   r"   r"   r#   Úop_LIST_TO_TUPLE–  s   zTraceRunner.op_LIST_TO_TUPLEc                    sj   ˆ   ¡ }tt‡ fdd„t|jƒD ƒƒƒ}‡ fdd„t|jƒD ƒ}ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                    rü   r"   rý   rþ   r  r"   r#   r     r  z6TraceRunner.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                    rü   r"   r  rþ   r  r"   r#   r  ¡  r  )ÚkeysÚkeytmpsÚvaluesr÷   )rà   r»   r  r	  rú   ró   r^   rð   )r3   rs   rÌ   r"  Úvalsr#  r÷   r"   r  r#   Úop_BUILD_CONST_KEY_MAPž  s    z"TraceRunner.op_BUILD_CONST_KEY_MAPc                    r  )Nc                    rü   r"   rý   rþ   r  r"   r#   r  ¨  r  z-TraceRunner.op_BUILD_LIST.<locals>.<listcomp>r  r  )r3   rs   rÌ   r
  r´   Úlstr"   r  r#   Úop_BUILD_LIST¦  r  zTraceRunner.op_BUILD_LISTc                 C   ó@   |  ¡ }|j}| |¡}| ¡ }| ¡ }|j|||||d d S )N)r   r4   Ú	appendvarr÷   ©rà   rú   rô  ró   r^   )r3   rs   rÌ   r4   r×  r   r*  r÷   r"   r"   r#   Úop_LIST_APPEND­  ó   

ÿzTraceRunner.op_LIST_APPENDc                 C   r)  )N)r   r4   Ú	extendvarr÷   r+  )r3   rs   rÌ   r4   r×  r   r.  r÷   r"   r"   r#   Úop_LIST_EXTEND¶  r-  zTraceRunner.op_LIST_EXTENDc           	      C   sj   |  ¡ }|j}g }t|ƒD ]}| ¡ | ¡ }}| ||f¡ q|j||d d d… ||d | |¡ d S )NrÛ   )r´   Úsizer÷   )ró   rú   r	  rà   r^   rð   )	r3   rs   rÌ   Údctr
  r´   r­  ÚvÚkr"   r"   r#   Úop_BUILD_MAP¿  s   zTraceRunner.op_BUILD_MAPc                 C   sT   |  ¡ }|  ¡ }||}}|j}| |¡}| ¡ }	| ¡ }
|j|||||	|
d d S )N)r   rX   r4   Ú
setitemvarr÷   r+  )r3   rs   rÌ   ÚTOSÚTOS1rX   r4   r×  r   r5  r÷   r"   r"   r#   Ú
op_MAP_ADDÊ  s   


ÿzTraceRunner.op_MAP_ADDc                    r  )Nc                    rü   r"   rý   rþ   r  r"   r#   r  Ø  r  z,TraceRunner.op_BUILD_SET.<locals>.<listcomp>r  r  )r3   rs   rÌ   r
  r´   r÷   r"   r  r#   Úop_BUILD_SETÕ  s
   zTraceRunner.op_BUILD_SETc                 C   r)  ©N)r   r4   Ú	updatevarr÷   r+  ©r3   rs   rÌ   r4   r×  r   r;  r÷   r"   r"   r#   Úop_SET_UPDATEÝ  r-  zTraceRunner.op_SET_UPDATEc                 C   r)  r:  r+  r<  r"   r"   r#   Úop_DICT_UPDATEæ  r-  zTraceRunner.op_DICT_UPDATEc                 C   rŸ  r   r[  )r3   rs   rÌ   r4   r÷   r"   r"   r#   Úop_GET_ITERï  r  zTraceRunner.op_GET_ITERc                 C   sŽ   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d | |¡ | ¡ }tdv r.|j|d ntdv r:|j|dd nttƒ‚|j|jd d S )N)ÚiteratorÚpairÚindvalr}  r   rx   r$   rr  r‚  )	rƒ  ró   r^   rð   r~  r   r…   rÓ   r†   )r3   rs   rÌ   r@  rA  rB  r}  ry   r"   r"   r#   Úop_FOR_ITERõ  s   ÿ
zTraceRunner.op_FOR_ITERc                 C   s   dS )a(  Pops TOS. If TOS was not None, raises an exception. The kind
        operand corresponds to the type of generator or coroutine and
        determines the error message. The legal kinds are 0 for generator,
        1 for coroutine, and 2 for async generator.

        New in version 3.10.
        Nr"   rË   r"   r"   r#   Úop_GEN_START	  s   	zTraceRunner.op_GEN_STARTc                 C   s^   t j|j d }| ¡ }| ¡ }t| j}|jd|› d}|j|||||d | |¡ d S )Nrå   Úbinop_rÀ  )ÚopÚlhsr¸   r÷   )	ÚdisÚ_nb_opsrú   rà   r   r   ró   r^   rð   )r3   rs   rÌ   rF  r¸   rG  Úop_namer÷   r"   r"   r#   Úop_BINARY_OP  s   
zTraceRunner.op_BINARY_OPc                 C   rŸ  r   r[  r¡  r"   r"   r#   Ú_unaryop  r  zTraceRunner._unaryopc                 C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)rG  r¸   r÷   r[  )r3   rs   rÌ   r¸   rG  r÷   r"   r"   r#   Ú	_binaryop(  rÙ  zTraceRunner._binaryopFc              
   C   sÐ   t dv rd }nt dv r| ¡ }ntt ƒ‚| ¡ }d  } } }}	t dv r,|jd u s+J ‚n$|jd@ r5| ¡ }|jd@ r>| ¡ }|jd@ rG| ¡ }|jd@ rP| ¡ }	| ¡ }
|j|||||||	|
d | |
¡ d S )	Nrw   r”   rõ   é   r6  rr  rå   )r/  ÚcodeÚclosureÚannotationsÚ
kwdefaultsÚdefaultsr÷   )r   rà   rÓ   rú   ró   r^   rð   )r3   rs   rÌ   ÚMAKE_CLOSUREr/  rO  rP  rQ  rR  rS  r÷   r"   r"   r#   Úop_MAKE_FUNCTIONS  s:   




ø
zTraceRunner.op_MAKE_FUNCTIONc                 C   sš   t dv sJ ‚| ¡ }| ¡ }|jdkr|j||d n+|jd@ r(|j||d n|jd@ r5|j||d n|jdkrB|j||d	 ntd
ƒ‚| |¡ d S )Nrõ   rå   )rS  rr  )rR  r6  )rQ  rN  )rP  rs  )r   rà   rú   Úset_function_attributeÚAssertionErrorrð   )r3   rs   rÌ   Úmake_func_stackÚdatar"   r"   r#   Úop_SET_FUNCTION_ATTRIBUTEx  s   



z%TraceRunner.op_SET_FUNCTION_ATTRIBUTEc                 C   rÿ  )NT)rT  )rU  rË   r"   r"   r#   Úop_MAKE_CLOSURE  r  zTraceRunner.op_MAKE_CLOSUREc                 C   r  r  r  r  r"   r"   r#   Úop_LOAD_CLOSURE  r  zTraceRunner.op_LOAD_CLOSUREc                 C   s&   |  d¡}|j||d | |¡ d S )NÚassertion_errorr  r  r  r"   r"   r#   Úop_LOAD_ASSERTION_ERROR•  s   
z#TraceRunner.op_LOAD_ASSERTION_ERRORc                 C   s:   |  d¡}| ¡ }| ¡ }|j||||d | |¡ d S )NÚ	predicate©r}  r  r]  )ró   rà   rƒ  r^   rð   ©r3   rs   rÌ   r}  r  r]  r"   r"   r#   Úop_CHECK_EXC_MATCHš  s
   
zTraceRunner.op_CHECK_EXC_MATCHc                 C   sN   |  d¡}| ¡ }| ¡ }|j||||d |j|jd |j| ¡ d d S )Nr_  r`  rx   )ró   rà   r^   r…   r†   r~  ra  r"   r"   r#   Úop_JUMP_IF_NOT_EXC_MATCH¡  s   
z$TraceRunner.op_JUMP_IF_NOT_EXC_MATCHc                 C   sJ   |  ¡ }|jdkr|  ¡  |j||d | ¡ r|  |¡ d S | ¡  d S )Nr   r¥  )rà   rú   r^   r   r‡   rœ  r¨  r"   r"   r#   Ú
op_RERAISE¬  s   
zTraceRunner.op_RERAISEc                 C   s"   |  ¡ }|j||d | ¡  d S )Nr¥  )rà   r^   rœ  r¨  r"   r"   r#   rd  ¹  s   )r'   c                 C   s@   |  ¡ }| ¡ }| |¡ | ¡ }|j|||d | |¡ d S )Nr%  )rà   rñ   rð   ró   r^   )r3   rs   rÌ   r&  Úextrar÷   r"   r"   r#   Úop_LOAD_METHODÈ  s   
zTraceRunner.op_LOAD_METHODc                 C   r…  r0   )r'  rË   r"   r"   r#   rf  Ð  rˆ  c                 C   r…  r0   )rê  rË   r"   r"   r#   Úop_CALL_METHODÕ  rˆ  zTraceRunner.op_CALL_METHODN)F)²r   r   r   rG   r5   rÚ   rb   r‡   rê   rì   rí   rî   rò   rô   r   rù   rû   r  r  r  r  rÓ   r  r  r   r#  r'  r5  r@  rD  rI  Úop_LOAD_FAST_CHECKÚop_LOAD_FAST_AND_CLEARrL  rN  rP  rS  rT  r^  ra  rc  re  rh  rj  rk  rl  ro  rp  rq  rw  rz  r{  r  Úop_POP_JUMP_IF_TRUEÚop_POP_JUMP_IF_FALSEÚop_POP_JUMP_IF_NONEÚop_POP_JUMP_IF_NOT_NONEr„  Úop_JUMP_IF_FALSE_OR_POPÚop_JUMP_IF_TRUE_OR_POPr‡  r‰  rŠ  r‹  rŒ  r  rŽ  r  r“  r•  Úop_JUMP_BACKWARD_NO_INTERRUPTr–  r˜  r  rž  r¢  r©  r¯  r³  r´  r¶  r·  r¸  r¹  r»  r¾  rÌ  rÍ  rÏ  rÑ  rÒ  rÓ  rÖ  rØ  rÚ  rÛ  ræ  ré  rê  rì  rî  ró  rø  rý  rþ  r  r  r  r  r  r  r  r  r  r  r  r   r!  r&  r(  r,  r/  r4  r8  r9  r=  r>  r?  rC  rD  rK  rL  Úop_UNARY_NEGATIVEÚop_UNARY_POSITIVEÚop_UNARY_NOTÚop_UNARY_INVERTrM  Úop_COMPARE_OPÚop_IS_OPÚop_CONTAINS_OPÚop_INPLACE_ADDÚop_INPLACE_SUBTRACTÚop_INPLACE_MULTIPLYÚop_INPLACE_DIVIDEÚop_INPLACE_TRUE_DIVIDEÚop_INPLACE_FLOOR_DIVIDEÚop_INPLACE_MODULOÚop_INPLACE_POWERÚop_INPLACE_MATRIX_MULTIPLYÚop_INPLACE_LSHIFTÚop_INPLACE_RSHIFTÚop_INPLACE_ANDÚop_INPLACE_ORÚop_INPLACE_XORÚop_BINARY_ADDÚop_BINARY_SUBTRACTÚop_BINARY_MULTIPLYÚop_BINARY_DIVIDEÚop_BINARY_TRUE_DIVIDEÚop_BINARY_FLOOR_DIVIDEÚop_BINARY_MODULOÚop_BINARY_POWERÚop_BINARY_MATRIX_MULTIPLYÚop_BINARY_LSHIFTÚop_BINARY_RSHIFTÚop_BINARY_ANDÚop_BINARY_ORÚop_BINARY_XORrU  rZ  r[  r\  r^  rb  rc  rd  rf  rg  r"   r"   r"   r#   rZ   9  sè   

	



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


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




rZ   c                   @   sf  e Zd ZdZdTdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zdd „ Zd!d"„ ZdUd$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdVd8d9„Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFe%fdGdH„Z&dIdJ„ Z'dWdLdM„Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+d7S )XÚ_StatezState of the trace
    r"   c                 C   s¤   || _ || _|| _|| _g | _t|ƒ| _t|ƒ| _g | _	g | _
g | _d| _i | _tƒ | _tƒ | _t|ƒD ]}||v r@|  d¡}n|  d¡}|| j|< |  |¡ q4dS )aG  
        Parameters
        ----------
        bytecode : numba.bytecode.ByteCode
            function bytecode
        pc : int
            program counter
        nstack : int
            stackdepth at entry
        blockstack : Sequence[Dict]
            A sequence of dictionary denoting entries on the blockstack.
        Fúnull$r·   N)rM   Ú_pc_initialr‹   Ú_nstack_initialra   ÚtupleÚ_blockstack_initialr»   rß   Ú_temp_registersÚ_instsÚ	_outedgesÚ_terminatedr¬   r   r³   rª   r«   r	  ró   rð   )r3   rO   rP   rQ   rR   Únullvalsr­  r·   r"   r"   r#   r5   Ý  s*   



úz_State.__init__c                 C   s   d  | j| j¡S )Nz&State(pc_initial={} nstack_initial={}))r?   r–  r—  r9   r"   r"   r#   rE      s   ÿz_State.__repr__c                 C   s   | j | jfS r0   )r–  r—  r9   r"   r"   r#   Úget_identity  rF   z_State.get_identityc                 C   s   t |  ¡ ƒS r0   )r7   rŸ  r9   r"   r"   r#   r:     rF   z_State.__hash__c                 C   s   |   ¡ |  ¡ k S r0   ©rŸ  r@   r"   r"   r#   rB     rˆ  z_State.__lt__c                 C   s   |   ¡ |  ¡ kS r0   r   r@   r"   r"   r#   rD     rˆ  z_State.__eq__c                 C   rT   )z]The starting bytecode offset of this State.
        The PC given to the constructor.
        )r–  r9   r"   r"   r#   rU     ó   z_State.pc_initialc                 C   rT   )ziThe list of instructions information as a 2-tuple of
        ``(pc : int, register_map : Dict)``
        )r›  r9   r"   r"   r#   Úinstructions  r¡  z_State.instructionsc                 C   rT   )zaThe list of outgoing edges.

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

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

        Returns
        -------
        res : int
        )r+  ra   r9   r"   r"   r#   r|   8  s   
z_State.stack_depthc                 C   s,   t | jƒD ]}|d tdƒkr|  S qdS )z&Find the initial *try* block.
        r˜   r*   N)r  r™  r)   )r3   r²  r"   r"   r#   Úfind_initial_try_blockB  s
   ÿÿz_State.find_initial_try_blockc                 C   rT   r0   ©r  r9   r"   r"   r#   rc   I  s   z_State.has_terminatedc                 C   s   | j | j S r0   )rM   r‹   r9   r"   r"   r#   r‚   L  rF   z_State.get_instc                 C   s   |   ¡ }|j| _d S r0   )r‚   r†   r‹   ©r3   rÌ   r"   r"   r#   rˆ   O  rµ  z_State.advance_pcÚ c                 C   sR   |sdj || j|  ¡ j ¡ t| jƒd}ndj || jt| jƒd}| j |¡ |S )Nz"${prefix}{offset}{opname}.{tempct})rÁ  rÉ   rƒ   Útempctz${prefix}{offset}.{tempct})rÁ  rÉ   rª  )r?   r‹   r‚   rƒ   Úlowerr+  rš  r^   )r3   rÁ  r/  r"   r"   r#   ró   S  s   üýz_State.make_tempc                 K   s0   | j  |j|f¡ |  jtt| ¡ ƒƒO  _dS )zAppend new instN)r›  r^   rÉ   r«   rª   Ú_flatten_inst_regsr$  )r3   rÌ   rž   r"   r"   r#   r^   e  s   z_State.appendc                 C   rÔ   )Nrå   )rô  r9   r"   r"   r#   rƒ  j  rØ   z_State.get_tosc                 C   s   | j |  S )z-Return the k'th element on the stack
        ©ra   )r3   r3  r"   r"   r#   rô  m  ó   z_State.peekc                 C   s   | j  |¡ dS )zPush to stackN)ra   r^   )r3   r&  r"   r"   r#   rð   r  r  z_State.pushc                 C   s
   | j  ¡ S )zPop the stack)ra   rà   r9   r"   r"   r#   rà   v  s   
z
_State.popc                 C   s(   | j }||  |d |d< || < dS )zSwap stack[idx] with the tosrÛ   Nr­  )r3   r  Úsr"   r"   r#   r  z  s   "z_State.swapc                 C   s   d|v sJ ‚| j  |¡ dS )z#Push a block to blockstack
        r|   N)rß   r^   )r3   Úsynblkr"   r"   r#   r½    s   z_State.push_blockc                 C   s$   | j d|… | j |d… | _ }|S )zVReset the stack to the given stack depth.
        Returning the popped items.
        Nr­  )r3   r   Úpoppedr"   r"   r#   r°  …  s    z_State.reset_stackTNc                 C   s>   t |ƒ|t| jƒdœ}|rt| jƒ|d< nd|d< ||d< |S )zMake a new block
        )r˜   ry   r•   r|   Nr—   )r)   r+  ra   )r3   r˜   ry   r°  r—   Údr"   r"   r#   rŽ   Œ  s   ýz_State.make_blockc                 C   s   | j  ¡ }|  |d ¡ |S )z)Pop a block and unwind the stack
        r|   )rß   rà   r°  ©r3   r¦   r"   r"   r#   r—  ›  s   
z_State.pop_blockc                 C   sB   | j  |¡}d|  krt| j ƒk sJ ‚ J ‚| j d|… | _ dS )zcFind *blk* in the blockstack and remove it and all blocks above it
        from the stack.
        r   N)rß   r×  r+  )r3   r²  r  r"   r"   r#   rš   ¢  s   "z_State.pop_block_and_abovec                 C   s0   t |ƒ}t| jƒD ]}|d |kr|  S q	dS )ú1Find the first block that matches *kind*
        r˜   N)r)   r  rß   )r3   r˜   Úbsr"   r"   r#   rŒ   ª  s   ÿÿz_State.get_top_blockc                 G   s6   dd„ |D ƒ}t | jƒD ]}|d |v r|  S qdS )r´  c                 S   s   h | ]}t |ƒ’qS r"   )r)   )rÿ   r˜   r"   r"   r#   Ú	<setcomp>µ  r  z._State.get_top_block_either.<locals>.<setcomp>r˜   N)r  rß   )r3   Úkindsrµ  r"   r"   r#   Úget_top_block_either²  s   ÿÿz_State.get_top_block_eitherc                 C   s   |   d¡duS )zGReturns a boolean indicating if the top-block is a *try* block
        r*   N)rŒ   r9   r"   r"   r#   r   º  s   z_State.has_active_tryc                 C   s   |   |j¡S )zBGet referenced variable name from the instruction's oparg
        )r:  rú   r¨  r"   r"   r#   r)  ¿  r®  z_State.get_varnamer;  c                 C   s   | j j| S )z4Get referenced variable name from the oparg
        )rM   r,  )r3   r;  r"   r"   r#   r:  Ä  r®  z_State.get_varname_by_argc                 C   s
   d| _ dS )z!Mark block as terminated
        TNr§  r9   r"   r"   r#   rœ  É  s   
z_State.terminater   c                 C   s  t | jƒ}|r%d|  krt| jƒksJ ‚ J ‚t| jƒ| }|d|… }|r;d|ks-J ‚t|ƒD ]	}| |  ¡ ¡ q1t | jƒ}tdv r`|r_|d }	|	 d¡pR|	d }
||
kr\| 	¡  nn|sFn	tdv rent
tƒ‚|rp| |¡ | j t|t|ƒ|t|ƒd¡ |  ¡  dS )	zFork the state
        r   Nrw   rÛ   r{   ry   r”   )rP   Ústackr™   rR   )r»   ra   r+  r	  r^   ró   rß   r   Úgetrà   rÓ   rœ  ÚEdger˜  rœ  )r3   rP   r–   r™   r   r¹  rQ   r­  rR   Útopry   r"   r"   r#   r…   Î  s:   
"

ú€

þz_State.forkc                 C   s   | j | jd dS )zSplit the state
        rx   N)r…   r‹   r9   r"   r"   r#   rg   ó  s   z_State.split_new_blockc              	   C   sz   | j rJ ‚g }| jD ]0}t| j|jt|jƒ|jdd„ t|jƒD ƒd}| 	|¡ |j
 ¡ D ]\}}|j| | j |< q-q
|S )z+Get states for each outgoing edges
        c                 S   s   g | ]
\}}t |ƒr|‘qS r"   )r×   )rÿ   r­  r2  r"   r"   r#   r    s    
ÿz._State.get_outgoing_states.<locals>.<listcomp>)rO   rP   rQ   rR   rž  )r³   rœ  rY   rM   rP   r+  r¹  rR   Ú	enumerater^   r¬   r´   )r3   Úretr§   rs   r·   r­  r"   r"   r#   rj   ø  s   


þ
ÿz_State.get_outgoing_statesc                 C   s   dd„ | j D ƒS )z–
        Returns
        -------
        Dict[int, int]
            where keys are the PC
            values are the edge-pushed stack values
        c                 S   s&   i | ]}|j t|j|j d … ƒ“qS r0   )rP   r˜  r¹  r™   )rÿ   r§   r"   r"   r#   Ú
<dictcomp>  s    ÿz2_State.get_outgoing_edgepushed.<locals>.<dictcomp>r£  r9   r"   r"   r#   Úget_outgoing_edgepushed	  s   	ÿz_State.get_outgoing_edgepushed)r"   )r©  )TN)r   r   N),r   r   r   rG   r5   rE   rŸ  r:   rB   rD   ÚpropertyrU   r¢  rh   r¤  r¥  r|   r¦  rc   r‚   rˆ   ró   r^   rƒ  rô  rð   rà   r  r½  r°  rŽ   r—  rš   rŒ   r¸  r   r)  Úintr:  rœ  r…   rg   rj   rÀ  r"   r"   r"   r#   r”  Ù  s\    
#


	


	


%r”  c                       sL   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )Ú
StatePy311c                    s   t ƒ j|i |¤Ž d | _d S r0   )Úsuperr5   Ú	_kw_names©r3   rÞ  rž   ©Ú	__class__r"   r#   r5     s   
zStatePy311.__init__c                 C   s   | j }d | _ |S r0   ©rÅ  )r3   Úoutr"   r"   r#   rà    s   zStatePy311.pop_kw_namesc                 C   s   | j d u sJ ‚|| _ d S r0   rÉ  )r3   r  r"   r"   r#   rè     r6   zStatePy311.set_kw_namesc                 C   s   | j }| | j¡d uS r0   ©rM   rÅ  r‹   ©r3   r0  r"   r"   r#   r‰   $  s   zStatePy311.is_in_exceptionc                 C   s   | j }| | j¡S r0   rË  rÌ  r"   r"   r#   rŠ   (  s   zStatePy311.get_exceptionc                 C   s&   | j D ]}|d tdƒkr dS qd S )Nr˜   r,   T)r™  r)   )r3   Úentr"   r"   r#   r€   ,  s
   
ÿÿzStatePy311.in_withc                 C   s   | j ddS )Nr•  rÀ  r  r9   r"   r"   r#   rñ   1  rF   zStatePy311.make_null)r   r   r   r5   rà  rè  r‰   rŠ   r€   rñ   Ú__classcell__r"   r"   rÇ  r#   rÃ    s    rÃ  c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú
StatePy313c                    s    t ƒ j|i |¤Ž ttƒ| _d S r0   )rÄ  r5   r   rÁ   Ú_make_func_attrsrÆ  rÇ  r"   r#   r5   6  s   zStatePy313.__init__c                 K   s   | j |  |¡ d S r0   )rÐ  rÃ   )r3   Úmake_func_resrž   r"   r"   r#   rV  :  r  z!StatePy313.set_function_attributec                 C   s
   | j | S r0   )rÐ  )r3   rÑ  r"   r"   r#   Úget_function_attributes=  rØ   z"StatePy313.get_function_attributes)r   r   r   r5   rV  rÒ  rÎ  r"   r"   rÇ  r#   rÏ  5  s    rÏ  rõ   r  r'   r»  )rP   r¹  rR   r™   c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚAdaptDFAz<Adapt Flow to the old DFA class expected by Interpreter
    c                 C   s
   || _ d S r0   )Ú_flow)r3   Úflowr"   r"   r#   r5   Q  rØ   zAdaptDFA.__init__c                 C   ó   | j jS r0   )rÔ  rN   r9   r"   r"   r#   ÚinfosT  ó   zAdaptDFA.infosN)r   r   r   rG   r5   rÁ  r×  r"   r"   r"   r#   rÓ  N  s
    rÓ  ÚAdaptBlockInfo©Úinstsr¤  rR   Úactive_try_blockÚoutgoing_edgepushedc                    s`   ‡ fdd„}t dv rtt|ˆ jƒƒ}nt dv rtˆ jƒ}ntt ƒ‚t|ˆ jˆ jˆ  ¡ ˆ  	¡ dS )Nc                    s8   | \}}ˆ j | }|jdkr| ˆ  |d ¡¡ ||fS )NÚMAKE_FUNCTIONr÷   )rM   rƒ   rÃ   rÒ  )Ú	inst_pairrÉ   rY  rÌ   r  r"   r#   Úprocess_function_attributesa  s
   

z6adapt_state_infos.<locals>.process_function_attributesrõ   rK  rÚ  )
r   r˜  Úmapr¢  rÓ   rÙ  r¤  r¥  r¦  rÀ  )rs   rà  rÛ  r"   r  r#   ro   `  s   ûro   c                 c   sD    | D ]}t |tƒr|V  qt |ttfƒrt|ƒD ]}|V  qqdS )z<Flatten an iterable of registers used in an instruction
    N)r=   Ústrr˜  r»   r¬  )r  r&  rV   r"   r"   r#   r¬  v  s   €
€ûr¬  c                   @   sL   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dS )ÚAdaptCFAz<Adapt Flow to the old CFA class expected by Interpreter
    c                 C   s‚   || _ i | _|j ¡ D ]\}}t||ƒ| j|< q| j j ¡ }|j}| ¡ }tƒ }| j 	¡ D ]}| 
|¡r9| |¡ q-|| | _d S r0   )rÔ  Ú_blocksrN   r´   ÚAdaptCFBlockr£   Úbackbonerª   Úblocksr"  Úin_loopsri   Ú	_backbone)r3   rÕ  rÉ   Ú	blockinforæ  r¥   Úinloopblocksr¦   r"   r"   r#   r5   „  s   

€zAdaptCFA.__init__c                 C   rÖ  r0   )rÔ  r£   r9   r"   r"   r#   r¥   —  rØ  zAdaptCFA.graphc                 C   rT   r0   )ré  r9   r"   r"   r#   ræ  ›  ó   zAdaptCFA.backbonec                 C   rT   r0   )rä  r9   r"   r"   r#   rç  Ÿ  rì  zAdaptCFA.blocksc                 c   s"    t | jƒD ]}| j| V  qd S r0   )rn   rç  r³  r"   r"   r#   Úiterliveblocks£  s   €ÿzAdaptCFA.iterliveblocksc                 C   s   | j j ¡  d S r0   )rÔ  r£   rL   r9   r"   r"   r#   rL   §  rˆ  zAdaptCFA.dumpN)r   r   r   rG   r5   rÁ  r¥   ræ  rç  rí  rL   r"   r"   r"   r#   rã    s    


rã  c                   @   s   e Zd Zdd„ ZdS )rå  c                 C   s    || _ tdd„ |jD ƒƒ| _d S )Nc                 s   s    | ]\}}|V  qd S r0   r"   )rÿ   r­  r   r"   r"   r#   rÂ  ®  s   € z(AdaptCFBlock.__init__.<locals>.<genexpr>)rÉ   r˜  rÛ  Úbody)r3   rê  rÉ   r"   r"   r#   r5   ¬  s   zAdaptCFBlock.__init__N)r   r   r   r5   r"   r"   r"   r#   rå  «  s    rå  )1rG   rH  ÚloggingÚcollectionsr   r   r   Ú	functoolsr   Únumba.core.utilsr   r   r   r	   Únumba.core.controlflowr
   r   Únumba.core.irr   Únumba.core.errorsr   Ú	getLoggerr   rJ   r›   rœ   rH   r„   Úenumr   r   rü  rÓ   Úobjectr)   rI   r×   rZ   r”  rÃ  rÏ  rY   r»  rÓ  rÙ  ro   r¬  rã  rå  r"   r"   r"   r#   Ú<module>   sx    
  k           +  >þ*