
    ,ueD                        d dl Z d dlZd dlZd dlZd dlZd dl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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'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ejd                  dk\  Z3dejh                  deddfd	Z5 ed
d      Z6 G d de"e7         Z8 G d d      Z9 G d dejt                  ee8e,f            Z; G d d      Z<y)    N)AnyDictIterableIteratorListMutableSequenceOptionalSequenceSetTupleTypeTypeVarUnion)CompilerFlags)_UNSETBITFLAG2_INSTRUCTIONSBITFLAG_INSTRUCTIONS	INTRINSICINTRINSIC_1OPINTRINSIC_2OPPLACEHOLDER_LABELUNSET	BaseInstrCellVarCompareFreeVarInstrInstrArgInstrLocationIntrinsic1OpIntrinsic2OpLabel	SetLinenoTryBeginTryEnd_check_arg_int	const_keyopcode_has_argument   
   codeconstsreturnc                 H    |sy |d   }t        |t              s||| _        y y )Nr   )
isinstancestr	docstring)r,   r-   first_consts      3/usr/lib/python3/dist-packages/bytecode/concrete.py_set_docstringr5   ;   s,    )K+s#{':$ (;    TConcreteInstr)boundc                   >    e Zd ZU dZeed<   dZefedddddedede	ede
f   d	ee   d
ee   dee   f fdZdedededdfdZdededdf fdZedefd       Zdeee   eef   fdZdedee   fdZdefdZedee   dee   dededef
d       ZdefdZ xZS )r8   z{Concrete instruction.

    arg must be an integer in the range 0..2147483647.

    It has a read-only size attribute.

    _arg)_size_extended_argsoffsetN)linenolocationextended_argsr>   nameargr?   r@   rA   r>   c                J    || _         || _        t        |   |||||       y )N)r?   r@   r>   )r=   r>   super__init__)selfrB   rC   r?   r@   rA   r>   	__class__s          r4   rF   zConcreteInstr.__init__T   s,     ,s6HVTr6   opcoder.   c                     t        |      r#|t        u rt        d|z        t        ||       y |dk(  r|t        ur|nd}t        ||       y |t        urt        d|z        y )Nz!operation %s requires an argumentr   zoperation %s has no argument)r(   r   
ValueErrorr&   )rG   rB   rI   rC   s       r4   
_check_argzConcreteInstr._check_arge   si    v&e| !Dt!KLL3%q[E)#qC3%% !?$!FGG  r6   c                     t         |   ||       d}|t        ur|dkD  r|dz  }|dz  }|dkD  r| j                  dd| j                  z  z   }|| _        y )N         )rE   _setr   r=   r<   )rG   rB   rC   sizerH   s       r4   rQ   zConcreteInstr._sets   sl    
 	T3e*		 * *q4....D
r6   c                     | j                   S N)r<   rG   s    r4   rR   zConcreteInstr.size   s    zzr6   c                 H    | j                   | j                  | j                  fS rT   )	_location_namer;   rU   s    r4   _cmp_keyzConcreteInstr._cmp_key   s    

DII66r6   instr_offsetc                 (   t         r| j                  dz  n| j                  | j                         z   }| j                         r||z   | j                  z   S | j                         r||z   | j                  z
  S | j                         r| j                  S y )NrN   )OFFSET_AS_INSTRUCTIONr<   use_cache_opcodesis_forward_rel_jumpr;   is_backward_rel_jumpis_abs_jump)rG   rZ   ss      r4   get_jump_targetzConcreteInstr.get_jump_target   s     "7TZZ1_DJJ""$% ##%!#dii//$$&!#dii//99r6   c                    | j                   t        u rt        | j                  df      S | j                   }| j                  |dz  g}|dkD  r#|dz  }t        j                  |dz  g|d d |dkD  r#| j
                  rFt        |      | j                  k  r.t        j                  dg|d d t        |      | j                  k  r.t        |      S )Nr   rO   rP   )r;   r   bytes_opcodeEXTENDED_ARGr=   lenr<   )rG   rC   bs      r4   assemblezConcreteInstr.assemble   s    99$,,*++ii\\3:&DjAIC))3:6AbqE Dj a&4::% --t4"1 a&4::% Qxr6   clsr,   c                     t         rd|z  n|}||   }t        |      r	||dz      }nt        }t        j                  |   } | ||||      S )NrN      )r?   r>   )r\   r(   r   re   opname)rj   r?   r,   r>   indexoprC   rB   s           r4   disassemblezConcreteInstr.disassemble   sS    3F
%[r"uqy/CC~~b! 4VE::r6   c                 f    t         j                  dk\  rt        j                  | j                     S dS )Nr*      r   )sysversion_infodis_inline_cache_entriesre   rU   s    r4   r]   zConcreteInstr.use_cache_opcodes   s5     7* %%dll3	
 		
r6   )__name__
__module____qualname____doc__int__annotations__	__slots__r   r1   r   r   r	   r   rF   rL   rQ   propertyrR   r   rY   rb   rd   ri   classmethodr   r7   rp   r]   __classcell__rH   s   @r4   r8   r8   F   sz    I5I
 U
 ,1,0'+ $UU U
 c4'(U =)U  }U U"Hs HC Hc Hd H  
	 c  7% 7c AB 7C HSM "%   ;a ;(3- ;u ;c ;VW ; ;
3 
r6   c                   t    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZdedededededd	fd
Zde	fdZ
y	)ExceptionTableEntryzpEntry for a given line in the exception table.

    All offset are expressed in instructions not in bytes.

    start_offsetstop_offsettargetstack_depth
push_lastir   r   r   r   r   r.   Nc                 J    || _         || _        || _        || _        || _        y rT   r   )rG   r   r   r   r   r   s         r4   rF   zExceptionTableEntry.__init__   s*     )&&$r6   c           
          d| j                    d| j                   d| j                   d| j                   d| j                   
S )Nz!ExceptionTableEntry(start_offset=z, stop_offset=z	, target=z, stack_depth=z, push_lasti=r   rU   s    r4   __repr__zExceptionTableEntry.__repr__   s\     --. /++, -kk] #++, -//*,	
r6   )rx   ry   rz   r{   r|   r}   boolr~   rF   r1   r    r6   r4   r   r      s~     
  K
  VI%% % 	%
 % % 
%
# 
r6   r   c                       e Zd ZU eed<   ee   ed<   ee   ed<   ee   ed<   	 dAddddddedeedf   de	e   de
ee      f fd	Zd
eeeef      f fdZded
dfdZ fdZd
efdZded
ef fdZedddej2                  ded
d fd       Zedeeeef      ded
eeeef      fd       Zd
eeeeeeee
e   f      f   fdZ ededeeeeee
e   f      d
efd       Z!edee   dede
e   d
dfd        Z"dede	eeeee
e   f      d
efd!Z#ed"ed
e$fd#       Z%d$ed
e$fd%Z&eded&ed
efd'       Z'd&ed(ed)e
e   d
e$fd*Z(d+ee$   d&ed(ed)ed
ef
d,Z)dede	eeeee
e   f      d
efd-Z*ede+eeef      d
dfd.       Z,ed/ee   d
efd0       Z-ded
ee   fd1Z.edBd2ed3ed
ee   fd4       Z/d
efd5Z0d6d7d8ed
efd9Z1	 dCd6d6d:d;e
e   d8ed<ed
ej2                  fd=Z2	 	 dDd>ed?ed
e3jh                  fd@Z5 xZ6S )EConcreteBytecoder-   namesvarnamesexception_tabler   Nr-   r   r   r   .c                    t         |           t        |      | _        t        |      | _        t        |      | _        |xs g | _        |D ]  }| j                  |        | j                  |       y rT   )	rE   rF   listr-   r   r   r   _check_instrextend)rG   instructionsr-   r   r   r   instrrH   s          r4   rF   zConcreteBytecode.__init__  sg     	6l%[
X.4"! 	%Ee$	%L!r6   r.   c              #   b   K   t         |          }|D ]  }| j                  |       |  y wrT   )rE   __iter__r   )rG   r   r   rH   s      r4   r   zConcreteBytecode.__iter__  s6     w')! 	Ee$K	s   ,/r   c                 r    t        |t        t        f      s!t        dt	        |      j
                  z        y )NzXConcreteBytecode must only contain ConcreteInstr and SetLineno objects, but %s was found)r0   r8   r#   rK   typerx   )rG   r   s     r4   r   zConcreteBytecode._check_instr   s:    %-!;<#%)%[%9%9:  =r6   c                     t         |   |       t        |t              r4|j                  | _        |j
                  | _        |j                  | _        y y rT   )rE   _copy_attr_fromr0   r   r-   r   r   )rG   bytecoderH   s     r4   r   z ConcreteBytecode._copy_attr_from(  sC    )h 01"//DK!DJ$--DM 2r6   c                     dt        |       z  S )Nz<ConcreteBytecode instr#=%s>)rg   rU   s    r4   r   zConcreteBytecode.__repr__/  s    -D	99r6   otherc                 P   t        |       t        |      uryt        t        t        | j                              }t        t        t        |j                              }||k7  ry| j
                  |j
                  k7  ry| j                  |j                  k7  ryt        | !  |      S )NF)	r   r   mapr'   r-   r   r   rE   __eq__)rG   r   const_keys1const_keys2rH   s       r4   r   zConcreteBytecode.__eq__2  s    :T%[(3y$++673y%,,78+%::$==ENN*w~e$$r6   F)extended_argr,   r   c          
         t         j                  dk\  rt        j                  | d      D cg c]d  }t	        |j
                  |j                  |j                  dz  nt        |j                  rt        j                  |j                        nd       f }}nt         j                  dk\  r!t        d | j                         D              }nt        t        j                  |             }g }d}| j                  }|t        | j                         t"        rd	nd
z  k  rt"        rd	|z  n|}||v r||   }t        j%                  || j                   |      }|j'                  |       |t"        r|j(                  d	z  n|j(                  z  }|t        | j                         t"        rd	nd
z  k  rt+               }	|s|	j-                  |       | j.                  |	_        | j2                  |	_        t7        | j8                        |	_        | j<                  |	_        | j@                  |	_!        | jD                  |	_#        | j                  |	_$        tK        | jL                        |	_'        tK        | jP                        |	_)        tK        | jT                        |	_+        tK        | jX                        |	_-        tK        | j\                        |	_/        ta        |	| jP                         t         j                  dk\  r2|	jc                  | jd                        |	_3        | jh                  |	_5        n|	jj                  |	_5        ||	d d  |	S c c}w )Nrr   T)show_caches   r@   r)   c              3   ,   K   | ]  \  }}}||f  y wrT   r   ).0r>   _r?   s       r4   	<genexpr>z-ConcreteBytecode.from_code.<locals>.<genexpr>X  s       #):FVV$#s   r   rN   rl   )6rt   ru   rv   get_instructionsr8   rm   rC   r   	positionsr   from_positionsdictco_linesfindlinestartsco_firstlinenorg   co_coder\   rp   appendrR   r   _remove_extended_argsco_namerB   co_filenamefilenamer   co_flagsflagsco_argcountargcountco_posonlyargcountposonlyargcountco_kwonlyargcountkwonlyargcountfirst_linenor   co_namesr   	co_constsr-   co_varnamesr   co_freevarsfreevarsco_cellvarscellvarsr5   _parse_exception_tableco_exceptiontabler   co_qualnamequalname)
r,   r   ir   line_startsr>   r?   
lineno_offr   r   s
             r4   	from_codezConcreteBytecode.from_codeB  s    w& --dE  HH#$55#4AEECK%{{ +99!++FL  7*" #>Bmmo#  #3#5#5d#;< LF$($7$7FC-7L!RSTU-Ba&j
,(4F%11&$,,O##E*/D5::?%**T C-7L!RSTU $% **<8 ,,&t}}5 ,,#'#:#: "&"8"8 $ 3 3dmm,t~~. !1!12 !1!12 !1!12x0w&'/'F'F&&(H$ !% 0 0H ( 1 1H"Gs   A)Mr   r   c              #   |   K   |}| D ]1  }|j                   }|
|t        ur|}t        |t              s,||f 3 y wrT   )r?   r   r0   r8   )r   r   r?   r   i_linenos        r4   _normalize_linenoz"ConcreteBytecode._normalize_lineno  sO       " 	&E||H #(=!%/uo%	&s   0<	<c                 F   d}g }g }| j                  | | j                        D ]j  \  }}|j                  |j                                |j                  }|j                  t
        r|dz  n||||j                  f       |t
        r|dz  n|z  }l dj                  |      |fS )Nr   rN   r6   )r   r   r   ri   rR   r\   r@   join)rG   r>   code_strlinenosr?   r   i_sizes          r4   _assemble_codezConcreteBytecode._assemble_code  s     !33D$:K:KL 	IMFEOOENN,-ZZFNN$9VaZvNN	 '<v{&HF	I "G,,r6   r   c                    g }d}| }|D ]  \  }}}}||z
  }|dk(  r|}||z
  }	|}|	dkD  r|j                  d       |	dz  }	|	dkD  r|dk  r3|j                  t        j                  d|	d             d}	|dz  }|dk  r3|dkD  r3|j                  t        j                  d|	d             d}	|dz  }|dkD  r3d|	cxk  rdk  sJ  J d|cxk  rdk  sJ  J |j                  t        j                  d|	|              dj                  |      S )Nr   rO   s    Bb   r6   )r   structpackr   )
r   r   lnotab
old_offset
old_linenor>   r   r?   dlinenodoffs
             r4   _assemble_lnotabz!ConcreteBytecode._assemble_lnotab  sH    
!
$+ 	< FAvqz)G!|JJ&DJ*k* * D.fkk$d;<4 D.
 C-fkk$c:;3 C-
 ######7)c)))))MM&++dD':;5	<8 xxr6   	linetabler   r   c                 `   |||dk  r1| j                  t        j                  ddd             |dz  }|dk  r1|dkD  r1| j                  t        j                  ddd             |dz  }|dkD  r1d|cxk  rdk  sJ  J d}|dkD  rs| j                  t        j                  dd|             |dz  }|dkD  r| j                  d       |dz  }|dkD  r| j                  t        j                  d|d             n&| j                  t        j                  d||             d|cxk  rdk  sJ  J y )Nir   r   r   r      s    )r   r   r   )r   r   r   s      r4   _pack_linetablez ConcreteBytecode._pack_linetable  s=     D.  T1d!;<4 D. C-  T1c!:;3 C- 7)c)))))G #:V[[sG<=CKD*  - * V[[tQ78 V[[tW=>DCr6   c                    |syg }d}t        |      }t        |      \  }}}}	|	|	j                  |	j                  |z
  nd }
n||z
  }
|D ]T  \  }}}}||j                  |j                  |z
  nd }n||z
  }|dk(  s|
|7|}||z
  }|}| j                  |||
       |}
V ||z   |z
  }| j                  |||
       dj	                  |      S )Nr6   r   )iternextr?   r   r   )rG   r   r   r   r   iter_inr>   r   r   old_locationold_dlinenor?   r@   r   r   s                  r4   _assemble_linestablez%ConcreteBytecode._assemble_linestable  s"   
 !#	
w-37=0
L#  &&2 ##l2  %|3K07 	",FFFH#  2 OOj0  !:-!| 3JJ&DJ  D+>!K%	"* +Yk:xx	""r6   varintc                 r    t               }	 |j                  | dz         | dz  } | r|dxx   dz  cc<   n	 |S -)N?      @   )	bytearrayr   )r   encodeds     r4   _encode_location_varintz(ConcreteBytecode._encode_location_varint4  sC    +NN6D=)qLFt# r6   svarintc                 d    |dk  r| j                  | dz  dz        S | j                  |dz        S )Nr   rl   )r   )rG   r  s     r4   _encode_location_svarintz)ConcreteBytecode._encode_location_svarintA  s:    Q;//7(qA0EFF//1==r6   rR   c                 0    d| dz  z   |dk  r|dz
  z   S dz   S )N   r*   rP   rl      r   )r,   rR   s     r4   _pack_location_headerz&ConcreteBytecode._pack_location_headerH  s(    419%TQYFFAFFr6   r?   r@   c                    t               }||d d d f\  }}}}n3|j                  |j                  |j                  |j                  f\  }}}}|#|j                  | j                  d|             |S |Q|||k7  rt        d| d|       |j                  | j                  d|      g| j                  ||z
               |S |J |J ||k(  rI||z
  dk(  rA|dk  r<||z
  dk  r4|j                  | j                  |dz  |      |dz  dz  ||z
  z   f       |S ||k(  r=||z
  d	v r6|d
k  r1|d
k  r,|j                  | j                  d|z   |z
  |      ||f       |S |j                  | j                  d|      g| j                  ||z
        | j                  ||z
        | j                  |dz         | j                  |dz                |S )N   zMAn instruction cannot have no column offset and span multiple lines (lineno: z, end lineno:    r   H   rP      )rl   rN   r   r+      rl   )r   r?   
end_lineno
col_offsetend_col_offsetr   r  rK   r   r  r   )	rG   rR   r?   r@   packedl_linenor  r  r  s	            r4   _pack_locationzConcreteBytecode._pack_locationL  s     	@<Hj*n ####''	@<Hj*n MM$44R>?@ { %**@ //7jzlT  MM..r48228f3DEn ] )))!--- h&v%*O#j0R722:?DI$q.Q.>J3NOH 7 h&v%/$"S(222=63I4P"&,  222t<66x&7HI 55j86KL 55j1nE 55nq6HI
 r6   	locationsc                     |dz  }	 |j                  | j                  |||             |j                  |j                  n|}|dz  }|dk  r	 |S J)NrN   rP   rl   )r   r  r?   )rG   r  rR   r?   r@   s        r4   _push_locationsz ConcreteBytecode._push_locations  sb     	

 T00vxHI )1(CX__FAIDax r6   c                 N   |syg }t        |      }t        |      \  }}}}|xs t        |d d d       }|}|D ]H  \  }}	}
}|xs t        |
d d d       }|j                  r||k(  r||	z  }1| j	                  ||||      }|	}|}J | j	                  ||||       dj                  |      S )Nr6   )r   r   r   r?   r  r   )rG   r   r   r  r   r   rR   r?   r   r   
new_linenor@   s               r4   _assemble_locationsz$ConcreteBytecode._assemble_locations  s    
 %'	w-(,W%4#N}VT4'N 07 	$+Avz8N=T4#NH ""|x'?)))T6<PFD#L	$ 	YflCxx	""r6   c                    d}d }d}|t        |       k  r| |   }t        |t              r|dz  })|j                  dk(  r*|dz  }||dz  |j                  z   }n|j                  }| |= b|^|j                  dk(  rt
        n|dz  |j                  z   }d }t        |j                  ||j                  ||j                        }|| |<   d}|dz  }|t        |       k  r|t        d      y )Nr   rl   rf   rP   NOP)r@   rA   r>   z#EXTENDED_ARG at the end of the code)
rg   r0   r#   rB   rC   r   r8   r@   r>   rK   )r   nb_extended_argsr   rn   r   rC   s         r4   r   z&ConcreteBytecode._remove_extended_args  s    c,'' 'E %+
zz^+ A% +$0A$5#BL#(99L ''$zzU2e9Jeii8W#%JJ"^^"2 << ',U##$ QJEA c,''D #BCC $r6   except_table_iteratorc                 l    t        |       }|dz  }|dz  r|dz  }t        |       }||dz  z  }|dz  r|S )Nr   r   r   )r   )r  rh   vals      r4   _parse_varintzConcreteBytecode._parse_varint  sN    &'"f"fAIC*+A1r6MC "f 
r6   c           	      h   t         j                  dk\  sJ g }t        |      }	 	 | j                  |      }| j                  |      }||z   dz
  }| j                  |      }| j                  |      }|dz	  }	t	        |dz        }
|j                  t        ||||	|
             ~# t        $ r |cY S w xY w)Nrr   rl   )rt   ru   r   r   r   r   r   StopIteration)rG   r   tableiteratorstartlengthendr   dldepthlastis              r4   r   z'ConcreteBytecode._parse_exception_table   s     7***(	**84++H5fnq(++H5''1aR!V0VUERS   	L	s   A?B# #B10B1valueset_begin_markerc                     g }| dk\  sJ | r#|j                  | dz  |rdndz         | dz  } | r#|xs dg}|r|dxx   dz  cc<   t        |      S )Nr   r   r   r   r   r  )r   reversed)r+  r,  temps      r4   _encode_varintzConcreteBytecode._encode_varint3  sf     zzKK
Dba89aKE  {sHOH~r6   c                    t               }| j                  xs g D ]  }|j                  |j                  z
  dz   }|j                  dz  |j
                  z   }|j                  | j                  |j                  d             |j                  | j                  |             |j                  | j                  |j                               |j                  | j                  |              t        |      S )Nrl   T)
r   r   r   r   r   r   r   r0  r   rd   )rG   r#  entryrR   r)  s        r4   _assemble_exception_tablez*ConcreteBytecode._assemble_exception_tableA  s    ))/R 	5E$$u'9'99A=D&&!+u/?/??ELL,,U-?-?FGLL,,T23LL,,U\\:;LL,,U34	5 U|r6   Tcheck_pre_and_postr5  c                    | j                         }t        j                  j                  |      }|j	                  |      S )Nr4  )to_bytecode	_bytecodeControlFlowGraphfrom_bytecodecompute_stacksize)rG   r5  r   cfgs       r4   r;  z"ConcreteBytecode.compute_stacksizeM  s;    ##%((66x@$$8J$KKr6   r5  compute_exception_stack_depths	stacksizer>  c                   |t         j                  dk\  rb|r`t        j                  j	                  | j                               }|j                  ||      }|j                         j                  d      } | j                         \  }}t         j                  dk\  r| j                  | j                  |      nJt         j                  dk\  r| j                  | j                  |      n| j                  | j                  |      }t        | j                        }t         j                  dk\  rt        j                   | j"                  | j$                  | j&                  ||t)        | j*                        |t-        | j.                        t-        | j0                        t-        | j                        | j2                  | j4                  | j6                  | j                  || j9                         t-        | j:                        t-        | j<                              S t        j                   | j"                  | j$                  | j&                  ||t)        | j*                        |t-        | j.                        t-        | j0                        t-        | j                        | j2                  | j4                  | j                  |t-        | j:                        t-        | j<                              S )Nrr   r=  Fr>  r)   )rt   ru   r8  r9  r:  r7  r;  to_concrete_bytecoder   r  r   r   r   rg   r   typesCodeTyper   r   r   r|   r   tupler-   r   r   rB   r   r3  r   r   )	rG   r?  r5  r>  r<  r   r   r   nlocalss	            r4   to_codezConcreteBytecode.to_codeR  sQ    ',J,,::4;K;K;MNC--#5/M . I ??$99/4 : D
 !//1' 7* $$T%6%6@ ##w. ))$*;*;WE**4+<+<gF 	 dmm$w&>>$$##DJJdkk"djj!dmm$		!!..0dmm$dmm$% * >>$$##DJJdkk"djj!dmm$		!!dmm$dmm$! r6   prune_caches#conserve_exception_block_stackdepthc           	      x   | d d  }| j                  |       t               }d}|D ][  }t        |t              r|j	                  |      }||j                  |       |t        r|j                  dz  n|j                  z  }] | j                  D ]  }|j                  |j                          i }	i }
| j                  D ]L  }|j                  |	vsJ ||	|j                  <   |
j                  |j                  g       j                  |       N g }g }i }i }d}t        j                  dk\  rB| j                   | j"                  D cg c]  }|| j                   vs| c}z   }t%        |      }n!t%        | j"                        }| j"                  }| j'                  || j(                        D ]R  \  }}||v r t+               }|||<   |j                  |       ||	v rL|	|   }t-        t+               |j.                  |r|j0                  nt2              }|||<   |j                  |       |j	                  |      }|j                  }|t        r|dz  dz
  n|dz
  z  }|}|t        rdndz  }|r|j4                  dk(  r|JJ |j6                  }|j8                  t:        j<                  v r| j>                  |   }n|j8                  t:        j@                  v r| j                   |   }nn|j8                  t:        jB                  v r|j4                  tD        v r"tG        |dz        | jH                  |dz	     f}n|j4                  tJ        v r.tG        |dz        tG        |dz        | jH                  |dz	     f}n| jH                  |   }n|j8                  t:        jL                  v r4||k  r||   }tO        |      }n| jP                  ||z
     }tS        |      }n~|j8                  t:        jT                  v r$tW        t        j                  dk\  r|dz	  n|      }n>|j8                  tX        v rt[        |      }n |j8                  t\        v rt_        |      }n|}|j`                  xs tc        |d d d       }|$td        }t%        |      }|j                  ||f       |j                  tg        |j4                  |||jh                               ||
v s!|
|   }tk        |      D ]  }|j                  tm        ||                ! U |D ]8  \  }}||   } t        | tf              r| j6                  td        u sJ ||   | _        : |jo                         D ]  \  }}!||j                     |!_	         tq        jr                         }"|"ju                  |        |"jv                  |"jx                  z   }#|#|"jz                  z  }#|"j|                  t~        j                  z  r|#dz  }#|"j|                  t~        j                  z  r|#dz  }#| j                   d |# |"_B        t        |"| j>                         |"j                  |       |"S c c}w )	Nr   rN   rr   rl   CACHEr*      r  )r@   r>   )Er   setr0   r#   rb   addr\   rR   r   r   r   
setdefaultr   r   rt   ru   r   r   rg   r   r   r"   r$   r   r   r   rB   rC   rI   re   hasconstr-   haslocalhasnamer   r   r   r   hasfreer   r   r   
hascomparer   r   r    r   r!   r@   r   r   r   r>   r.  r%   itemsr8  Bytecoder   r   r   r   r   inspect
CO_VARARGSCO_VARKEYWORDSargnamesr5   r   )$rG   rH  rI  c_instructionsjump_targetsr>   c_instrr   ex_entryex_startex_endr2  jumpsr   labels	tb_instrsncells_lookupncellsr?   labeltb_instrjump_targetrR   current_instr_offsetc_argrC   rB   r@   instr_indexentriesrn   r   tbr   nargss$                                       r4   r7  zConcreteBytecode.to_bytecode  s    a"">2 "%% 	UG'9-,,V4F!  (-Bw||q(TF	U ,, 	.HX__-	. 4679)) 	CE %%X555+0HU''(e//4;;EB	C (*OQ9;	 w&====,AT]],B, L &F'F==L#55D-- 
 U	BOFG %!&v##E* ! (#G$$)LE%%RW $,	% ##H-!11&9K<<D )>tqy1}TAXNF#) 0aa7F
  7"***  >>W%5%55++e,C^^w'7'77--.C^^w6||';;#EAI

5A:0FG )>>#EAIUQYEUVJAWX"jj/^^w6v~+E2%dm#}}UV^<%dm^^w'9'99!(+(8(8G(C!C ^^}4&u-C^^}4&u-CC"++V}VT4QU/V*+C"%l"3KLL+{!;<##E',,hW^WeWe$fg $v- !56%g. BE ''y/?(@ABiU	Bp #( 	,E; 'EeU+		=N0NNN{+EI		, #* 	-IE2u||,BI	- %%'  &!!H$;$;;)))>>G...QJE>>G222QJE MM&51x-%o,s   X7X7)r   )FrT   )TF)7rx   ry   rz   r   r}   r1   r   rE  r   r   r	   rF   r   r   r8   r#   r   r   r   r   r   r   r   staticmethodrC  rD  r   r
   r|   r   rd   r   r   r   r   r   r   r   r  r  r  r  r  r   r   r   r   r0  r3  r;  rG  r8  rW  r7  r   r   s   @r4   r   r      s   L 9 3i
 -.. " !#"$?C" 	"
 S#X" 3-" "$':";<"$(5	)A#BC # $ .:# :%C %D %  6;JnnJ/3J	J JX &u]I%=>?&OR&	%]*+	,& &"-	ud5c30G!GHII	J-, " " $(sCh}>U/U)V$W" 	"  " H " ;" &)" 4<SM" 	"  " J/#/# %S#x/F FGH/# 
	/#d 
 
	 
 
> >	 > GC Gs Gs G GXX!$X080GX	Xt	?  	
   
0#### %S#x/F FGH## 
	##J /D%eI},D&EF/D	/D /Dd Xc] s  $	!	"& c T hsm  
5 
 ?C Lt Ls L $(J $(/3JC=J !	J
 )-J 
J\ "49nn .2n 
			nr6   r   c                       e Zd ZdZdej
                  ddfdZdedefdZ	e
dee   d	edefd
       ZddZdefdZ	 	 ddee   dedefdZy)_ConvertBytecodeToConcreter+   r,   r.   Nc                     t        |t        j                        sJ || _        g | _        g | _        i | _        i | _        d| _        d| _	        i | _
        g | _        g | _        g | _        y )Nr   F)r0   r8  rW  r   r   rb  rc  exception_handling_blocksrequired_cachesseen_manual_cacheconsts_indicesconsts_listr   r   )rG   r,   s     r4   rF   z#_ConvertBytecodeToConcrete.__init__V  sq    $	 2 2333 24=?
(*NP& !& JL&( "
#%r6   r+  c                     t        |      }|| j                  v r| j                  |   S t        | j                        }|| j                  |<   | j                  j	                  |       |S rT   )r'   rx  rg   ry  r   )rG   r+  keyrn   s       r4   	add_constz$_ConvertBytecodeToConcrete.add_consth  sd    $%%%&&s++D''(#(C &r6   r   rB   c                     	 | j                  |      }|S # t        $ r  t        |       }| j                  |       Y |S w xY wrT   )rn   rK   rg   r   )r   rB   rn   s      r4   rO  z_ConvertBytecodeToConcrete.addq  sG    	KK%E   	JELL	s    %>>c                 n   | j                   j                  }g }g }| j                   D ]  }t        |t              rC|j                  dk(  r4| j
                  st        d      d| _        | xj
                  dz  c_        n| j
                  r| j                  sn| j                  j                  t        | j
                        D cg c]'  }t        dd| j                  d   j                        ) c}       d| _        d| _        nt        d	| j
                   d
      t        |t              r$t        | j                        | j                  |<   *t        |t               r|j"                  }Ht        |t$              rY|j&                  t(        usJ t+        t        | j                        dd|j&                  |j,                        | j.                  |<   t        |t0              r8| j.                  |j2                     }t        | j                        dz
  |_        t        |t              sJ |j"                  t(        ur|j"                  |j"                  }n|j"                  t(        u r||_        |j6                  }d}t        |t              r|}	d}d}n|j8                  t:        j<                  v r| j?                  |      }ns|j8                  t:        j@                  v r0t        |tB              sJ | jE                  | jF                  |      }n'|j8                  t:        jH                  v r|j                  tJ        v rt        |tL              r4t        |      dk(  r&t        |d   tN              rt        |d   tB              sJ |       | jE                  | jP                  |d         }
tS        |d         |
dz  z   }nx|j                  tT        v rt        |tL              rGt        |      dk(  r9t        |d   tN              r&t        |d   tN              rt        |d   tB              sJ |       | jE                  | jP                  |d         }
tS        |d         dtS        |d         z  z   |
dz  z   }nt        |tB              sJ d| d       | jE                  | jP                  |      }n|j8                  t:        jV                  v rt        |tX              rU|j[                  t        | j                               | j                   j\                  j_                  |j                        }nt        |t`              sJ |j[                  t        | j                               | j                   jb                  j_                  |j                        }n|j8                  t:        jd                  v rQt        |tf              ruth        jj                  dk\  r!|jm                         |jn                  dz  z   }nA|jn                  }n4|j8                  tp        v r"t        |tr        tt        f      r|jn                  }t        |tR              sJ t        |j                  ||j                        }|r1| jv                  j[                  t        | j                        	|f       th        jj                  dk\  r|jy                         | _        d| _        | j                  j[                  |        th        jj                  dk\  ri }d}d}t{        | j                   j\                        D ]W  \  }}|| jF                  v r$| jF                  j_                  |      ||<   |dz  }8t        | jF                        |z   ||<   |dz  }Y |D ]%  }
| j                  |
   }||j6                     |_        ' t        | jF                        t        | j                   j\                        z   |z
  }nt        | j                   j\                        }|D ]&  }
| j                  |
   }|xj6                  |z  c_        ( y c c}w )NrK  z,Found a CACHE opcode when none was expected.Trl   r   r   r   Fz9Found some manual opcode but less than expected. Missing z CACHE opcodes.rN   r*   zGot z, expected a strrL  r  rr   )>r   r   r0   r   rB   rv  RuntimeErrorrw  r   r   ranger8   r@   r"   rg   rc  r#   r?   r$   r   r   r   r   ru  r%   r2  r   rC   rI   re   rQ  r|  rR  r1   rO  r   rS  r   rE  r   r   r|   r   rT  r   r   r   rn   r   r   rU  r   rt   ru   	_get_maskr+  r   r    r!   rb  r]   	enumerate)rG   r?   cell_instrsfree_instrsr   r   r2  rC   is_jumprh  rn   r^  shared_name_indexesn_shared
n_unsharedrB   free_offsets                    r4   concrete_instructionsz0_ConvertBytecodeToConcrete.concrete_instructionsz  s   ++ "$!#]] D	.E %'EJJ',A++&'UVV)-&$$)$%%-- %%,,
 &+4+?+?%@	 !" * 'T5F5Fr5J5S5S ,-D(-2D*&##'#7#7"8I 
 %'%():):%;E"%+%*((555 9L))*Aq%2C2CUEUEU9..u5  %(66u{{C %((9(9$:Q$>!eU+++||5(U\\-E&%))CG#u%!1!11nnS)!1!11!#s+++hht}}c20::!55"3.HM&s1vt4&s1vs3	
 4
 !HHTZZQ8Ec!f+!4CZZ#88"3.HM&s1vt4&s1vt4&s1vs3 4 !HHTZZQ8Ec!f+CAK75A:FC%c3/M4u<L1MM/((4::s3C0c7+&&s4+<+<'=>--0066sxx@C%c7333&&s4+<+<'=>--0066sxx@C!3!33c7+ ''72!mmoa@!ii*cL,#?@))C c3'''#EJJennMG

!!3t'8'8#95'"JK 7*'.'@'@'B$).&$$W-ID	.T w&24HJ$T]]%;%;< $44==(-1]]-@-@-F'*MH-0-?*-L'*!OJ$ % ?++E21'++>? dmm,s4==3I3I/JJXUKdmm445K  	'E''.GKK;&K	'cs   ,`2
c                 
   g }g }d}t        | j                        D ]^  \  }}|j                  |       |t        r|j                  dz  dz
  n|j                  dz
  z  }|j                  |       |t        rdndz  }` |j                  |       d}| j
                  D ]  \  }}}| j                  |   }||   }	t        j                  dk\  r|j                  dv r|	dz  }	|j                         r-||   }
|	|
t        r|j                  dz  n|j                  z   z  }	n<|j                         r,||   }
|
t        r|j                  dz  n|j                  z   |	z
  }	|j                  }|	|_        |j                  |k7  sd} |r|S | j                  j                         D ]f  \  }}||j                     |_        ||j                      |_        |j"                  }t%        |t&              sJ | j                  |   }||   }	|	|_        h y)Nr   rN   rl   FrL  )FOR_ITERSENDT)r  r   r   r\   rR   rb  rc  rt   ru   rB   r^   r_   rC   ru  rV  r   r   r   r0   r"   )rG   label_offsetsinstruction_offsetsr>   rn   r   modifiedrh  target_indextarget_offsetrZ   old_sizero  r2  lbs                  r4   compute_jumpsz(_ConvertBytecodeToConcrete.compute_jumps$  s)     %d&7&78 		8LE5  ( )>q1$UZZRS^F  &&v.0aa7F		8 	V$ #':: 	 E5%;;u-L),7M
 7*uzz=Q/Q"((*,U3'<EJJ!O%**"  ++-,U3 *?uzzQUZZQ#$  zzH%EIzzX%7	 > O 77==? 	)IB "5U5G5G!HE 3E4E4E FE Bb%(((;;r?L),7M(EL	) r6   compute_jumps_passesr>  c           
      @   t         j                  dk\  rR|rPt        j                  j	                  | j
                        }|j                  d       |j                         | _        || j                  }| j
                  j                  }|t        ur| j                  |       | j                  j                  | j
                  j                         | j                          t!        d|      D ]  }| j#                         }|r n t%        ddz   z        t'        | j(                  t+        | j,                        t+        | j.                        | j                  t1        | j2                  j5                                     }|j7                  | j
                         |S )Nrr   TrA  r   z2compute_jumps() failed to converge after %d passesrl   r   )rt   ru   r8  r9  r:  r   r;  r7  _compute_jumps_passesr2   r   r|  r   r   r[  r  r  r  r  r   r   rE  ry  r   r   ru  valuesr   )rG   r  r>  r<  r3   pasr  concretes           r4   rB  z/_ConvertBytecodeToConcrete.to_concrete_bytecodem  sX   
 w&+I,,::4==IC!!!FOO-DM'#'#=#= mm--e#NN;'T]]334""$01 	C))+H	
 G3QR7S  $))*

#]] !?!?!F!F!HI
 	  /r6   )r.   N)NT)rx   ry   rz   r  r8  rW  rF   r   r|   r|  rq  r   r1   rO  r  r   r  r	   r   rB  r   r6   r4   rs  rs  O  s    
 &Y// &D &$s s  49 C C  h'TGt GV /3/3%&sm% )-% 
	%r6   rs  )=rv   rX  rI   re   r   rt   rC  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r8  bytecode.flagsr   bytecode.instrr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   ru   r\   BaseBytecoder5   r7   r|   r8   r   _BaseBytecodeListr   rs  r   r6   r4   <module>r     s    
    
    "  (      < ((G3 %// % %d % C'y
IcN y
x4
 4
nSy225	9Q3RS SlC Cr6   