o
    i                  	   @   s0  d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZmZmZmZmZm Z  d dl!m"Z"m#Z#m$Z$ ed	d
dZ%edddZ&G dd
 d
ej'eeeee f  Z(dd Z)eG dd dZ*G dd dZ+G dd dej,Z-dS )    N)defaultdict)	dataclass)AnyDict	GeneratorIterableIteratorListOptionalSetSupportsIndexTupleTypeVarUnionoverload)ConcreteInstr)CompilerFlags)UNSETInstrLabel	SetLinenoTryBeginTryEnd)PY310PY311PY313T
BasicBlock)boundUControlFlowGraphc                	       s   e Zd Z	ddeeeeeee	f   ddf fddZ
deeeeee	f  fddZededeeeee	f fd	d
Zedededefdd
Z fdd
Zdee fddZdedef fddZdedefddZded  fddZdefddZ  ZS )r   Ninstructionsreturnc                    s   d | _ |rt | d S d S N)
next_blocksuper__init__)selfr!   	__class__ @/home/ubuntu/.local/lib/python3.10/site-packages/bytecode/cfg.pyr&   !   s   zBasicBlock.__init__c                 #   s    d}|t  k rs | }|d7 }t|ttttfs"td|jj t|trT|	 rT|t  k rEt
 fddt|t  D rEtdt|jtsTtdt|jjt|trht|jtshtdt|jj|V  |t  k s	d S d S )	Nr      zJBasicBlock must only contain SetLineno and Instr objects, but %s was foundc                 3   s    | ]
}t  | tV  qd S r#   )
isinstancer   .0ir'   r*   r+   	<genexpr>9   s    
z&BasicBlock.__iter__.<locals>.<genexpr>z8Only the last instruction of a basic block can be a jumpz%Jump target must a BasicBlock, got %sz)TryBegin target must a BasicBlock, got %s)lenr-   r   r   r   r   
ValueErrorr)   __name__has_jumpanyrangeargr   typetarget)r'   indexinstrr*   r1   r+   __iter__,   s>   


zBasicBlock.__iter__r<   c                 C      d S r#   r*   r'   r<   r*   r*   r+   __getitem__O   s   zBasicBlock.__getitem__r'   c                 C   r?   r#   r*   r@   r*   r*   r+   rA   T      c                    s.   t  |}t|trt| |}| j|_|S r#   )r%   rA   r-   slicer:   r$   )r'   r<   valuer(   r*   r+   rA   W   s
   
c                 C   s$   t | D ]}t|tr|  S qd S r#   )reversedr-   r   )r'   r=   r*   r*   r+   #get_last_non_artificial_instruction_   s
   
z.BasicBlock.get_last_non_artificial_instructionc                    s   t | t  }| j|_|S r#   )r:   r%   copyr$   )r'   newr(   r*   r+   rG   f   s   zBasicBlock.copyfirst_linenoc                 C   s   g }d}|}t | D ]5\}}t|tr|j }}|| q
t|ttfr&q
|dur.||_q
|jtu r7||_q
|jdur?|j}q
t|D ]}| |= qD|S )zFCheck that all the element of the list are valid and remove SetLineno.N)		enumerater-   r   linenoappendr   r   r   rE   )r'   rI   
lineno_pos
set_linenocurrent_linenoposr=   r0   r*   r*   r+   legalizek   s(   




zBasicBlock.legalizec                 C   s<   | sd S |   }|d u s| sd S |j}t|tsJ |S r#   )rF   r6   r9   r-   r   )r'   
last_instrtarget_blockr*   r*   r+   get_jump   s   zBasicBlock.get_jumpc                 C   sF   |d t | k r!t| |d   }tr|S |d7 }|d t | k sd S Nr,   )r3   r-   r   )r'   r<   br*   r*   r+   get_trailing_try_end   s   zBasicBlock.get_trailing_try_endr#   )r5   
__module____qualname__r
   r   r   r   r   r   r   r&   r   r>   r   r   rA   r   rC   rF   rG   intrQ   rT   rW   __classcell__r*   r*   r(   r+   r       s0    #c                 C   sB   || 7 }|dk rd}t |||7 }t||}t||}|||fS )Nr   z.Failed to compute stacksize, got negative size)RuntimeErrormaxmin)	pre_delta
post_deltasizemaxsizeminsizemsgr*   r*   r+   _update_size   s   


re   c                   @   sr   e Zd ZU dZeed< ee ed< eeee	ee
e f  f ed< ee ed< eeef ed< eeef ed< dS )	_StackSizeComputationStoragezMCommon storage shared by the computers involved in computing CFG stack usage.check_pre_and_postseen_blocksblocks_startsizes
try_beginsexception_block_startsizeexception_block_maxsizeN)r5   rX   rY   __doc__bool__annotations__r   rZ   r   r   r
   r	   r   r*   r*   r*   r+   rf      s   
  rf   c                   @   s  e Zd ZU dZeed< eed< eed< eed< eed< ee	 ed< ee
 ed< dedededededee	 dee
 d	d
fddZd	eed ef ed
f fddZee
 ed< deded	d
fddZdede	d	eed ef ed
f fddZdedeeee	 f d	e	fddZd
S )_StackSizeComputerz4Helper computing the stack usage for a single block.commonblockra   rb   rc   exception_handlerpending_try_beginr"   Nc                 C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S r#   )rq   rr   ra   rb   rc   rs   rt   _current_try_begin)r'   rq   rr   ra   rb   rc   rs   rt   r*   r*   r+   r&      s   

z_StackSizeComputer.__init__c           
      c   s   t | j}| j| jf}t | j| jjv s| ||s| jV  | jj| | jj	| | | jdur=| 
dd| j  t| jD ]"\}}t|trMqBt|trh| jdu sYJ | jj| || _| j| _qBt|tr|j| jurtqBt|jjts}J | |jj|jjE dH  d| _qB| r| jjr|jddn|jdddf}t
g || j| j| jR  \}}}t|jtsJ t| j|j|||d| r| j |rdn| jV }t!| j|| _|" r| j | }	r|	j| ju rt|	jjtsJ | |	jj|	jjE dH  | jj#t | j | jV  | jjr%|jddn|jdddf}| j
|  | re| j | }	rWt|	jjtsJJ | |	jj|	jjE dH  | jj#t | j | jV  qB| jj$r~t| j| jj$| j| j| jd| jV | _| jj#t | j | jV  dS )z;Iterate over the block instructions to compute stack usage.Nr   r,   T)jumpF)%idrr   ra   rs   rq   rh   "_is_stacksize_computation_relevantrb   addri   re   rJ   r-   r   r   ru   rj   rL   rc   r   entryr;   r   &_compute_exception_handler_stack_usage
push_lastir6   rg   pre_and_post_stack_effectstack_effectr9   rp   is_finalrW   r]   is_uncond_jumpremover$   )
r'   block_idfingerprintr0   r=   effect
taken_sizerb   rc   ter*   r*   r+   run   s   





	









z_StackSizeComputer.runru   r_   r`   c                 C   s2   t ||| j| j| j\}}}|| _|| _|| _d S r#   )re   ra   rb   rc   )r'   r_   r`   ra   rb   rc   r*   r*   r+   re     s   

z_StackSizeComputer._update_sizer|   c                 c   s\    t |}| j| jj| k r,t| j|| j| j| j|d V }| j| jj|< || jj|< d S d S r#   )rw   rc   rq   rk   rp   rb   rl   )r'   rr   r|   b_id
block_sizer*   r*   r+   r{     s   z9_StackSizeComputer._compute_exception_handler_stack_usager   r   c                 C   sB   t r
|| jj| vS | jj|  }r|d tdd |D kS dS )Nr   c                 s   s    | ]}|d  V  qdS )r   Nr*   )r/   fr*   r*   r+   r2     s    zH_StackSizeComputer._is_stacksize_computation_relevant.<locals>.<genexpr>T)r   rq   ri   r]   )r'   r   r   sizesr*   r*   r+   rx     s
   z5_StackSizeComputer._is_stacksize_computation_relevant)r5   rX   rY   rm   rf   ro   r   rZ   r
   rn   r   r&   r   r   r   re   r{   r   rx   r*   r*   r*   r+   rp      sX   
 	
  ,
rp   c                
       s  e Zd Zd4 fddZd4ddZdedefdd	Zdeddfd
dZ	d5de	e
eeef   defddZddddededefddZdefddZdefddZdedef fddZdefddZdee fddZed eeef defd!d"Zed#ed edefd$d"Zd%d" Zd eeef ddfd&d'Zded edefd(d)Zdee fd*d+Z e!d,e"j#dd fd-d.Z$de"j#fd/d0Z%	d5dddd1e	e dedede&j'fd2d3Z(  Z)S )6r    r"   Nc                    s(   t    g | _i | _g | _|   d S r#   )r%   r&   _blocks_block_indexargnames	add_blockr1   r(   r*   r+   r&     s
   
zControlFlowGraph.__init__c                 C   s    | j }| jD ]}||}qdS )zLegalize all blocks.N)rI   r   rQ   )r'   rO   rr   r*   r*   r+   rQ     s   
zControlFlowGraph.legalizerr   c                 C   s0   z| j t| W S  ty   td| dw )Nz
the block z is not part of this bytecode)r   rw   KeyErrorr4   )r'   rr   r*   r*   r+   get_block_index  s
   z ControlFlowGraph.get_block_indexc                 C   s(   t | j}| j| || jt|< d S r#   )r3   r   rL   r   rw   )r'   rr   block_indexr*   r*   r+   
_add_block  s   
zControlFlowGraph._add_blockr!   c                 C   s   t |}| | |S r#   )r   r   )r'   r!   rr   r*   r*   r+   r     s   
zControlFlowGraph.add_blockTrg   compute_exception_stack_depthsrg   r   c             	   C   s  | sdS t |t dd | D tdd | D dtdd | D dg d	}d}ts:tr:| jtjtj	B tj
B @ r:d
}t|| d |dddd }g }|j}|j}d}	z!	 |d}	t|	trk| }||	}	t|	ts^|| |	 }qT ty   |	durt|	tsJ t|	g|j R  }	| D ]}
|jt|
 s|
D ]}t|tr|jtu rd|_qq|r|jD ]}|jt|j }|dksJ ||_q|	 Y S w )zCompute the stack size by iterating through the blocks

        The implementation make use of a generator function to avoid issue with
        deeply nested recursions.

        r   c                 S   s   i | ]}t |t qS r*   )rw   setr/   rV   r*   r*   r+   
<dictcomp>  s    z6ControlFlowGraph.compute_stacksize.<locals>.<dictcomp>c                 S      g | ]}t |qS r*   rw   r   r*   r*   r+   
<listcomp>      z6ControlFlowGraph.compute_stacksize.<locals>.<listcomp>i   c                 S   r   r*   r   r   r*   r*   r+   r     r   i )rh   ri   rk   rl   rj   r,   N)rf   r   dictfromkeysr   r   flagsr   	GENERATOR	COROUTINEASYNC_GENERATORrp   r   rL   popsendr-   rZ   
IndexErrorr]   rl   valuesri   rw   r   stack_depthr   rj   rk   r;   )r'   rg   r   rq   initial_stack_sizecoro
coroutinespush_coroutinepop_coroutineargsrr   r0   tbra   r*   r*   r+   compute_stacksize  sv   





z"ControlFlowGraph.compute_stacksizec                 C   s   dt | j S )Nz<ControlFlowGraph block#=%s>r3   r   r1   r*   r*   r+   __repr__T  s   zControlFlowGraph.__repr__c           	   	   C   s(  g }i }| D ]}t |D ]\}}t|tr6t|jtsJ ||t| |d|| | |j|j	f qt|t
rF|d||j f qt|tr| sS| r| rs|j}t|tsaJ t|j| ||jd}|| n|| || }r|d||j f  n|| qq|S )Nr   r   )location)rJ   r-   r   r;   r   
setdefaultr3   rL   r   r|   r   rz   r   r6   r   r9   r   namer   rW   )	r'   r!   rj   rr   r<   r=   rS   c_instrr   r*   r*   r+   _get_instructionsY  sJ   




z"ControlFlowGraph._get_instructionsotherc                    sL   t | t |ur
dS | j|jkrdS |  }| }||kr dS t |S )NF)r:   r   r   r%   __eq__)r'   r   instrs1instrs2r(   r*   r+   r     s   zControlFlowGraph.__eq__c                 C   
   t | jS r#   r   r1   r*   r*   r+   __len__     
zControlFlowGraph.__len__c                 C   r   r#   )iterr   r1   r*   r*   r+   r>     r   zControlFlowGraph.__iter__r<   c                 C   r?   r#   r*   r@   r*   r*   r+   rA     rB   zControlFlowGraph.__getitem__r'   c                 C   r?   r#   r*   r@   r*   r*   r+   rA     rB   c                 C   s   t |tr
| |}| j| S r#   )r-   r   r   r   r@   r*   r*   r+   rA     s   


c                 C   sj   t |tr
| |}| j| }| j|= | jt|= t|t| D ]}| j| }| jt|  d8  < q d S rU   )r-   r   r   r   r   rw   r8   r3   )r'   r<   rr   r0   r*   r*   r+   __delitem__  s   



zControlFlowGraph.__delitem__c                 C   s   t |ts	td| |}|dk rtd| j| }|dkr!|S |t|kr+td||d  }|sA|d t| k rA| |d  S ||d = t|}|j|_||_| |d d  D ]}| jt	|  d7  < qY| j
|d | |d | jt	|< |S )Nzexpected blockr   zindex must be positivezindex out of the blockr,   )r-   r   	TypeErrorr   r4   r   r3   r$   r   rw   insert)r'   rr   r<   r   r!   block2r*   r*   r+   split_block  s.   



zControlFlowGraph.split_blockc                    s   | sg S t   | d g}|r_| }t| v rq t| d}|D ]-}t|tr>t|jtr7||j |	 r=d}q$t|t
rQt|jtsKJ ||j q$|r]|jr]||j |s fdd| D S )Nr   TFc                    s   g | ]
}t | vr|qS r*   r   r   seen_block_idsr*   r+   r     s    z4ControlFlowGraph.get_dead_blocks.<locals>.<listcomp>)r   r   rw   ry   r-   r   r9   r   rL   r   r   r;   r$   )r'   stackrr   fall_throughr0   r*   r   r+   get_dead_blocks  s2   



z ControlFlowGraph.get_dead_blocksbytecodec           #      C   s  i }g }i }t | D ]B\}}t|tr|||< q
t|tr,t|jtr,|||jf q
t|trBt|jts9J |||jf q
t|trL|||j	< q
i }|D ]\}}|| }|||< qQt
 }	|	|  t| j|	_|	d }
i }g }i }tt}d }d}d }t | D ]Q\}}d }||v r|| }|dkr|
  }r|
}|	 }| s||
_|}
|d ur|
||< n*|
 r|d ur| r|
}|	 }
n| rt|jtsJ |
}|	 }||
_|}
|d ur|}d}|d uri|d uri| rt|tr|sJ | }|| d |_	|| d }q|d uri| rD||v rD||j || krDt|jts6J ||j t|| d  | ri|ri|t|| d  | }|
| || | d}d }t|trrqt|tttfr| }t|tr|d u sJ |}d}t|tsJ |g||< n1t|trt|tsJ ||j	 d |_	d }d}n|}t|jtrt|tsJ || |}|
| q| D ]L\}}|| }
t }d}|t|
k r|
| }|d7 }t|tr||j	 nn|t|
k s|D ]}|j	|vr$|| d| ||j	 qq|D ]}|j}t|ts7J || |_q*| D ]\} }!| j}t|tsQJ |!D ]}"|| |"_qSqB|	S )Nr   FTr,   )rJ   r-   r   r   r9   rL   r   r;   r   rz   r    _copy_attr_fromlistr   r   rF   r   r   r$   r6   rG   itemsr   r3   ry   r   )#r   label_to_block_indexjumpstry_end_locationsr<   r=   block_startstarget_indextarget_labelbytecode_blocksrr   labelsjumping_instrsrj   add_try_endactive_try_begintry_begin_inserted_in_blockrR   	old_block	old_labelli	new_blocktempntenew_tbrH   labtesexisting_te_entriesr0   r   labelb_tbc_tbsc_tbr*   r*   r+   from_bytecode  s  














zControlFlowGraph.from_bytecodec                 C   s  t  }| D ]#}| }|dur|t| dd |D D ]
}|t|j qqi }g }i }t  }g }	d}
d}| D ]}t||v rPt }||t|< |	| |D ]}t|tt	t
fr| }t|t	r|
dur|
\}}|j|ju svJ |j|jks~J t|j|j|_|dur|\}}|j}|j|ju r|j|jkr|jtu r|jtu sJ t|j_n	t|j|j|j_|j||< |	| qRt|t	sJ |||< ||f}
d}n>t|t
rt|t
sJ |j|v rqR||j ||j |_d}
||f}nt|jtrt|tsJ || d}nd}|}|	| qRq:|D ]}|t|j |_qt | D ]}|t|j |_q/t }||  t| j|_|	|dd< |S )zConvert to Bytecode.Nc                 s   s    | ]
}t |tr|V  qd S r#   )r-   r   r.   r*   r*   r+   r2     s    z/ControlFlowGraph.to_bytecode.<locals>.<genexpr>)r   rT   ry   rw   r;   r   rL   r-   r   r   r   rG   r|   r^   r   rz   r   r   r9   r   r   	_bytecodeBytecoder   r   r   )r'   used_blocksrr   rS   r   r   r   rj   seen_try_endr!   last_try_beginlast_try_end	new_labelr=   rH   cfg_tbbyt_tbcfg_tebyt_terz   r   r*   r*   r+   to_bytecode  s   









?
zControlFlowGraph.to_bytecode	stacksizec                C   s.   |du r| j ||d}|  }|j|dddS )zConvert to code.Nr   F)r   rg   r   )r   r   to_code)r'   r   rg   r   bcr*   r*   r+   r     s   zControlFlowGraph.to_code)r"   Nr#   )*r5   rX   rY   r&   rQ   r   rZ   r   r   r
   r   r   r   r   r   rn   r   strr   r	   r   r   r   r   r   r>   r   rA   r   rC   r   r   r   staticmethodr   r   r   r   typesCodeTyper   r[   r*   r*   r(   r+   r      sh    



c
/
" Dm).sysr   collectionsr   dataclassesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   bytecode.concreter   bytecode.flagsr   bytecode.instrr   r   r   r   r   r   bytecode.utilsr   r   r   r   r   
_InstrListr   re   rf   rp   BaseBytecoder    r*   r*   r*   r+   <module>   s(    < "z  
