
    jHk                         d dl m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 d dlmZ d dlmZ  G d d          Zd	 Zd
S )    )unpack)logger)mutf8)	BaseClassBinaryCompExpressionBinaryExpressionConstantInstanceExpressionNewInstance	ThisParamVariable)Op)get_typec                      e Zd ZdZd Zd Zdee         fdZdCdZ	dCdZ
d	 Zd
 ZdDdZd Zd ZdEdZ	 	 	 dFdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z dDd!Z!d" Z"dDd#Z#d$ Z$d% Z%d& Z&d' Z'd( Z(dDd)Z)d* Z*dDd+Z+dDd,Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2d3 Z3d4 Z4d5 Z5d6 Z6d7 Z7dDd8Z8d9 Z9d: Z:d; Z;d< Z<d= Z=d> Z>d? Z?d@ Z@dDdAZAdB ZBdS )GWriterz.
    Transforms a method into Java code.

    c                     || _         || _        t                      | _        d| _        g | _        g | _        d g| _        d g| _        d g| _	        d g| _
        d g| _        d | _        d| _        d| _        d S )N   FT)graphmethodsetvisited_nodesindbufferbuffer2loop_follow	if_followswitch_follow
latch_node
try_follow	next_caseskip
need_break)selfr   r   s      c/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/androguard/decompiler/writer.py__init__zWriter.__init__+   sy    
 UU 6"V&&	    c                 J    d                     d | j        D                       S )N c                 ,    g | ]}t          |          S  )str).0is     r$   
<listcomp>z"Writer.__str__.<locals>.<listcomp><   s    4441A444r&   )joinr   r#   s    r$   __str__zWriter.__str__;   s%    ww44444555r&   returnc                     | j         S N)r   r0   s    r$   str_extzWriter.str_ext>   s
    |r&      c                 ,    | xj         d|z  z  c_         d S Nr   r   r#   r-   s     r$   inc_indzWriter.inc_indA       AEr&   c                 ,    | xj         d|z  z  c_         d S r8   r9   r:   s     r$   dec_indzWriter.dec_indD   r<   r&   c                 6    | j         r	d| _         dS d| j        z  S )NFr(    )r!   r   r0   s    r$   spacezWriter.spaceG   s$    9 	DI2TX~r&   c                     | j         r	d| _         d S |                     |                                            |                     d|                                 f           d S )NFINDENTATION)r!   writerA   	write_extr0   s    r$   	write_indzWriter.write_indM   sV    9 	:DIIIJJtzz||$$$NNM4::<<899999r&   Nc                 z    | j                             |           |r| j                            ||f           d S d S r4   )r   appendr   )r#   sdatas      r$   rD   zWriter.writeT   sL    1  	+Lq	*****	+ 	+r&   c                     t          |t                    sdt          |          z  | j                            |           d S )Nz"Error in write_ext: %s not a tuple)
isinstancetupler+   r   rH   )r#   ts     r$   rE   zWriter.write_ext`   sB    !U## 	@6Q??Ar&   c                 Z    |                      d           |                     d           d S )N;
)END_INSTRUCTIONrP   rD   rE   r0   s    r$   end_inszWriter.end_inse   s-    

5122222r&   c                    |                                   |                    |            |                     |           |                     d||f           ||                    |            |                                  d S )N	TODO_4343rF   visitrD   rE   rS   )r#   lhsrI   rhsrJ   s        r$   write_ind_visit_endzWriter.write_ind_visit_endi   sn    		$

1Q-...?IIdOOOr&   UNKNOWN_SUBSECTIONc                 p   |                                   |                    |            |                     ||z   |z              |                     d|f           |                     |||f           |                     d|f           ||                    |            |                                  d S )NBEFOREAFTERrV   )r#   rX   beforerI   afterrY   rJ   
subsections           r$   write_ind_visit_end_extzWriter.write_ind_visit_end_extt   s     			$

6A:%&&&&)***
At,---'(((?IIdOOOr&   c                    t          |t                    r||j        |j                 k    r|j        |j                 }|j        dv rMt          |t                    r8|                                dk    r |                     ||j        dz  |          S |                     |d|j        z  ||          S |                     |d||          S )Nz+-r6      rJ   z %s=  = )	rL   r   var_maparg1arg2opr	   get_int_valuerZ   )r#   rX   rY   exp_rhss       r$   write_inplace_if_possiblez Writer.write_inplace_if_possible   s    c+,, 
	CH8M1M1Mk#(+G$w11 ))++q00//SVaZc/JJJ++Wsv%wS ,    ''UCc'BBBr&   c                 0    |                     |            d S r4   rW   )r#   inss     r$   	visit_inszWriter.visit_ins       		$r&   c                 t	   g }| j         j        }d| _        |D ]%}|dk    rd| _        |                    |           &|                     d|                                 z             |                     dd|                                 z  f           |rX|                     dd                    |          z             |                     ddd                    |          z  f           | j        rht          | j         j	                  
                    d	          d
         }|                     |           |                     dd|z  | j         f           n|                     d                    t          | j         j                  | j         j                             |                     ddt          | j         j                  z  f           |                     d           |                     dd| j         j        z  | j         f           | j         j        }d|vr
|dd          }|s?| j         j        r3t!          t#          t%          | j         j                                      }d}|                     d           | j         j        rd                    d t'          | j         j        |          D                       }d}t'          | j         j        |          D ]|\  }}	|s|                     d           nd}|                     ddt          |          z  f           |                     d           |                     dd|	z  || j         f           }|                     d           |                     d|z             | j        ,|                     d           |                     d           d S |                     d|                                 z             |                     dd|                                 z  f           |                                  |                     | j        j                   |                                  |                     d |                                 z             |                     d!d |                                 z  f           d S )"NFconstructorTz
%sNEWLINE%s r@   PROTOTYPE_ACCESS.NAME_METHOD_PROTOTYPE%sz{} {}PROTOTYPE_TYPESPACEr@   staticr6   r(   )PARENTHESIS_START(, c                 Z    g | ](\  }}d                      t          |          |          )S )z{} p{})formatr   )r,   p_typeparams      r$   r.   z'Writer.write_method.<locals>.<listcomp>   sB       % OOHV$4$4e<<  r&   )COMMAr   ARG_TYPENAME_ARGp%s)PARENTHESIS_END)z(%s)rP   )METHOD_END_NO_CONTENTrP   z
%s{
METHOD_START%s}

METHOD_END)r   accessrt   rH   rD   rA   rE   r/   r   cls_namesplitr   typenamelparamsparams_typelistrangelenzipr   r;   
visit_nodeentryr>   )
r#   accr   modifierr   paramsprotofirstr   r   s
             r$   write_methodzWriter.write_method   s|   #  	! 	!H=((#' JJx    

6DJJLL()))	6TZZ\\#:;<<< 	HJJusxx}},---NN.0EFGGG 	DK01177<<R@DJJtNN3TD[$+NOOOOJJx(8994;;KLL   NN!4(4;3C*D*D#DE   NN>***NN($1A*A4;O   $6!!ABBZF 	?$+1 	?%DK$; < <==>>F1222;" 	II ),T[-Df)M)M   E E!$T[%<f!E!E 	 	 "NN?3333!E
D8F3C3C,CDEEE~...D    	/000

6E>""":JJuNN;<<<F

9tzz||+,,,	DJJLL(@ABBB
()))

7TZZ\\)***g

&<=>>>>>r&   c                 b   || j         d         | j        d         | j        d         | j        d         | j        d         fv rd S |j        j        s|| j        v rd S | j                            |           |j	        D ]}|
                    |            d|_        |                    |            d S )Nry   T)r   r   r   r   r   r   	is_returnr   addvar_to_declare
visit_decldeclaredrW   )r#   nodevars      r$   r   zWriter.visit_node   s    N2r"R OBOB
 
 
 Fy" 	tt/A'A'AFt$$$& 	  	 CNN4   CLL

4r&   c                    |j         d         }| |j        j        st          j        d           |j        j        r|j        |u r-|                                 |j        |j        c|_        |_        | 	                    d| 
                                z             |                     dd| 
                                z  f           |                    |            | 	                    d           |                     d           n|j        j        rv| 	                    d| 
                                z             |                     dd| 
                                z  f           | j                            |j                   nb|j        j        rV| 	                    d	| 
                                z             |                     d
d	| 
                                z  f           |                                  | j                            |           |j        j        r|                     |j                   n|                     |j                   | j                                         |                                  |j        j        rX| 	                    d| 
                                z             |                     dd| 
                                z  f           nX|j        j        r| j                                         | 	                    d| 
                                z             |                     dd| 
                                z  f           |j                            |            | 	                    d           |                     d           n|                                  |                     |j                   |                                  | 	                    d| 
                                z             |                     dd| 
                                z  f           ||                     |           d S d S )NloopzLoop has no follow !z	%swhile (WHILE) {
)WHILE_STARTr   z%sdo {
DOz%swhile(true) {

WHILE_TRUEr   END_PRETESTz
%s} while(WHILE_POSTTEST);
)POSTTEST_ENDr   END_LOOP)followlooptype
is_endlessr   error
is_pretesttruenegfalserD   rA   rE   
visit_condis_posttestr   rH   latchr;   r   r   condpopr>   )r#   r   r   s      r$   visit_loop_nodezWriter.visit_loop_node   s   V$>$-":>L/000=# 	OyF""


(,
DI%	4:JJ{TZZ\\1222NNG[4::<<%?@AAAOOD!!!JJwNN34444]& 	OJJzDJJLL0111NND*tzz||";<===O""4:....]% 	OJJ*TZZ\\9:::NNL*=

*LMNNN'''=# 	'OODI&&&&OODI&&&=# 	AJJw-...NNM7TZZ\\+ABCCCC]& 	AO!!!JJ|djjll2333NN,lTZZ\\.IJKKKJ!!$'''JJvNN34444LLNNNOODJ'''LLNNNJJw-...NNJ$**,,(>?@@@OOF##### r&   c                    |j         d         }|j        |j        u r[|                     d|                                 z             |                     dd|                                 z  f           |                     d|                                 z             |                     dd|                                 z  f           |                    |            |                     d           |                     d           |                                  |                     |j                   | 	                                 |                     d|                                 z  d	
           d S |j        | j
        d         u r-|                                 |j        |j        c|_        |_        | j
        d         |j        |j        fv r|                     d|                                 z  d
           |                    |            |                     dd
           |                                  |                     d|                                 z  d
           | 	                                 |                     d|                                 z  d
           |                     |j                   d S ||j        || j        fv s|j        |j        j        k    r-|                                 |j        |j        c|_        |_        | j                            |           |j        r|                     d|                                 z  d
           |                    |            |                     dd
           |                                  |                     |j                   | 	                                 ||j        |j        fv}|r||j        | j        vrn|                     d|                                 z  d
           |                                  |                     |j                   | 	                                 | j                                         |                     d|                                 z  d
           |                     |           d S |                     d|                                 z  d
           |                    |            |                     dd
           |                                  |                     |j                   | 	                                 |                     d|                                 z  d
           |                                  |                     |j                   | 	                                 |                     d|                                 z  d
           d S )Nifz<%s// Both branches of the condition point to the same code.
COMMENT_ERROR_MSGz	%s// if (
COMMENT_IFr   )COMMENT_COND_ENDr   z%s// }
COMMENT_IF_COND_ENDre   ry   z%sif (IF_2	IF_TRUE_2	%sbreak;
BREAKr   IF_END_2IFIF_TRUEz%s} else {
IF_FALSEIF_ENDIF_3	IF_COND_3ELSE_3IF_END_3)r   r   r   rD   rA   rE   r   r;   r   r>   r   r   r    numr   rH   r   r   )r#   r   r   is_elses       r$   visit_cond_nodezWriter.visit_cond_node#  s   T":""JJ!ZZ\\*   NN'!%.   JJ{TZZ\\1222NNL+

*DEFFFOOD!!!JJwNN8999LLNNNOODI&&&LLNNNJJzDJJLL07LJMMMF:)"---HHJJJ$(J	!DItzBDItz#:::JJx$**,,.VJ<<<OOD!!!JJw[J111LLNNNJJ|djjll2JAAALLNNNJJw-JJ???OODJ'''''	fdn5558dim++ 


(,
DI%	4:N!!&)))y 

8djjll2
>>>%%%

7
333	***!di%<<G tzT-???

>DJJLL8z
JJJ
+++N   JJw-HJ===OOF#####JJx$**,,.VJ<<<OOD!!!JJw[J111LLNNNOODI&&&LLNNNJJ~

48JDDDLLNNNOODJ'''LLNNNJJw-JJ?????r&   c                 &   |r|                                  |                     dd           |                    |            |                     dddg|         z  d           |                    |            |                     dd	           d S )
Nr   TODO24re   z) %s (z||z&&TODO25r   TODO26)r   rD   r   )r#   nnotaandcond1cond2s        r$   visit_short_circuit_conditionz$Writer.visit_short_circuit_conditionm  s     	IIKKK

3X
&&&

8tTl400x
@@@

3X
&&&&&r&   c                    |                                 }|d d         D ]}|                     |           |                                 d         }|                     d|                                 z  d           |                     |           |                     dd           |j        d         }|j        }| j                            |           |j        }t          |          D ];\  }}	|	| j
        v r|                                  |j        |	         D ]0}
|                     d|                                 |
fz  d	           1|d
z   t          |          k     r||d
z            | _        nd | _        |	|u r.|                     d|                                 z  d           d }|                                  |                     |	           | j        r-|                     d|                                 z  d           nd| _        |                     d           =|d |fvr~|                                  |                     d|                                 z  d           |                                  |                     |           |                     d           |                     d|                                 z  d           | j                                         |                     |           d S )Nry   z
%sswitch (SWITCHre   r   
SWITCH_ENDswitchz%scase %d:
CASE_XXr6   z%sdefault:
CASE_DEFAULTr   
CASE_BREAKTrd   CASE_DEFAULT_2r   CASE_END)get_insrq   rD   rA   r   casesr   rH   default	enumerater   r;   node_to_caser   r    r   r"   r>   r   )r#   r   linsrp   
switch_insr   r   r   r-   r   cases              r$   visit_switch_nodezWriter.visit_switch_nodev  s   ~~9 	  	 CNN3^^%%b)


<$**,,.X
>>>z"""

7
...x(!!&))). '' 	 	GAtt)))LLNNN+D1  

"djjllD%99	      1us5zz!!!&q1u!%w

>DJJLL8~
NNNLLNNNOOD!!! '

<$**,,6\
JJJJ"&LLOOOO4.((LLNNNJJ~

4;KJLLLLLNNNOOG$$$LLOOO

7TZZ\\)

;;;   r&   c                    | j                             |          }|                                D ]}|                     |           t	          |          dk    rx|d         | j        d         u r.|                     d|                                 z  d           d S |d         | j        u r	d| _	        d S | 
                    |d                    d S d S )Nr6   r   ry   r   BREAK_2re   F)r   sucsr   rq   r   r   rD   rA   r    r"   r   )r#   stmtr   rp   s       r$   visit_statement_nodezWriter.visit_statement_node  s    zt$$<<>> 	  	 CNN3t99>>Aw$*2...

<$**,,6Y
GGGGGaDN**"'Q((((( >r&   c                 <   |                      d|                                 z  d           |                                  | j                            |j                   |                     |j                   |                                  |                      d|                                 z  d           |j	        D ]}|                     |           |                      dd           |                     | j        
                                           d S )Nz%stry {
	TRY_STARTre   %s}TRY_START_END
NEWLINE_END_TRY)rD   rA   r;   r   rH   r   r   	try_startr>   catchr   )r#   try_noder  s      r$   visit_try_nodezWriter.visit_try_node  s    

;-K
@@@x///*+++

54::<<'o
>>>^ 	# 	#EOOE""""

4/
000++--.....r&   c                 h   |                      dd           |                    |            |                      dd           |                                  |                     |j                   |                                  |                      d|                                 z  d           d S )Nz catch (CATCHre   r   CATCH_STARTr   	CATCH_END)rD   visit_exceptionr;   r   catch_startr>   rA   )r#   
catch_nodes     r$   visit_catch_nodezWriter.visit_catch_node  s    

:G
,,,""4(((

7
///
.///

54::<<'k
:::::r&   c                 l    d| _         |                                D ]}|                     |           d S )NF)r"   r   rq   )r#   retrp   s      r$   visit_return_nodezWriter.visit_return_node  s?    ;;== 	  	 CNN3	  	 r&   c                 ^    |                                 D ]}|                     |           d S r4   )r   rq   )r#   throwrp   s      r$   visit_throw_nodezWriter.visit_throw_node  s8    ==?? 	  	 CNN3	  	 r&   c                    |j         s||                                pd}|                     d                    |                                 t          |          |j                  d           |                                  d S d S )NunknownTypez{}{} v{}DECLARATIONre   )r   r   rD   r   rA   r   rS   r#   r   var_types      r$   r   zWriter.visit_decl  s    | 	||~~6HJJ!!$**,,0B0BCHMM"     LLNNNNN	 	r&   c                     t          |t                    r$|                     t          |          d          S |                     d|z  d           d S )NCONSTANT_STRINGre   z%rCONSTANT_INTEGER)rL   r+   rD   string)r#   csts     r$   visit_constantzWriter.visit_constant  sa    c3 	C::fSkk0A:BBB

3J/ 	 	
 	
 	
 	
 	
r&   c                 `    |                      |           |                     d||f           d S )NNAME_BASE_CLASSrR   )r#   clsrJ   s      r$   visit_base_classzWriter.visit_base_class  s1    

3)3566666r&   c                    |                                 pd}|j        si|                     dt          |          z             |                     ddt          |          z  |f           |                     d           d|_        |                     d|j        z             |                     dd|j        z  ||f           d S )	Nr  rv   VARIABLE_TYPEr{   r}   Tv%sNAME_VARIABLE)r   r   rD   rE   r   r  s      r$   visit_variablezWriter.visit_variable  s    <<>>2]| 	 JJux111222NN $(););";XF   NN>***CL

538#$$$)93IJJJJJr&   c                 l    |                      d|z             |                     dd|z  |f           d S )Nr   
NAME_PARAMrR   )r#   r   rJ   s      r$   visit_paramzWriter.visit_param  s;    

55=!!!eemT:;;;;;r&   c                 4    |                      dd           d S )NthisTHISre   rD   r0   s    r$   
visit_thiszWriter.visit_this  s    

6
'''''r&   c                 0    |                      d           d S )Nsuperr.  r0   s    r$   visit_superzWriter.visit_super  s    

7r&   c                     ||                      ||          S |                                  |                    |            | j        s|                                  d S d S r4   )rm   rF   rW   r!   rS   r#   rX   rY   s      r$   visit_assignzWriter.visit_assign  sa    ?11#s;;;		$y 	LLNNNNN	 	r&   c                 4    |                      |d|           d S )Nrf   )rZ   r4  s      r$   visit_move_resultzWriter.visit_move_result  s       eS11111r&   c                 >    ||ur|                      ||           d S d S r4   )rm   r4  s      r$   
visit_movezWriter.visit_move  s.    c>>**344444 >r&   c                 4   |                                   |                    |            |                     dd|f           |                    |            |                     dd           |                    |            |                                  d S )N[ASTORE_STARTre   z] = 
ASTORE_END)rF   rW   rD   rS   )r#   arrayindexrY   rJ   s        r$   visit_astorezWriter.visit_astore  s    D

3nd3
444D

6
---		$r&   c                     |                                   |                     d                    ||          d           |                    |            |                                  d S )Nz{}.{} = 
STATIC_PUTre   )rF   rD   r   rW   rS   )r#   r!  r   rY   s       r$   visit_put_staticzWriter.visit_put_static  sX    

:$$S$//l
CCC		$r&   c           	      D    |                      |dd|z  d||d           d S )Nrx   r{   rf   NAME_CLASS_ASSIGNMENT)rJ   ra   )rb   )r#   rX   r   rY   rJ   s        r$   visit_put_instancezWriter.visit_put_instance  sB    $$4K. 	% 	
 	
 	
 	
 	
r&   c                     |                      dt          |          z             |                     d           |                     ddt          |          z  |j        |f           d S )Nznew %s)NEWznew NAME_CLASS_NEWr{   )rD   r   rE   r   )r#   atyperJ   s      r$   	visit_newzWriter.visit_new  sj    

8huoo-...'''thuoo5ty$G	
 	
 	
 	
 	
r&   c           	         t          |t                    r^|dk    rX| j        rt          |          dk    r	d| _        d S |r3|j        dd                             dd          |j        k    rd|_        |	                    |            |dk    rt          |t                    rd                    |j        |          }n
t          |t                    rd                    |j        |          }nt          |d	          r{t          |d
          rk|}	 |j        |j                 }t          |t"                    rd                    |j        |          }n$t          |d	          rt          |d
          red}	 nNt          |t                    rd|z  }n3t          |t$                    rd                    |j        |          }nd}|                     d|z             |                     d           |                     dd|z  |||||f           |                     dd           d}	|D ]2}
|	r|                     dd           d}	|
	                    |            3|                     dd           d S )Nz<init>r   Tr6   ry   /rx   z{} -> {}baserg   UNKNOWN_TODOz
this -> %sUNKNOWN_TODO2.%s)INVOKErx   NAME_METHOD_INVOKEr{   r   PARAM_STARTre   Fr   PARAM_SEPARATORr   	PARAM_END)rL   r   rt   r   r!   r   replacer!  r1  rW   r   r   r
   ftypehasattrrg   rN  r   r   rD   rE   )r#   r   rN  ptypertypeargsinvokeInstr	call_name	base2basecommaargs              r$   visit_invokezWriter.visit_invoke&  s   dI&& 		&x# D		Q $DIF&	!B$//S99[_LL!%DJ

48$	** ,&--dh==		D"455 ,&--dj$??		v&& ,74+C+C , 	 ) 1). AI!)[99 	$.$5$5ind$K$K	 F33 !99 9  !$2	D),, ,(4/		D(++ ,&--di>>		+	JJut|$$$NN?+++NN(4K
 
 
 	

3]
+++ 	 	C 9

4&7
888EIIdOOOO

3[
)))))r&   c                     |                                   |                     dd           |                                  d S )Nr2   RETURNre   )rF   rD   rS   r0   s    r$   visit_return_voidzWriter.visit_return_voida  s9    

8(
+++r&   c                     |                                   |                     dd           |                    |            |                                  d S )Nzreturn rd  re   rF   rD   rW   rS   r#   ra  s     r$   visit_returnzWriter.visit_returnf  sH    

98
,,,		$r&   c                     d S r4   r*   r0   s    r$   	visit_nopzWriter.visit_nopl  s    r&   c                 0    |                     |            d S r4   ro   rh  s     r$   visit_switchzWriter.visit_switcho  rr   r&   c                     |                      d|z  d           |                    |            |                      d           d S )Nz((%s) 	CHECKCASTre   r   rD   rW   )r#   ra  rJ  s      r$   visit_check_castzWriter.visit_check_castr  s?    

8e#+
666		$

3r&   c                     |                     |            |                     dd           |                     |            |                     dd           d S )Nr;  ALOAD_STARTre   ]	ALOAD_ENDrW   rD   )r#   r>  r?  s      r$   visit_aloadzWriter.visit_aloadw  sX    D

3]
+++D

3[
)))))r&   c                 ^    |                     |            |                     dd           d S )Nz.lengthARRAY_LENGTHre   rv  )r#   r>  s     r$   visit_alengthzWriter.visit_alength}  s0    D

9>
22222r&   c                     |                      dt          |dd                    z  d           |                    |            |                      dd           d S )Nznew %s[r6   	NEW_ARRAYre   rt  NEW_ARRAY_END)rD   r   rW   )r#   rJ  sizes      r$   visit_new_arrayzWriter.visit_new_array  s[    

9xabb	222
EEE

4

3_
-----r&   c                 0   |                      dt          |          z  d           t          |          D ]G\  }}|                    |            |dz   t	          |          k     r|                      dd           H|                      dd           d S )	Nznew %s {NEW_ARRAY_FILLEDre   r6   r   r   z})NEW_ARRAY_FILLED_END)rD   r   r   rW   r   )r#   rJ  r~  r\  idxra  s         r$   visit_filled_new_arrayzWriter.visit_filled_new_array  s    

:/6H
III!$ 	/ 	/HCIIdOOOQwT""

4g
...

44
55555r&   c                    |                                   |                    |            |                     dd           |                                }g }|j        }ddddd}||v r	||         }n+t          j        d	                    |                     d}d
}t          d|j	        |z  |          D ]9}|
                    dt          |||||z                      d         z             :|                     d                    |          d           |                     dd           |                                  d S )Nz = {ARRAY_FILLEDre   bhr-   d)r6   rd   r      z0Unknown element size {} for array. Assume bytes.r6   r   r{   r   r   }ARRAY_FILLED_END)rF   rW   rD   get_dataelement_widthr   warningr   r   r~  rH   r   r/   rS   )	r#   r>  valuerJ   tab	elem_size
data_typeselem_idr-   s	            r$   visit_fill_arrayzWriter.visit_fill_array  s[   D

6
///~~'	 55

"" +GG NBII   
 GIq%*y0)<< 	K 	KAJJtfWd1q9}3D.EFFqIIJJJJ

499S>>
000

3/
000r&   c                    d|_         |                                pd}|                     d                    t          |          |j                             |                     ddt          |          z  |j        f           |                     d           |                     dd|                                z  |j        |f           d S )	NTr  z{} v{}EXCEPTION_TYPEr{   r}   NAME_CLASS_EXCEPTIONr%  )r   r   rD   r   r   rE   r   r  )r#   r   rJ   r  s       r$   visit_move_exceptionzWriter.visit_move_exception  s    <<>>2]

8??8H#5#5sx@@AAAthx&8&88$)D	
 	
 	
 	~&&&#USYY[[%8$)TJ	
 	
 	
 	
 	
r&   c                     |                                   |                     dd           |                    |            |                     dd           |                                  d S )Nzsynchronized(SYNCHRONIZEDre   r   SYNCHRONIZED_END)rF   rD   rW   r;   r#   refs     r$   visit_monitor_enterzWriter.visit_monitor_enter  s_    

?
888		$

7!3
444r&   c                     |                                   |                                  |                     dd           d S )Nz}
MONITOR_EXITre   )r>   rF   rD   r  s     r$   visit_monitor_exitzWriter.visit_monitor_exit  s;    

5~
.....r&   c                     |                                   |                     dd           |                    |            |                                  d S )Nzthrow THROWre   rg  r  s     r$   visit_throwzWriter.visit_throw  sH    

8'
***		$r&   c                     |                      dd           |                    |            |                      d|z  d           |                    |            |                      dd           d S )Nr   BINARY_EXPRESSION_STARTre    %s TODO58r   BINARY_EXPRESSION_ENDrp  r#   rj   rh   ri   s       r$   visit_binary_expressionzWriter.visit_binary_expression  st    

36
777

4

6B;X
...

4

34
55555r&   c                     |                      d|z  d           |                    |            |                      dd           d S )N(%s UNARY_EXPRESSION_STARTre   r   UNARY_EXPRESSION_ENDrp  r#   rj   ra  s      r$   visit_unary_expressionzWriter.visit_unary_expression  sI    

6B;%=
>>>		$

33
44444r&   c                     |                      d|z  d           |                    |            |                      dd           d S )Nr  
CAST_STARTre   r   CAST_ENDrp  r  s      r$   
visit_castzWriter.visit_cast  sG    

6B;\
222		$

3Z
(((((r&   c                     |                     |            |                     d|z  d           |                     |            d S )Nr  COND_EXPRESSIONre   rv  r  s       r$   visit_cond_expressionzWriter.visit_cond_expression  sG    

4

6B;%6
777

4r&   c                    t          |t                    r||_        |                    |           S t	          |                                          }|dk    r>|t          j        k    r|                     dd           |                    |            d S |                    |            	 |j	        }n# t          $ r Y nw xY w|dv r|                     d|z  d           d S |                     d|z  d	           d S )
NZ!NEGATEre   VBSCIJFDz %s 0TODO64z %s nullTODO65)rL   r   rj   rW   r+   r   r   EQUALrD   r  AttributeError)r#   rj   ra  rJ  s       r$   visit_condz_expressionzWriter.visit_condz_expression  s   c/00 	#CF99T??"CLLNN##C<<RX~~

3X
...IIdOOOOOIIdOOO!   
""

7R<h
77777

:?
:::::s   -B5 5
CCc                     |                     |            |                     d|z             |                     d           |                     dd|z  |f           d S )NrQ  )GET_INSTANCErx   NAME_CLASS_INSTANCEr{   )rW   rD   rE   )r#   ra  r   rJ   s       r$   visit_get_instancezWriter.visit_get_instance  s^    		$

54<   ,----td{DABBBBBr&   c                 \    |                      d                    ||          d           d S )Nz{}.{}
GET_STATICre   )rD   r   )r#   r!  r   s      r$   visit_get_staticzWriter.visit_get_static  s,    

7>>#t,,<
@@@@@r&   )r6   r4   )NN)NNr[   )C__name__
__module____qualname____doc__r%   r1   r   rM   r5   r;   r>   rA   rF   rD   rE   rS   rZ   rb   rm   rq   r   r   r   r   r   r   r   r  r  r  r  r   r  r"  r'  r*  r/  r2  r5  r7  r9  r@  rC  rF  rK  rb  re  ri  rk  rm  rq  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*   r&   r$   r   r   %   s%        
   6 6 6e            : : :+ + + +  
3 3 3   " '   (C C C  H? H? H?T  "-$ -$ -$^H@ H@ H@T' ' '*  *  * X
) 
) 
)
/ 
/ 
/; ; ;     
       
 
 
7 7 7 7
K 
K 
K< < < <( ( (    2 2 25 5 5     	
 	
 	
 	

 
 
 
9* 9* 9*v  
        
* * *3 3 3. . .
6 6 6  :

 

 

 

  / / /
  6 6 65 5 5
) ) )
  
; ; ;(C C C CA A A A Ar&   r   c                    dg}| D ],}d|cxk    rdk     r@n n=|dk    s|dk    s|dk    r|                     d           |                     |           P|dk    r@|dv r<|                     |                    d                              d                     t          |          }|                     d	           |                     d
|dz	  z             |                     d
|dz	  dz  z             |                     d
|dz	  dz  z             |                     d
|dz  z             .|                     d           d                    |          S )z
    Convert a string to a escaped ASCII representation including quotation marks
    :param s: a string
    :return: ASCII escaped string
    "r@   '\)r   	zunicode-escapeasciiz\uz%x   r     r   r(   )rH   encodedecodeordr/   )rI   r  cr-   s       r$   r  r    sq    %C & &!fCxx188qDyy

4   JJqMMM&[[&&&

188$455<<WEEFFFFF

5

417#$$$

4AFd?+,,,

4AFd?+,,,

41t8$%%%%JJsOOO773<<r&   N)structr   logurur   androguard.corer   !androguard.decompiler.instructionr   r   r   r	   r
   r   r   r    androguard.decompiler.opcode_insr   androguard.decompiler.utilr   r   r  r*   r&   r$   <module>r     s  $             ! ! ! ! ! !	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 0 / / / / / / / / / / /UA UA UA UA UA UA UA UAp    r&   