3
/*ä^µ  ã               @   s´   d Z ddlmZ ddlmZ ddlmZ ddlmZ	 e	j
ZG dd„ deƒZedkr°dd	lmZ ed
kr¤ddlZejƒ jZeƒ jeƒ\ZZx&eD ]Zeejƒ ƒ qŽW nede ƒ dS )zö
Python 3.8 bytecode decompiler scanner.

Does some additional massaging of xdis-disassembled instructions to
make things easier for decompilation.

This sets up opcodes Python's 3.8 and calls a generalized
scanner routine for Python 3.7 and up.
é    )Úoff2int)Ú	Scanner37)ÚScanner37Base)Ú	opcode_38c                   s.   e Zd Zddd„Zdi df‡ fdd„	Z‡  ZS )Ú	Scanner38Nc             C   s   t j| d|ƒ d| _d S )Ngffffff@F)r   Ú__init__Údebug)ÚselfÚshow_asm© r   úZ/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/scanners/scanner38.pyr   %   s    zScanner38.__init__c                sþ  t t| ƒj||||ƒ\}}i }x"|D ]}|jdkr$|j||j< q$W | jrT|rTt|ƒ g }	|t|ƒd  j	ƒ d }
x‚t
|ƒD ]t\}}|j}|j}||
krè|	jƒ  | jrÀtddt|	ƒ |f ƒ t|	ƒrÐ|	d n|t|ƒd  j	ƒ d }
||kr.t	|| dd}
| jr$tdd	t|	ƒ ||
f ƒ |	j|
ƒ |dkr|t|	ƒr||j}|dkrZ||
krZq||d t|ƒk rˆ||d  dkrˆ|d }n0| j| d }x || jjdƒr¶|d8 }q˜W || }|joÎ|dk}|sì|dkr||j|j	ƒ k r|d|_q|W ||fS )NZ	JUMP_BACKé   é
   z%sremove loop offset %sú F)Zprefer_lastz$%sadding loop offset %s ending at %sz  ÚJUMP_FORWARDÚJUMP_ABSOLUTEZ
COME_FROM_Ú
BREAK_LOOPéÿÿÿÿ)r   r   )Úsuperr   ÚingestÚkindÚoffsetÚattrr   ÚprintÚlenr   Ú	enumerateÚpopÚappendZoffset2tok_indexÚ
startswithZ	linestart)r	   ÚcoÚ	classnameZcode_objectsr
   ÚtokensÚ	customizeZjump_back_targetsÚtokenZ	loop_endsZnext_endÚiÚopnamer   Zjump_targetZjump_back_indexZjump_back_tokenZ
break_loop)Ú	__class__r   r   r   ,   sX    



(

$
zScanner38.ingest)N)Ú__name__Ú
__module__Ú__qualname__r   r   Ú__classcell__r   r   )r&   r   r   $   s   
r   Ú__main__)ÚPYTHON_VERSIONgffffff@Nz'Need to be Python 3.8 to demo; I am %s.)Ú__doc__Zuncompyle6.scanners.tokr   Zuncompyle6.scanners.scanner37r   Z!uncompyle6.scanners.scanner37baser   Zxdis.opcodesr   ZopcZJUMP_OPSZJUMP_OPsr   r'   Ú
uncompyle6r,   ÚinspectÚcurrentframeÚf_coder   r   r!   r"   Útr   Úformatr   r   r   r   Ú<module>   s"   [

