
    `iE                     (   d dl Z d dlmZmZmZmZmZmZmZm	Z	 d dl
mZ d dlZd dlZd dlmZ d dlZd dlZd dlZej        dk    Z ee j                   ee j                  z  Zej         G d d                      Zde j        d	efd
ZdefdZdee         fdZej         G d d                      Zd	efdZ dee         d	dfdZ!d	ee         fdZ"dee         fdZ#dee j                 d	ee j                 fdZ$d-de%ded	e%fdZ&d-de%ded	e%fdZ' G d dej(                  Z) G d dej(                  Z*d  Z+d.d!Z,d" Z-	 d-d#e%d$e%ded	e%fd%Z. G d& d'ej(                  Z/	 	 d/d(ed)e%d*eee%                  d+eee%                  d	e%f
d,Z0dS )0    N)ListTupleUnionOptionalCallableAnyDictSet)CodeType)defaultdict)      c                       e Zd ZU dZeed<   eed<   ee         ed<   eed<   eed<   dZ	ee         ed<   dZ
ee         ed	<   d
Zeed<   d Zd Zd Zd ZddZdS )Instructionz$A mutable version of dis.InstructionopcodeopnameargargvalargreprNoffsetstarts_lineFis_jump_targetc                      t          |           S Nidselfs    h/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/depyf/code_transform.py__hash__zInstruction.__hash__   s    $xx    c                 B    t          |           t          |          k    S r   r   )r   others     r   __eq__zInstruction.__eq__   s    $xx2e99$$r!   c                 (    d| j          d| j         dS )NzInstruction(opname=z	, offset=))r   r   r   s    r   short_inst_reprzInstruction.short_inst_repr"   s    IT[II4;IIIIr!   c                     | j         t          v S r   )r   all_jump_opcode_setr   s    r   is_jumpzInstruction.is_jump%   s    {111r!   r   c                 t   |                                  rCd| j        v r:t          | j                            dd                                                    S | j        t          j        v r| j        S | j        t          j	        v rt          s| j        | j        z   n| j        S t          d| j         d          )Nzto  zInstruction z does not have jump target)r*   r   intreplacestripr   dishasjabsr   hasjrelpy311r   
ValueErrorr   r   s    r   get_jump_targetzInstruction.get_jump_target(   s    <<>> 	@et|33t|++E266<<>>??? ;#+%%;[CK''49J4;,,t{JFt{FFFH H Hr!   )r   r   )__name__
__module____qualname____doc__r-   __annotations__strr   r   r   r   r   boolr    r$   r'   r*   r5    r!   r   r   r      s         ..KKKKKK	#KKKLLL FHSM   !%K#%%% ND     % % %J J J2 2 2H H H H H Hr!   r   ireturnc           
      ~    t          | j        | j        | j        | j        | j        | j        | j        | j                  S r   )	r   r   r   r   r   r   r   r   r   )r>   s    r   convert_instructionrA   6   s=    										 	 	r!   instc                     d| _         t          j        d         | _        d| _        d| _        d| _        | j         | j         d| _	        | S )z%Inplace modify an instruction as nop.NOPr   r,   F)
r   r0   opmapr   r   r   r   r   r   r   )rB   s    r   nop_instructionrF   C   sI    DK)E"DKDHDKDLKKDKr!   instructionsc                 6    dfd}| D ]} ||           dS )zEEnsure every instruction has line number set in case some are removedNc                 2    | j         r| j         | _         d S r   )r   )rB   cur_line_nos    r   populate_line_numz.propagate_line_nums.<locals>.populate_line_numT   s$     	+*K&r!   r=   )rG   rK   rB   rJ   s      @r   propagate_line_numsrL   P   sP    K' ' ' ' '     $   r!   c                   B    e Zd ZU eed<   eed<   eed<   eed<   eed<   dS )ExceptionTableEntrystartendtargetdepthlastiN)r6   r7   r8   r-   r:   r<   r=   r!   r   rN   rN   `   s=         JJJ	HHHKKKJJJKKKKKr!   rN   c                 z    t          |           }|dz  }|dz  r!|dz  }t          |           }||dz  z  }|dz  !|S )z5
    Inverse of `encode_exception_table_varint`.
    ?   @      )next)
bytes_iterbvals      r   decode_exception_table_varintr\   h   s^     	ZA
b&C
b& 	q2v b&  Jr!   tabc                    t          t          |           dz
            D ]a}| |         j        | |         j        k    rA| |         j        | |dz            j        k     r"| |dz            j        | |dz            j        k    sJ bdS )z
    Verifies that a list of ExceptionTableEntries will make a well-formed
    jump table: entries are non-empty, sorted, and do not overlap.
       N)rangelenrO   rP   )r]   r>   s     r   check_exception_tablerb   t   s    
 3s88a<   
 
FLCFJ&&A
SQZ---AE
 CAJN22232	
 
r!   c           	         t          |           }g }	 	 t          |          dz  }t          |          dz  }||z   dz
  }t          |          dz  }t          |          }|dz	  }t          |dz            }	|                    t	          |||||	                     # t
          $ r t          |           |cY S w xY w)z
    Parse the exception table according to
    https://github.com/python/cpython/blob/3.11/Objects/exception_handling_notes.txt
    T   r_   )iterr\   r<   appendrN   StopIterationrb   )
exntabexntab_iterr]   rO   lengthrP   rQ   dlrR   rS   s
             r   parse_exception_tablerl      s    
 v,,K
C	N1+>>BE2;??!CF&.1$C2;??!CF.{;;B!GEaLLEJJ*5#vueLLMMM	N    c"""


s   BB B=<B=c                 $   t          |           D ]~\  }}|j        dk    rn|                                fdt          |           D             }|r=|d         }t          |           D ]%\  }}|j        k    r||k    rt	          |           &dS )zSimplify finally statement.
    3.10 finally statement:
    SETUP_FINALLY
    body
    POP_BLOCK
    finally code
    Exception code
    RERAISE
    SETUP_FINALLYc                 F    g | ]\  }}|j         k    |j        d k    |S )RERAISE)r   r   ).0j_instfinally_targets      r   
<listcomp>z.simplify_finally_statement.<locals>.<listcomp>   sC     _ _ _E!&!?!?ELT]D]D] D]D]D]r!   r   N)	enumerater   r5   r   rF   )rG   r>   rB   reraise_idxreraise_indexrr   rs   rt   s          @r   simplify_finally_statementry      s     \** 	/ 	/4;/))!1133N_ _ _ _Y. . _ _ _K / +A ), 7 7 / /HAu|~55!}:L:L'...	/ 	/r!   c                 N   t          t          j                  t          t          j                  z  }i }t          r t          | j                  }d |D             }d |D             }t                      }d|d<   t          |          D ]\  }j        s	j	        |v rd||<   |t          |          dz
  k    r n||         s=j        dv rGj        |v rj        t          j        v r+                                j	        k    rd||<   d||dz   <   dj        v sd	j        v s	d
j        v r	d||dz   <   j        dv r	d||dz   <   ňfdt          |          D             }t          |          r|d         }	|	|k    r|	}
d}t          |||	                   D ] \  }}|j	        |v rd}t          |
|          }
!t          |          D ]d\  }}	 |                                }||k     s||	k    r.|j	        k    r#|||	         j	        k     rd}t          |
|          }
U# t          $ r Y aw xY w|sd||<   t!          ||
          D ]}|                    |           d||dz   <   |D ]}d||<   t%          ||          D ]\  }|st'                     dS )z!Mark unreachable bytecode as NOP.c                     i | ]
}|j         |S r=   )rQ   )rq   entrys     r   
<dictcomp>z,nop_unreachable_bytecode.<locals>.<dictcomp>   s    BBBUU\5BBBr!   c                     g | ]}d S )Fr=   rq   xs     r   ru   z,nop_unreachable_bytecode.<locals>.<listcomp>   s    ---1---r!   Tr   r_   )RETURN_VALUE
BREAK_LOOPFIFFOR_ITER
SETUP_LOOP)rn   
SETUP_WITHBEFORE_WITHc                 T    g | ]$\  }}|j                                         k    "|%S r=   )r   r5   )rq   rr   instructrB   s      r   ru   z,nop_unreachable_bytecode.<locals>.<listcomp>   sB     !P !P !P{q(%-_8L8L8N8N%N%N "#%N%N%Nr!   N)setr0   r1   r2   r3   rl   co_exceptiontablerv   r   r   ra   r   r   r5   min	Exceptionr`   addziprF   )coderG   jumpsexception_targetsr]   	reachabledeadcode_positionsr>   jump_forwardsrr   smallest_jump_inhas_jump_iniiinst_iijump_location_flagrB   s                    @r   nop_unreachable_bytecoder      s    s3;///E C#D$:;;BBcBBB
 .----IIaL\** C$ C$4 	 $+1B"B"BIaLL!!A%%%E| 	 ;888[E!!{ck))d.B.B.D.D.S.S  %	!#'	!a% t{""jDK&?&?<SWS^C^C^#'	!a%   NNN#'	!a%  !P !P !P !Pi 7" 7" !P !P !P}%% 6%a(A1uu+,(&++4\!Q$5G+H+H : :KB  '~1BBB.236$4b4: 4: 0 ,5\+B+B % %KB%070G0G0I0I$&FFb1ff=DK;W;W\ilxyzl{  mC  ]C  ]C26K7:(8"8> 8>$4#, % % % $%* 1+0IaL!&q*:!;!; 6 6A.2215555#Ia!e  	! ,	22 " "
d 	"D!!!" "s   AH))
H65H6   r   indentationc                 j    d                     fd|                                 D                       S )zAdd indentation to code.r,   c              3   .   K   | ]}d z  |z   dz   V  dS ) 
Nr=   rq   liner   s     r   	<genexpr>z"add_indentation.<locals>.<genexpr>  sS       , ,  			 		, , , , , ,r!   join
splitlinesr   r   s    `r   add_indentationr     sK    77 , , , , **	, , , , , ,r!   c                 j    d                     fd|                                 D                       S )zRemove indentation from code.r,   c              3   2   K   | ]}|d          dz   V  d S )Nr   r=   r   s     r   r   z%remove_indentation.<locals>.<genexpr>  s1      KK4%,KKKKKKr!   r   r   s    `r   remove_indentationr     s4    77KKKK9J9JKKKKKKr!   c                   J    e Zd Zdedeeeej                 f         fdZd Z	dS )RemoveAssignmentTransformer	temp_nametemp_occurrencesc                 "    || _         || _        d S r   r   r   r   r   r   s      r   __init__z$RemoveAssignmentTransformer.__init__      
 # 0r!   c                 &   t          |j                  dk    rt          |j        d         t          j                  r|j        d         j        }|| j        k    rt          | j        |                   dk    rt          j        |j	                  S t          | j        |                   dk    r`t          | j        |         d         t                    r:| j        |                             |j	                   | j        |         d         rd S |S )Nr_   r   )valuer   )ra   targets
isinstanceastNamer   r   r   Exprr   r<   rf   r   nodenames      r   visit_Assignz(RemoveAssignmentTransformer.visit_Assign"  s    t|!!ja#(&K&K!<?%Dt~%%t,T233q888$*5555.t455::z$J_`dJefhJiko?p?p:)$/66tzBBB,T226 $#tr!   N)
r6   r7   r8   r;   r	   r   r   r   r   r   r=   r!   r   r   r     s\        11#'(,SX)7 $81 1 1 1    r!   r   c                   J    e Zd Zdedeeeej                 f         fdZd Z	dS )RemoveAssignment2Transformerr   r   c                 "    || _         || _        d S r   r   r   s      r   r   z%RemoveAssignment2Transformer.__init__3  r   r!   c                     |j         }|| j        k    rjt          | j        |                   dk    rLt	          | j        |         d         t
                    r&| j        |         d         r| j        |         d         S |S )Nr   r   r   )r   r   ra   r   r   r<   r   s      r   
visit_Namez'RemoveAssignment2Transformer.visit_Name;  s    w4>!!c$*?*E&F&F!&K&KPZ%d+B/Q7 Q7&K$T*2. 7,T2266r!   N)
r6   r7   r8   r;   r	   r   r   r   r   r   r=   r!   r   r   r   2  s\        11#'(,SX)7 $81 1 1 1    r!   r   c                 ^    g }| r(|                     |            t          | dd          } | (|S )z)Collect all parent nodes of a given node.parentN)rf   getattr)r   parentss     r   get_parentsr   D  sC    G
 -ttXt,,  - Nr!   c                 b    t          j        |           D ]}||_        t          ||           dS )z3Recursively set the parent attribute for each node.N)r   iter_child_nodesr   set_parents)r   r   childs      r   r   r   M  s@    %d++ " "E5!!!!" "r!   c                     t          |           }t          |          }|                                 |                                 d}t          ||          D ]\  }}||u r|} |||fS )z+Get the lowest common parent for two nodes.N)r   reverser   )node1node2parents1parents2last_commonp1p2s          r   lowest_common_parentr   T  s    5!!H5!!H Kh))  B88KKBr!   source_codetemp_prefixc                 n   t          j        |           }t          |           t          t                    }t          j        |          D ]V}t          |t           j                  r:|j        	                    |          r ||j                 
                    |           W|D ]u}t          ||                   dk    r||         d         }||         d         }t          ||          \  }	}
}t          |j        t           j                  r|n|}t          |j        t           j                  r|
n|}t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        f
}t          ||           }||         
                    |           t3          ||                              |          }t7          ||                              |          }wt9          j        |d|z            }|S )Nrd   r   r_   r   )indent_with)r   parser   r   listwalkr   r   r   
startswithrf   ra   r   r   AssignFunctionDefAsyncFunctionDefForAsyncForWhileIfTryWith	AsyncWithClassDefr   visitr   astor	to_source)r   r   r   treer   r   keyr   r   r   parent1parent2assignment_nodeassignment_parentindentation_nodes	can_mergereconstructed_codes                    r   remove_some_tempr   f  s    9[!!D"4(( 3 3dCH%% 	3$'*<*<[*I*I 	3TW%,,T222 O O$%%**$S)!,E$S)!,E';E5'I'I$FGW'1cj(* (* 5ee/4 +5cj,* ,* !7/6  $	
! ''8:KLLLIS!((333*30@AAGGMM+C1ABBHHNN3;LMMMr!   c                       e Zd Zd ZdS )IdentifierReplacerc                 :    d|_         |                     |          S )NPLACEHOLDER)r   generic_visit)r   r   s     r   visit_FunctionDefz$IdentifierReplacer.visit_FunctionDef  s    !	!!$'''r!   N)r6   r7   r8   r  r=   r!   r   r   r     s#        
( ( ( ( (r!   r   old_bytecodesrc_codeadd_local_variablesadd_cellvarsc           
      
   |                     d          d                                          d         |}|||                                }|d         }|dd          }|g}|r<d                    d |D                       }	d|	z   dz   }	|                    |	           |r<d	d
                    d |D                       z   }	d|	z   }	|                    |	           d                    d ||z   D                       }| j        }
|
r%d}|
D ]}|d| dz  }|t          |d          z  }|}t          |dd          }ddlm}  ||          }fd|D             d         }t          | j
                  t          |j
                  z
  }t          | j                  t          |j                  z
  }|s|rGt          | |t          t          |                    t          t          |                              S |S )N(r   r   r_   z; c              3       K   | ]	}| d V  
dS )z = NoneNr=   r   s     r   r   z%fix_irregular_code.<locals>.<genexpr>  s(      "N"NQa==="N"N"N"N"N"Nr!   z    zy # this line helps Python to generate bytecode with at least the same number of local variables as the original function
zreturn z, c              3      K   | ]}|V  d S r   r=   r   s     r   r   z%fix_irregular_code.<locals>.<genexpr>  s"      .G.GQq.G.G.G.G.G.Gr!   z    def __helper_for_cellvars():
        # this function helps Python to generate bytecode with at least the same number of cellvars as the original function
        r,   c                     g | ]}|d z   S )r   r=   r   s     r   ru   z&fix_irregular_code.<locals>.<listcomp>  s    ===AH===r!   a  def __helper_outer_function():
    # this is a helper function to help compilers generate bytecode to read capture variables from closures, rather than reading values from global scope. The value of these variables does not matter, and will be determined in runtime.
z = None
r   nonameexec)collect_all_code_objectsc                 *    g | ]}|j         k    |S r=   )co_name)rq   r   function_names     r   ru   z&fix_irregular_code.<locals>.<listcomp>  s%    IIIai=.H.H1.H.H.Hr!   )r  r  )splitr   r   rf   co_freevarsr   compileutilsr  r   co_varnamesco_cellvarsfix_irregular_codesortedr   )r  r  r  r  new_codelinesheaderbodyheaders
added_linefreevarstmp_codefreevarcompiled_coder  code_objectstarget_codemissing_local_variablesmissing_cellvarsr  s                      @r   r  r    s~    NN3''*002226MH&,*B##%%qQRRy( 	'"N"N:M"N"N"NNNJ*,  0l  lJNN:&&& 	'"TYY.G.G,.G.G.G%G%GGJ ((J NN:&&&77==gn===>>'H | 	   	2 	2G1w1111HHOHa000 Hh77M//////++M::LIIIIlIII!LK!,":;;c+BY>Z>ZZ<344s;;R7S7SS 9"2 9!( &t,C'D'D E E%5 6 6779 9 9 	9 Or!   )r   r   )NN)1r0   typingr   r   r   r   r   r   r	   r
   typesr   r   r   collectionsr   dataclassessyshashlibversion_infor3   r   r1   r2   r)   	dataclassr   rA   rF   rL   rN   r-   r\   rb   rl   ry   r   r;   r   r   NodeTransformerr   r   r   r   r   r   r   r  r=   r!   r   <module>r1     s.   



 I I I I I I I I I I I I I I I I I I I I       



  # # # # # #     



 G#c#+&&S[)9)99  #H #H #H #H #H #H #H #HL
3? 
{ 
 
 
 

+ 
 
 
 
 d;&7                 
 
 
 
 


t$78 

T 

 

 

 

T*=%>    ,/T+-> / / / /,\"3?+\"04S_0E\" \" \" \"~, ,# ,C , , , , ,L LS Ls L3 L L L L
    #"5   2    3#6   $  " " " "  * ( ((( ( "%( ( ( (V( ( ( ( (, ( ( (2 .2&*	4 444 "$s),4 49%	4
 
4 4 4 4 4 4r!   