
    UHjq                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ  ee      j                         j                   d   Zedz  Zd	d
ddddddddgZddZddZddZddZefddZddZedk(  r e        yy)zESummarize runtime state tables used by save-selector stream branches.    )annotationsN)Path)find_value_refs)offset_to_varead_sections   outprimaryBranchStateipY    zopcode 0x11 stream+1 == 0)namebaseVaslotsusedWhensecondaryBranchStatei`Y zopcode 0x11 stream+1 != 0c                2   |d   }|d   }| t        d|dz
        | }| |dz   |dz    }|d   |d|d|d	   d|d	   d
d|d
dd}|dk\  r(| |dz
  | dk(  r|rd|d<   |d   |d<   d|d   d|d<   |S |dk\  r| |dz
  | dk(  rd|d<   |S |dd  dv rd|d<   |S )N
fileOffsetvaluer      r   section0x06xrefVa08xunknown)r   r   fileOffsetHexr   refVaHexvalueHexkind   s   ƀindexedWriteImmediater   
writeValue02xwriteValueHexs   indexedReadByte>         baseAddressImmediate)max)exerefoffsetr   beforeafteritems          A/home/exedev/hwanse/tools/summarize_save_selector_branch_state.pyclassify_refr1   !   s    FLEQ
#V,F
FRK(Ey>fS\*WWc*+s$D {s6A:v.+=%.V"1X\"$U1XcN 3_ K 
1VaZ0K?(V K 
*	*-VK    c                   t        |       }g }t        D ]  }t        | ||d   dh      D cg c]  }t        | |       }}i }i }|D ]P  }|j	                  |d   d      dz   ||d   <   |j	                  d      s3|j	                  |d   d      dz   ||d   <   R |j                  i |d|d   dd|d   dd	|d   |d
   z   dz
  d|||d        d|ddddS c c}w )Nr   z.textr   r   r   r#   r   r   z..0xr   )	baseVaHexrangeHexrefsrefKindCountswriteValueCountszCruntime branch state tables referenced by save-selector opcode 0x11
0x0040b4e6ziread table[(context+0xa8)[stream+2]]; value 1 falls through +8, any other value jumps to dword [stream+4])handlerVaHex	condition)scopetablesopcode11)r   STATE_TABLESr   r1   getappend)r*   sectionsr=   tabler+   r6   by_kindwrite_valuess           r0   build_summaryrF   =   sW   S!HF  'sHeHoyQ
 c"
 
 #%') 	cC#*;;s6{A#>#BGCK ww'5A5E5Ec/FZ\]5^ab5bS12	c 	 

eHoc23U8_S1eHog6VYZ6Z[^5_`$ ,
 	( W(<

 
%
s   Cc                   ddddd| d   d    d| d   d   dd	d
g	}| d   D ]  }dj                  d t        |d   j                               D              xs d}dj                  d t        |d   j                               D              xs d}|j                  d|d    d|d    d|d    dt	        |d          d| d| d        |j                  g d       | d   D ]r  }|j                  d|d    d|d    dddg       |d   D ]6  }|j                  d |d!    d|d"    d|j                  d#      xs d d$       8 |j                  d       t d%j                  |      S )&Nz# Save Selector Branch State z9Runtime state tables used by save-selector opcode `0x11`.zOpcode 0x11 handler: `r>   r:   z`.r;   z?| table | range | used when | refs | ref kinds | write values |z&| --- | --- | --- | ---: | --- | --- |r=   , c              3  0   K   | ]  \  }}| d |   yw:N .0keyr   s      r0   	<genexpr>zmarkdown.<locals>.<genexpr>m        dzsESE5'*d   r7   -c              3  0   K   | ]  \  }}| d |   ywrK   rM   rN   s      r0   rQ   zmarkdown.<locals>.<genexpr>n        h
UcU!E7+hrS   r8   z| r   z | `r5   z` | r   z | r6   z |)rH   z## ReferencesrH   z###  z| ref | kind | write value |z| --- | --- | --- |z| `r   r   r#   z` |
)joinsorteditemsrA   lenextendr@   )summarylinesrC   kindswritesr+   s         r0   markdownrb   `   s   &
C

 !4^!D ERH
K(
I0
E " 
		dVE/DZD`D`Db=cddkhkhfUK]E^EdEdEf>ghholovtE*$5#6d5;L:MS5=!"#eWCxr;	

 
LL*+" 5=/5#4"56*!	
 	 = 	CLLc*o&d3v;-tCGGO<T<[X[;\\_`	 	R 99Ur2   c                   g }| d   D ]  }dj                  d t        |d   j                               D              xs d}dj                  d t        |d   j                               D              xs d}|j                  dt	        j
                  |d	          d
t	        j
                  |d          dt	        j
                  |d          dt        |d          dt	        j
                  |       dt	        j
                  |       d       
 g }| d   D ]  }g }|d   D ]o  }|j                  dt	        j
                  |d          dt	        j
                  |d          d
t	        j
                  |j                  d      xs d       d       q |j                  dt	        j
                  |d	          dt	        j
                  |d          ddj                  |       d        dj                  ddddd d!d"d#d$d%d&d'd(d)d*d+d,t	        j
                  | d-   d.          d/d0t	        j
                  | d-   d1          d2d3d4dj                  |       ddj                  |      d5d6dg      S )7Nr=   rI   c              3  0   K   | ]  \  }}| d |   ywrK   rM   rN   s      r0   rQ   zhtml_page.<locals>.<genexpr>   rR   rS   r7   rT   c              3  0   K   | ]  \  }}| d |   ywrK   rM   rN   s      r0   rQ   zhtml_page.<locals>.<genexpr>   rV   rS   r8   z<tr><td>r   z</td><td><code>r5   z</code></td><td>r   z	</td><td>r6   z
</td></tr>z<tr><td><code>r   r   r#   z</code></td></tr>z<h2>rW   zX</h2><table><thead><tr><th>ref</th><th>kind</th><th>write value</th></tr></thead><tbody>rH   z</tbody></table>rX   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z+  <title>Save Selector Branch State</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin-bottom: 24px; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z    th { background: #1d1d1d; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z%  <h1>Save Selector Branch State</h1>z   <p>Opcode 0x11 handler: <code>r>   r:   z</code>.</p>z  <p>r;   z</p>z  <table><thead><tr><th>table</th><th>range</th><th>used when</th><th>refs</th><th>ref kinds</th><th>write values</th></tr></thead>z	  <tbody>z</body>z</html>)rY   rZ   r[   rA   htmlescaper\   r@   )r^   rowsrC   r`   ra   ref_sectionsbodyr+   s           r0   	html_pagerk      s   D" 
		dVE/DZD`D`Db=cddkhkhfUK]E^EdEdEf>ghholo;;uV}-. /U:%678 9;;uZ012 3uV}%& ';;u%& ';;v&' (		

 L" 
= 	CKK![[Z9: ;{{3v;/0 1![[)A)HSIJ K	 	4;;uV}-.aE*<M0N/O Pggdm_$46	

 99"P5hTW)&/
*4;;wz7J>7Z+[*\\hi
GJ/<=>dC 	N
BGGDM?"23		,
1  r2   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_oksave_selector_branch_state.jsonFr   )ensure_asciiindentrX   zutf-8)encoding)mkdir
write_textjsondumps)r^   out_dirs     r0   write_outputsrx      sC    MM$M.00<<

7q9D@ = r2   c                 v   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz	--out-dirz$wrote save selector branch state -> ro   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsrF   r*   
read_bytesrx   rw   print)parserargsr^   s      r0   mainr      s    $$9F
dD=4HI
$<DDHH//12G'4<<(	0@a1a0b
cdr2   __main__)r*   bytesr+   dictreturnr   )r*   r   r   r   )r^   r   r   str)r^   r   rw   r   r   None)r   r   )r   
__future__r   r}   rf   ru   structpathlibr   probe_exe_pointer_refsr   probe_exe_scene_tablesr   r   __file__resolverm   r   r   r?   r1   rF   rb   rk   rx   r   __name__rM   r2   r0   <module>r      s    K "      2 > H~''*
Ul %/	 '/	 8 F F8v 25 e zF r2   