B
      ›\`r  ã               @   sˆ   d dl mZmZmZ d dlZd dlmZ d dlZd dlZd dlm	Z	 G dd„ de
ƒZG dd„ de
ƒZG d	d
„ d
e
ƒZG dd„ de
ƒZdS )é    )Úprint_functionÚdivisionÚabsolute_importN)Úpprint)Úutilsc               @   sd  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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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(e)j*dLk rZdMdN„ Z+dOdP„ Z,dQdR„ Z-ndSdP„ Z,dTdU„ Z.dVdW„ Z/dXdY„ Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dbdc„ Z5ddde„ Z6e6Z7e6Z8e6Z9e6Z:dfdg„ Z;e;Z<e;Z=e;Z>e;Z?e;Z@e;ZAe;ZBe;ZCe;ZDe;ZEe;ZFe;ZGe;ZHe;ZIe;ZJe;ZKe;ZLe;ZMe;ZNe;ZOe;ZPe;ZQe;ZRe;ZSe;ZTe;ZUe;ZVe;ZWe;ZXdhdi„ ZYdjdk„ ZZdldm„ Z[dndo„ Z\dpdq„ Z]drds„ Z^dtdu„ Z_dvdw„ Z`dxdy„ Zadzd{„ Zbd|d}„ Zcd~d„ Zdd€d„ Zed‚dƒ„ Zfd„d…„ Zgd†d‡„ Zhdˆd‰„ ZieiZjehZkdŠd‹„ ZldŒd„ ZmdŽd„ Zndd‘„ Zod’d“„ Zpd”d•„ Zqd–d—„ Zrd˜d™„ Zsdšd›„ Ztdœd„ ZudždŸ„ Zvd d¡„ Zwd¢d£„ Zxd²d¥d¦„Zyd§d¨„ Zzd©dª„ Z{d«d¬„ Z|d­d®„ Z}d¯d°„ Z~d±S )³ÚDataFlowAnalysisz¥
    Perform stack2reg

    This is necessary to resolve blocks that propagates stack value.
    This would allow the use of `and` and `or` and python2.6 jumps.
    c             C   s   || _ |j| _i | _i | _d S )N)ÚcfaÚbytecodeÚinfosÚedge_process)Úselfr   © r   ú-lib/python3.7/site-packages/numba/dataflow.pyÚ__init__   s    zDataFlowAnalysis.__init__c             C   s*   x$| j  ¡ D ]}|  |¡| j|j< qW d S )N)r   ZiterliveblocksÚrun_on_blockr
   Úoffset)r   Úblkr   r   r   Úrun   s    zDataFlowAnalysis.runc             C   s  g }t ||j|ƒ}g }x| j |¡D ]\}}|j|jkr>q&| j|j }| |¡ |j|jf| jkr~| | j|j|jf ¡ |jd k	st|ƒ‚|j|j	 | }|dk r´t
d| ƒ‚|jd krÆ||_n|j|kràt d| t¡ |jd k	sòt|ƒ‚|jd kr|jd d … |_q&|j|jkr&t d| t¡ q&W |jd krHd|_g |_d|_	x|D ]}||ƒ qTW x$|D ]}	| j|	 }
|  ||
¡ qlW |S )Nr   z%computed negative stack offset for %sz inconsistent stack offset for %sz'inconsistent entry syntax blocks for %s)Ú	BlockInfor   r   Úincoming_blocksr
   Úappendr   Ústack_offsetÚAssertionErrorÚstack_effectÚRuntimeErrorÚwarningsÚwarnÚRuntimeWarningÚsyntax_blocksr	   Údispatch)r   r   r   ÚinfoZedge_callbacksÚibZpopsZ
new_offsetÚcallbackr   Úinstr   r   r   r      sH    








zDataFlowAnalysis.run_on_blockc             C   s"   xt  | j¡D ]}| ¡  qW d S )N)r   Z
itervaluesr
   Údump)r   r   r   r   r   r$   Q   s    zDataFlowAnalysis.dumpc             C   s.   d|j  dd¡ }t| || jƒ}|||ƒ d S )Nzop_%sú+Ú_)ÚopnameÚreplaceÚgetattrÚhandle_unknown_opcode)r   r    r#   ÚfnameÚfnr   r   r   r   U   s    zDataFlowAnalysis.dispatchc             C   s$   d}t | |j|j| jjj¡ƒ‚d S )Nz)Use of unknown opcode {} at line {} of {})ÚNotImplementedErrorÚformatr'   Úlinenor	   Zfunc_idÚfilename)r   r    r#   Úmsgr   r   r   r*   Z   s    z&DataFlowAnalysis.handle_unknown_opcodec                sx   ‡ fdd„t |ƒD ƒ}| ¡  ‡ fdd„t |ƒD ƒ}ˆ j|||d x|D ]}ˆ  |¡ qJW x|D ]}ˆ  |¡ qbW d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )Úpop)Ú.0r&   )r    r   r   ú
<listcomp>`   s    z-DataFlowAnalysis.dup_topx.<locals>.<listcomp>c                s   g | ]}ˆ   ¡ ‘qS r   )Ú	make_temp)r3   r&   )r    r   r   r4   d   s    )ÚorigÚduped)ÚrangeÚreverser   Úpush)r   r    r#   Úcountr6   r7   Úvalr   )r    r   Údup_topx_   s    

zDataFlowAnalysis.dup_topxc             C   s   |j |_ |j |¡ dS )z,
        Add an inner syntax block.
        N)r   r   r   )r   r    Úblockr   r   r   Úadd_syntax_blockk   s    z!DataFlowAnalysis.add_syntax_blockc             C   sB   |j  ¡ }|j|jkst‚x"|j|j |jkr<|jdd qW |S )zM
        Pop the innermost syntax block and revert its stack effect.
        T)Údiscard)r   r2   r   r   r   )r   r    r>   r   r   r   Úpop_syntax_blockr   s
    
z!DataFlowAnalysis.pop_syntax_blockc             C   s6   |j }d|  krdks$n tdƒ‚|  |||¡ d S )Né   é   zInvalid DUP_TOPX count)Úargr   r=   )r   r    r#   r;   r   r   r   Úop_DUP_TOPX|   s    zDataFlowAnalysis.op_DUP_TOPXc             C   s   | j ||dd d S )NrB   )r;   )r=   )r   r    r#   r   r   r   Ú
op_DUP_TOP   s    zDataFlowAnalysis.op_DUP_TOPc             C   s   | j ||dd d S )Né   )r;   )r=   )r   r    r#   r   r   r   Úop_DUP_TOP_TWO„   s    zDataFlowAnalysis.op_DUP_TOP_TWOc             C   s(   |  ¡ }|  ¡ }| |¡ | |¡ d S )N)r2   r:   )r   r    r#   ÚfirstÚsecondr   r   r   Ú
op_ROT_TWO‡   s    
zDataFlowAnalysis.op_ROT_TWOc             C   s:   |  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ d S )N)r2   r:   )r   r    r#   rI   rJ   Úthirdr   r   r   Úop_ROT_THREE   s    

zDataFlowAnalysis.op_ROT_THREEc             C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| |¡ | |¡ | |¡ | |¡ d S )N)r2   r:   )r   r    r#   rI   rJ   rL   Zforthr   r   r   Úop_ROT_FOUR•   s    


zDataFlowAnalysis.op_ROT_FOURc                s^   |j }ˆ  ¡ }‡ fdd„t|ƒD ƒ}ˆ  ¡ }ˆ j||||d xt|ƒD ]}ˆ  |¡ qHW d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r5   )r3   r&   )r    r   r   r4   ¢   s    z7DataFlowAnalysis.op_UNPACK_SEQUENCE.<locals>.<listcomp>)ÚiterableÚstoresÚtupleobj)rD   r2   r8   r5   r   Úreversedr:   )r   r    r#   r;   rO   rP   rQ   Ústr   )r    r   Úop_UNPACK_SEQUENCEŸ   s    z#DataFlowAnalysis.op_UNPACK_SEQUENCEc                sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   ª   s    z3DataFlowAnalysis.op_BUILD_TUPLE.<locals>.<listcomp>)ÚitemsÚres)rD   ÚlistrR   r8   r5   r   r:   )r   r    r#   r;   rU   Útupr   )r    r   Úop_BUILD_TUPLE¨   s
    zDataFlowAnalysis.op_BUILD_TUPLEc                sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   ±   s    z2DataFlowAnalysis.op_BUILD_LIST.<locals>.<listcomp>)rU   rV   )rD   rW   rR   r8   r5   r   r:   )r   r    r#   r;   rU   Zlstr   )r    r   Úop_BUILD_LIST¯   s
    zDataFlowAnalysis.op_BUILD_LISTc             C   s\   |  ¡ }tjd d… dkr$|  ¡ }n|j}| |¡}| ¡ }| ¡ }|j|||||d d S )NrG   )rG   é   )ÚtargetÚvalueÚ	appendvarrV   )r2   ÚsysÚversion_inforD   Úpeekr5   r   )r   r    r#   r]   r\   Úindexr^   rV   r   r   r   Úop_LIST_APPEND¶   s    

zDataFlowAnalysis.op_LIST_APPENDc       	      C   sx   |  ¡ }|j}g }tjdkrNx0t|ƒD ]$}| ¡ | ¡  }}| ||f¡ q&W |j||d d d… ||d | |¡ d S )N)é   rC   éÿÿÿÿ)rU   ÚsizerV   )r5   rD   r_   r`   r8   r2   r   r:   )	r   r    r#   Údctr;   rU   ÚiÚvÚkr   r   r   Úop_BUILD_MAPÂ   s    
zDataFlowAnalysis.op_BUILD_MAPc                sJ   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ j|||d ˆ  |¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   Ñ   s    z1DataFlowAnalysis.op_BUILD_SET.<locals>.<listcomp>)rU   rV   )rD   rW   rR   r8   r5   r   r:   )r   r    r#   r;   rU   rV   r   )r    r   Úop_BUILD_SETÎ   s
    zDataFlowAnalysis.op_BUILD_SETc             C   s   |j dd d S )NT)r@   )r2   )r   r    r#   r   r   r   Ú
op_POP_TOPÖ   s    zDataFlowAnalysis.op_POP_TOPc             C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r\   r]   )r2   r   )r   r    r#   r\   r]   r   r   r   Úop_STORE_ATTRÙ   s    zDataFlowAnalysis.op_STORE_ATTRc             C   s   |  ¡ }|j||d d S )N)r\   )r2   r   )r   r    r#   r\   r   r   r   Úop_DELETE_ATTRÞ   s    zDataFlowAnalysis.op_DELETE_ATTRc             C   s   |  ¡ }|j||d d S )N)r]   )r2   r   )r   r    r#   r]   r   r   r   Úop_STORE_FASTâ   s    zDataFlowAnalysis.op_STORE_FASTc             C   s,   |  ¡ }|  ¡ }|j}|j||||d d S )N)rg   Úkeyr]   )r2   Útosr   )r   r    r#   rq   r]   rg   r   r   r   Úop_STORE_MAPæ   s    zDataFlowAnalysis.op_STORE_MAPc             C   s   |  ¡ }|j||d d S )N)r]   )r2   r   )r   r    r#   r]   r   r   r   Úop_STORE_DEREFì   s    zDataFlowAnalysis.op_STORE_DEREFc             C   s4   | j j|j }| |¡}|j||d | |¡ d S )N)rV   )r	   Úco_varnamesrD   r5   r   r:   )r   r    r#   ÚnamerV   r   r   r   Úop_LOAD_FASTð   s    
zDataFlowAnalysis.op_LOAD_FASTc             C   s&   |  d¡}|j||d | |¡ d S )NZconst)rV   )r5   r   r:   )r   r    r#   rV   r   r   r   Úop_LOAD_CONSTö   s    
zDataFlowAnalysis.op_LOAD_CONSTc             C   s$   |  ¡ }|j||d | |¡ d S )N)rV   )r5   r   r:   )r   r    r#   rV   r   r   r   Úop_LOAD_GLOBALû   s    zDataFlowAnalysis.op_LOAD_GLOBALc             C   s$   |  ¡ }|j||d | |¡ d S )N)rV   )r5   r   r:   )r   r    r#   rV   r   r   r   Úop_LOAD_DEREF   s    zDataFlowAnalysis.op_LOAD_DEREFc             C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)ÚitemrV   )r2   r5   r   r:   )r   r    r#   r{   rV   r   r   r   Úop_LOAD_ATTR  s    zDataFlowAnalysis.op_LOAD_ATTRc             C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)rb   r\   rV   )r2   r5   r   r:   )r   r    r#   rb   r\   rV   r   r   r   Úop_BINARY_SUBSCR  s
    z!DataFlowAnalysis.op_BINARY_SUBSCRc             C   s.   |  ¡ }|  ¡ }|  ¡ }|j||||d d S )N)r\   rb   r]   )r2   r   )r   r    r#   rb   r\   r]   r   r   r   Úop_STORE_SUBSCR  s    z DataFlowAnalysis.op_STORE_SUBSCRc             C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r\   rb   )r2   r   )r   r    r#   rb   r\   r   r   r   Úop_DELETE_SUBSCR  s    z!DataFlowAnalysis.op_DELETE_SUBSCRc             C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)r]   rV   )r2   r5   r   r:   )r   r    r#   r]   rV   r   r   r   Úop_GET_ITER  s    zDataFlowAnalysis.op_GET_ITERc             C   s^   |j }| ¡ }| ¡ }| ¡ }|j|||||d | |¡ dd„ }|| j|jj| ¡ f< d S )N)ÚiteratorÚpairÚindvalÚpredc             S   s   |   ¡  |   ¡  d S )N)r2   )r    r   r   r   Úpop_info+  s    z.DataFlowAnalysis.op_FOR_ITER.<locals>.pop_info)rr   r5   r   r:   r   r>   r   Zget_jump_target)r   r    r#   r   r‚   rƒ   r„   r…   r   r   r   Úop_FOR_ITER#  s    
zDataFlowAnalysis.op_FOR_ITER)rd   r[   c                s¤   |j d@ }|j d? d@ }‡ fdd„‰|r0ˆ  ¡ nd }tt‡fdd„t|ƒD ƒƒƒ}tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }	ˆ  ¡ }
ˆ j||	|||
|d ˆ  |
¡ d S )	Néÿ   é   c                 s   ˆ   ¡ } ˆ   ¡ }|| fS )N)r2   )r<   rq   )r    r   r   Úpop_kws6  s    z3DataFlowAnalysis._op_call_function.<locals>.pop_kwsc                s   g | ]
}ˆ ƒ ‘qS r   r   )r3   r&   )r‰   r   r   r4   <  s    z6DataFlowAnalysis._op_call_function.<locals>.<listcomp>c                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   =  s    )ÚfuncÚargsÚkwsrV   Úvararg)rD   r2   rW   rR   r8   r5   r   r:   )r   r    r#   Ú
has_varargÚnargZnkwsr   rŒ   r‹   rŠ   rV   r   )r    r‰   r   Ú_op_call_function2  s    
z"DataFlowAnalysis._op_call_functionc             C   s   | j ||dd d S )NF)rŽ   )r   )r   r    r#   r   r   r   Úop_CALL_FUNCTIONE  s    z!DataFlowAnalysis.op_CALL_FUNCTIONc             C   s   | j ||dd d S )NT)rŽ   )r   )r   r    r#   r   r   r   Úop_CALL_FUNCTION_VARH  s    z%DataFlowAnalysis.op_CALL_FUNCTION_VARc                sT   |j }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j||||d ˆ  |¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   N  s    z5DataFlowAnalysis.op_CALL_FUNCTION.<locals>.<listcomp>)rŠ   r‹   rV   )rD   rW   rR   r8   r2   r5   r   r:   )r   r    r#   r   r‹   rŠ   rV   r   )r    r   r‘   L  s    c                s^   |j }ˆ  ¡ }tt‡ fdd„t|ƒD ƒƒƒ}ˆ  ¡ }ˆ  ¡ }ˆ j|||||d ˆ  |¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   X  s    z8DataFlowAnalysis.op_CALL_FUNCTION_KW.<locals>.<listcomp>)rŠ   r‹   ÚnamesrV   )rD   r2   rW   rR   r8   r5   r   r:   )r   r    r#   r   r“   r‹   rŠ   rV   r   )r    r   Úop_CALL_FUNCTION_KWU  s    z$DataFlowAnalysis.op_CALL_FUNCTION_KWc             C   sN   |j d@ rd}t|ƒ‚| ¡ }| ¡ }| ¡ }|j||||d | |¡ d S )NrB   z,CALL_FUNCTION_EX with **kwargs not supported)rŠ   r   rV   )rD   r-   r2   r5   r   r:   )r   r    r#   Úerrmsgr   rŠ   rV   r   r   r   Úop_CALL_FUNCTION_EX_  s    
z$DataFlowAnalysis.op_CALL_FUNCTION_EXc                s`   t t‡ fdd„t|jƒD ƒƒƒ}‡ fdd„tt|ƒd ƒD ƒ}ˆ j|||d ˆ  |d ¡ d S )Nc                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r    r   r   r4   k  s    z8DataFlowAnalysis._build_tuple_unpack.<locals>.<listcomp>c                s   g | ]}ˆ   ¡ ‘qS r   )r5   )r3   r&   )r    r   r   r4   l  s    rB   )ÚtuplesÚtempsre   )rW   rR   r8   rD   Úlenr   r:   )r   r    r#   r—   r˜   r   )r    r   Ú_build_tuple_unpacki  s     z$DataFlowAnalysis._build_tuple_unpackc             C   s   |   ||¡ d S )N)rš   )r   r    r#   r   r   r   Úop_BUILD_TUPLE_UNPACK_WITH_CALLq  s    z0DataFlowAnalysis.op_BUILD_TUPLE_UNPACK_WITH_CALLc             C   s   |   ||¡ d S )N)rš   )r   r    r#   r   r   r   Úop_BUILD_TUPLE_UNPACKu  s    z&DataFlowAnalysis.op_BUILD_TUPLE_UNPACKc                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   )r2   )r3   r&   )r    r   r   r4   z  s    z;DataFlowAnalysis.op_BUILD_CONST_KEY_MAP.<locals>.<listcomp>c                s   g | ]}ˆ   ¡ ‘qS r   )r5   )r3   r&   )r    r   r   r4   {  s    )ÚkeysÚkeytmpsÚvaluesrV   )r2   rW   rR   r8   rD   r5   r   r:   )r   r    r#   r   Zvalsrž   rV   r   )r    r   Úop_BUILD_CONST_KEY_MAPx  s     z'DataFlowAnalysis.op_BUILD_CONST_KEY_MAPc             C   s:   t  dt¡ | ¡ }| ¡ }| ¡ }|j||||d d S )NzIPython2 style print partially supported.  Please use Python3 style print.)r{   ÚprintvarrV   )r   r   r   r2   r5   r   )r   r    r#   r{   r¡   rV   r   r   r   Úop_PRINT_ITEM€  s    zDataFlowAnalysis.op_PRINT_ITEMc             C   s$   |  ¡ }|  ¡ }|j|||d d S )N)r¡   rV   )r5   r   )r   r    r#   r¡   rV   r   r   r   Úop_PRINT_NEWLINEˆ  s    z!DataFlowAnalysis.op_PRINT_NEWLINEc             C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)r]   rV   )r2   r5   r   r:   )r   r    r#   r<   rV   r   r   r   Ú_unaryop  s    zDataFlowAnalysis._unaryopc             C   s8   |  ¡ }|  ¡ }| ¡ }|j||||d | |¡ d S )N)ÚlhsÚrhsrV   )r2   r5   r   r:   )r   r    r#   r¦   r¥   rV   r   r   r   Ú	_binaryop˜  s
    zDataFlowAnalysis._binaryopc             C   sL   |  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j||||||d | |¡ dS )z
        TOS = TOS[:]
        )ÚbaserV   ÚslicevarÚindexvarÚnonevarN)r2   r5   r   r:   )r   r    r#   rr   rV   r©   rª   r«   r   r   r   Ú
op_SLICE_0Á  s    
zDataFlowAnalysis.op_SLICE_0c       	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[TOS:]
        )r¨   ÚstartrV   r©   rª   r«   N)r2   r5   r   r:   )	r   r    r#   rr   Útos1rV   r©   rª   r«   r   r   r   Ú
op_SLICE_1Î  s    
zDataFlowAnalysis.op_SLICE_1c       	   	   C   sV   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z"
        TOS = TOS1[:TOS]
        )r¨   ÚstoprV   r©   rª   r«   N)r2   r5   r   r:   )	r   r    r#   rr   r®   rV   r©   rª   r«   r   r   r   Ú
op_SLICE_2Ü  s    
zDataFlowAnalysis.op_SLICE_2c       	   	   C   sV   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d | |¡ dS )z&
        TOS = TOS2[TOS1:TOS]
        )r¨   r­   r°   rV   r©   rª   N)r2   r5   r   r:   )	r   r    r#   rr   r®   Útos2rV   r©   rª   r   r   r   Ú
op_SLICE_3ê  s    
zDataFlowAnalysis.op_SLICE_3c             C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z
        TOS[:] = TOS1
        )r¨   r]   r©   rª   r«   N)r2   r5   r   )r   r    r#   rr   r]   r©   rª   r«   r   r   r   Úop_STORE_SLICE_0ø  s    z!DataFlowAnalysis.op_STORE_SLICE_0c       	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[TOS:] = TOS2
        )r¨   r­   r©   r]   rª   r«   N)r2   r5   r   )	r   r    r#   rr   r®   r]   r©   rª   r«   r   r   r   Úop_STORE_SLICE_1  s    z!DataFlowAnalysis.op_STORE_SLICE_1c       	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j|||||||d dS )z#
        TOS1[:TOS] = TOS2
        )r¨   r°   r]   r©   rª   r«   N)r2   r5   r   )	r   r    r#   rr   r®   r]   r©   rª   r«   r   r   r   Úop_STORE_SLICE_2  s    z!DataFlowAnalysis.op_STORE_SLICE_2c       	   	   C   sL   |  ¡ }|  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j|||||||d dS )z'
        TOS2[TOS1:TOS] = TOS3
        )r¨   r­   r°   r]   r©   rª   N)r2   r5   r   )	r   r    r#   rr   r®   r²   r]   r©   rª   r   r   r   Úop_STORE_SLICE_3  s    z!DataFlowAnalysis.op_STORE_SLICE_3c             C   s8   |  ¡ }| ¡ }| ¡ }| ¡ }|j|||||d dS )z
        del TOS[:]
        )r¨   r©   rª   r«   N)r2   r5   r   )r   r    r#   rr   r©   rª   r«   r   r   r   Úop_DELETE_SLICE_0+  s    
z"DataFlowAnalysis.op_DELETE_SLICE_0c             C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[TOS:]
        )r¨   r­   r©   rª   r«   N)r2   r5   r   )r   r    r#   rr   r®   r©   rª   r«   r   r   r   Úop_DELETE_SLICE_16  s    z"DataFlowAnalysis.op_DELETE_SLICE_1c             C   sB   |  ¡ }|  ¡ }| ¡ }| ¡ }| ¡ }|j||||||d dS )z 
        del TOS1[:TOS]
        )r¨   r°   r©   rª   r«   N)r2   r5   r   )r   r    r#   rr   r®   r©   rª   r«   r   r   r   Úop_DELETE_SLICE_2B  s    z"DataFlowAnalysis.op_DELETE_SLICE_2c             C   sB   |  ¡ }|  ¡ }|  ¡ }| ¡ }| ¡ }|j||||||d dS )z$
        del TOS2[TOS1:TOS]
        )r¨   r­   r°   r©   rª   N)r2   r5   r   )r   r    r#   rr   r®   r²   r©   rª   r   r   r   Úop_DELETE_SLICE_3N  s    z"DataFlowAnalysis.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)
        rG   Nrd   Zunreachable)r­   r°   ÚsteprV   r©   )rD   r2   Ú	Exceptionr5   r   r:   )r   r    r#   Zargcrr   r®   r­   r°   r¼   r²   r©   rV   r   r   r   Úop_BUILD_SLICEZ  s(    zDataFlowAnalysis.op_BUILD_SLICEc             C   s    |  ¡ }|j||d ||_d S )N)r„   )r2   r   Ú
terminator)r   r    r#   r„   r   r   r   Úop_POP_JUMP_IF_TRUEt  s    z$DataFlowAnalysis.op_POP_JUMP_IF_TRUEc             C   s    |  ¡ }|j||d ||_d S )N)r„   )r2   r   r¿   )r   r    r#   r„   r   r   r   Úop_POP_JUMP_IF_FALSEy  s    z%DataFlowAnalysis.op_POP_JUMP_IF_FALSEc             C   s   |j }|j||d ||_d S )N)r„   )rr   r   r¿   )r   r    r#   r„   r   r   r   Úop_JUMP_IF_TRUE~  s    z DataFlowAnalysis.op_JUMP_IF_TRUEc             C   s   |j }|j||d ||_d S )N)r„   )rr   r   r¿   )r   r    r#   r„   r   r   r   Úop_JUMP_IF_FALSEƒ  s    z!DataFlowAnalysis.op_JUMP_IF_FALSEc             C   s   |  |¡ ||_d S )N)r   r¿   )r   r    r#   r   r   r   Úop_JUMP_ABSOLUTE‹  s    
z!DataFlowAnalysis.op_JUMP_ABSOLUTEc             C   s   |  |¡ ||_d S )N)r   r¿   )r   r    r#   r   r   r   Úop_JUMP_FORWARD  s    
z DataFlowAnalysis.op_JUMP_FORWARDc             C   s   |   |¡ | |¡ ||_d S )N)rA   r   r¿   )r   r    r#   r   r   r   Úop_BREAK_LOOP“  s    

zDataFlowAnalysis.op_BREAK_LOOPc             C   s"   |j || ¡ | ¡ d ||_d S )N)ZretvalZcastval)r   r2   r5   r¿   )r   r    r#   r   r   r   Úop_RETURN_VALUE˜  s    z DataFlowAnalysis.op_RETURN_VALUEc             C   s.   |  ¡ }| ¡ }|j|||d | |¡ d S )N)r]   rV   )r2   r5   r   r:   )r   r    r#   r<   rV   r   r   r   Úop_YIELD_VALUEœ  s    zDataFlowAnalysis.op_YIELD_VALUEc             C   s   |   |tƒ ¡ | |¡ d S )N)r?   Ú	LoopBlockr   )r   r    r#   r   r   r   Úop_SETUP_LOOP¢  s    zDataFlowAnalysis.op_SETUP_LOOPc             C   s:   |  ¡ }|  |tƒ ¡ | ¡ }| |¡ |j||d d S )N)Úcontextmanager)r2   r?   Ú	WithBlockr5   r:   r   )r   r    r#   ÚcmÚyieldedr   r   r   Úop_SETUP_WITH¦  s
    
zDataFlowAnalysis.op_SETUP_WITHc             C   s   |  ¡  | |¡ dS )z'
        Note: py2 only opcode
        N)r2   r   )r   r    r#   r   r   r   Úop_WITH_CLEANUP­  s    z DataFlowAnalysis.op_WITH_CLEANUPc             C   s   |  ¡  | |¡ d S )N)r2   r   )r   r    r#   r   r   r   Úop_WITH_CLEANUP_STARTµ  s    z&DataFlowAnalysis.op_WITH_CLEANUP_STARTc             C   s   |  |¡ d S )N)r   )r   r    r#   r   r   r   Úop_WITH_CLEANUP_FINISHº  s    z'DataFlowAnalysis.op_WITH_CLEANUP_FINISHc             C   s   |  |¡ d S )N)r   )r   r    r#   r   r   r   Úop_END_FINALLY½  s    zDataFlowAnalysis.op_END_FINALLYc             C   s   |   |¡}| |¡ d S )N)rA   r   )r   r    r#   r>   r   r   r   Úop_POP_BLOCKÀ  s    
zDataFlowAnalysis.op_POP_BLOCKc             C   s>   |j dkrd }n|j dkr$| ¡ }ntdƒ‚|j||d d S )Nr   rB   z)Multiple argument raise is not supported.)Úexc)rD   r2   Ú
ValueErrorr   )r   r    r#   rÕ   r   r   r   Úop_RAISE_VARARGSÄ  s    


z!DataFlowAnalysis.op_RAISE_VARARGSFc          
   C   sÚ  t jdkrd }n| ¡ }| ¡ }d  } } }}	t jdk r„|rF| ¡ }|j}
|
dkr€g }	xt|
ƒD ]}|	 | ¡ ¡ qbW t|	ƒ}	n&t jdkrZt jdk rZ|jd@ }
|jd? d@ }|jd? d@ }|rÎ| ¡ }|dkrÞ| ¡ }|dkr$g }x.t|ƒD ]"}| ¡ }| ¡ }| ||f¡ qöW t|ƒ}|
rªg }	x t|
ƒD ]}|	 | ¡ ¡ q8W t|	ƒ}	nP|jd@ rn| ¡ }|jd	@ r‚| ¡ }|jd
@ r–| ¡ }|jd@ rª| ¡ }	| ¡ }|j|||||||	|d | |¡ d S )N)rG   é   )rd   r   r   )rd   r[   r‡   rˆ   é   iÿ  é   rG   rB   )rv   ÚcodeÚclosureÚannotationsÚ
kwdefaultsÚdefaultsrV   )	r   Ú	PYVERSIONr2   rD   r8   r   Útupler5   r:   )r   r    r#   ÚMAKE_CLOSURErv   rÛ   rÜ   rÝ   rÞ   rß   Znum_posdefaultsrh   Znum_kwdefaultsZnum_annotationsri   rj   rV   r   r   r   Úop_MAKE_FUNCTIONÍ  s\    




z!DataFlowAnalysis.op_MAKE_FUNCTIONc             C   s   | j ||dd d S )NT)râ   )rã   )r   r    r#   r   r   r   Úop_MAKE_CLOSUREÿ  s    z DataFlowAnalysis.op_MAKE_CLOSUREc             C   s$   |  ¡ }|j||d | |¡ d S )N)rV   )r5   r   r:   )r   r    r#   rV   r   r   r   Úop_LOAD_CLOSURE  s    z DataFlowAnalysis.op_LOAD_CLOSUREc             O   s   | j ||Ž d S )N)r|   )r   r‹   rŒ   r   r   r   Úop_LOAD_METHOD
  s    zDataFlowAnalysis.op_LOAD_METHODc             O   s   | j ||Ž d S )N)r‘   )r   r‹   rŒ   r   r   r   Úop_CALL_METHOD  s    zDataFlowAnalysis.op_CALL_METHODc             C   s   d S )Nr   )r   r    r#   r   r   r   Ú_ignored  s    zDataFlowAnalysis._ignoredN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r$   r   r*   r=   r?   rA   rE   rF   rH   rK   rM   rN   rT   rY   rZ   rc   rk   rl   rm   rn   ro   rp   rs   rt   rw   rx   ry   rz   r|   r}   r~   r   r€   r†   r   rà   r   r‘   r’   r”   r–   rš   r›   rœ   r    r¢   r£   r¤   Zop_UNARY_NEGATIVEZop_UNARY_POSITIVEZop_UNARY_NOTZop_UNARY_INVERTr§   Zop_COMPARE_OPZop_INPLACE_ADDZop_INPLACE_SUBTRACTZop_INPLACE_MULTIPLYZop_INPLACE_DIVIDEZop_INPLACE_TRUE_DIVIDEZop_INPLACE_FLOOR_DIVIDEZop_INPLACE_MODULOZop_INPLACE_POWERZop_INPLACE_MATRIX_MULTIPLYZop_INPLACE_LSHIFTZop_INPLACE_RSHIFTZop_INPLACE_ANDZop_INPLACE_ORZop_INPLACE_XORZop_BINARY_ADDZop_BINARY_SUBTRACTZop_BINARY_MULTIPLYZop_BINARY_DIVIDEZop_BINARY_TRUE_DIVIDEZop_BINARY_FLOOR_DIVIDEZop_BINARY_MODULOZop_BINARY_POWERZop_BINARY_MATRIX_MULTIPLYZop_BINARY_LSHIFTZop_BINARY_RSHIFTZop_BINARY_ANDZop_BINARY_ORZop_BINARY_XORr¬   r¯   r±   r³   r´   rµ   r¶   r·   r¸   r¹   rº   r»   r¾   rÀ   rÁ   rÂ   rÃ   Zop_JUMP_IF_FALSE_OR_POPZop_JUMP_IF_TRUE_OR_POPrÄ   rÅ   rÆ   rÇ   rÈ   rÊ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   r×   rã   rä   rå   ræ   rç   rè   r   r   r   r   r      sø   3

	
	

	
2r   c               @   s   e Zd ZdZdd„ ZdS )rÉ   )r   c             C   s
   d | _ d S )N)r   )r   r   r   r   r     s    zLoopBlock.__init__N)ré   rê   rë   Ú	__slots__r   r   r   r   r   rÉ     s   rÉ   c               @   s   e Zd ZdZdd„ ZdS )rÌ   )r   c             C   s
   d | _ d S )N)r   )r   r   r   r   r     s    zWithBlock.__init__N)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d„ Zddd	„Zd
d„ Zddd„Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZdd„ Zedd„ ƒZejdd„ ƒZdS )r   c             C   sF   || _ || _|| _g | _i | _g | _d| _d | _d | _d| _	d | _
d S )Nr   )r>   r   r   ÚstackÚoutgoing_phisÚinstsÚtempctÚ_termr   r   r   )r   r>   r   r   r   r   r   r   #  s    zBlockInfo.__init__c             C   s   d| j j| jf S )Nz<%s at offset %d>)Ú	__class__ré   r   )r   r   r   r   Ú__repr__4  s    zBlockInfo.__repr__c             C   s:   t d| jdƒ t ddd t| jƒ t| jƒ t dƒ d S )Nr   Ú{z	  stack: Ú )ÚendÚ})Úprintr   r   rî   rð   )r   r   r   r   r$   7  s
    

zBlockInfo.dumprö   c             C   s$   |  j d7  _ d|| j| j f }|S )NrB   z$%s%s.%s)rñ   r   )r   Úprefixrv   r   r   r   r5   >  s    zBlockInfo.make_tempc             C   s   |  j d7  _ | j |¡ d S )NrB   )r   rî   r   )r   r<   r   r   r   r:   C  s    zBlockInfo.pushFc             C   s>   | j s"|  jd8  _|s:|  ¡ S n|  jd8  _| j  ¡ S dS )zþ
        Pop a variable from the stack, or request it from incoming blocks if
        the stack is empty.
        If *discard* is true, the variable isn't meant to be used anymore,
        which allows reducing the number of temporaries created.
        rB   N)rî   r   Úmake_incomingr   r2   )r   r@   r   r   r   r2   G  s    
zBlockInfo.popc                sN   |}‡ fdd„t |ƒD ƒ}|d }x&t |d ddƒD ]}ˆ  || ¡ q4W |S )zr
        Return the k'th element back from the top of the stack.
        peek(1) is the top of the stack.
        c                s   g | ]}ˆ   ¡ ‘qS r   )r2   )r3   r&   )r   r   r   r4   \  s    z"BlockInfo.peek.<locals>.<listcomp>re   rB   )r8   r:   )r   rj   Znum_popsZtop_kÚrrh   r   )r   r   ra   V  s    zBlockInfo.peekc             C   sB   | j s
t‚|  d¡}x(| j D ]}| j| j }| | ||¡ qW |S )z¶
        Create an incoming variable (due to not enough values being
        available on our stack) and request its assignment from our
        incoming blocks' own stacks.
        Zphi)r   r   r5   r   r   Úrequest_outgoing)r   Zretr!   Ústack_indexr   r   r   rû   b  s    

zBlockInfo.make_incomingc             C   s`   || j krdS || jk rB| js"t‚x8| jD ]}| | ||¡ q*W n| j|| j  }|| j |< dS )zŒ
        Request the assignment of the next available stack variable
        for block *outgoing_block* with target name *phiname*.
        N)rï   r   r   r   rý   rî   )r   Zoutgoing_blockZphinamerþ   r!   Zvarnamer   r   r   rý   o  s    


zBlockInfo.request_outgoingc             C   s   |   ¡ }|  |¡ |S )N)r2   r:   )r   rü   r   r   r   rr   €  s    
zBlockInfo.tosc             K   s   | j  |j|f¡ d S )N)rð   r   r   )r   r#   rŒ   r   r   r   r   †  s    zBlockInfo.appendc             C   s   | j d kst‚| j S )N)rò   r   )r   r   r   r   r¿   ‰  s    zBlockInfo.terminatorc             C   s
   || _ d S )N)rò   )r   r#   r   r   r   r¿   Ž  s    N)rö   )F)ré   rê   rë   r   rô   r$   r5   r:   r2   ra   rû   rý   Úpropertyrr   r   r¿   Úsetterr   r   r   r   r   "  s   

r   )Z
__future__r   r   r   Úcollectionsr   r_   r   Znumbar   Úobjectr   rÉ   rÌ   r   r   r   r   r   Ú<module>   s         