
    UHj'                    J   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
mZ ddlmZmZmZ  ee      j#                         j$                  d   Zedz  Zdd	Zdd
ZddZdd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)zNCompare current save-selector opcodes with branch-state event handler opcodes.    )annotationsN)Path)read_sectionsva_to_offset)HANDLER_TABLE_VAdword_atsection_name_for_va   outc                    d| dS )N0x08x values    P/home/exedev/hwanse/tools/summarize_save_selector_branch_state_opcode_overlap.pyhex32r      s    c{    c                >    t        | t              rt        | d      S d S )N   )
isinstancestrintr   s    r   	parse_hexr      s    's33ub>==r   c                    t         |dz  z   }t        | ||      }t        t               t        |      |t        |      nd |t        ||      dS d dS )N   )
tableVaHex
entryVaHexhandlerVaHexhandlerSection)r   r   r   r	   )exesectionsopcodeentry_va
handler_vas        r   script_handler_for_opcoder&      sh    &1*,H#x2J,-Ho-7-Cj)GQG]-h
C	  dh	 r   c                   | j                  d      xs g D cg c]D  }|j                  d      dk(  r.|j                  d      dk(  rt        |j                  d            F }}|D cg c]  }||	 }}|rt        |      S d S c c}w c c}w )NcurrentFrontierRows	operationreaderselectionBufferOffsetHex0x20vaHex)getr   min)selection_writersrow
candidatesr   s       r   current_reader_var3   &   s     %(()>?E277;8+8R0SW]0] 	#'''"#J 
 &0EE53D%EJE(3z?2d2
 Fs   A	B'B	/B	c           
        t        |       }t        |      }|j                  d      xs g D ci c]U  }|j                  d      xs i j                  d      r/t        |j                  d      xs i j                  d      d      |W }}g }t	               }	|D ]  }
|
j                  d      dk7  s|
j                  d      dk7  r-d	D ]  \  }}|
j                  |      xs g D ]  }t        |d
   d      }|dz  }|j                  |      }|s,|j                  d      |j                  d
      f}||	v rS|	j                  |       t        |j                  d            }t        | ||      }|j                  i d|
j                  d      d|
j                  d      d|
j                  d      d|
j                  d      d|d|j                  d      d|j                  d      d
|j                  d
      dd|dd|d uxr |d uxr ||k  d|t        |      nd d|d|j                  d      xs i d|j                  d      d|j                  d      dd          |S c c}w )NclusterseventHandlerTable	opcodeHexr   sourcemap1_01atargetmap2_02d))leafwords)nestednestedWordsvalueHex   r-   selectorleafPointerHex
streamKind	wordIndexindex	wordVaHexr   02xbeforeCurrentFrontierReadercurrentFrontierReaderHexsaveSelectorDispatcheventObjectDispatcheventObjectFunctionHexfunctionStartHexeventObjectClusterlabelclassificationzoverlap only: this word is in a save-selector leaf stream, so low byte dispatch uses 0x00440720 here; it is not evidence that the event/object handler table 0x0047f1d8 executed.)
r   r3   r.   r   setaddr   r&   appendr   )r!   leaf_streamsdispatch_summaryr0   r"   	reader_vaclusterdispatch_by_opcoderows
seen_wordsstreamstream_kind	words_keywordr   r#   dispatchword_keyvasave_handlers                       r   matching_wordsrd   0   s    S!H!"34I (++J7=2KK+,277D 	W[[,-388ErJGS 
 DJ $::h:-H1E1S&T !	"K

9-3  D,b1-11&9 HHW-txx
/CDz)x(txx018hO fjj2fjj2 

: 6 %fjj1A&B	
 !+  '!2  '!2  4  2fS\!2 29D3H3nRW[^3n`ben`n /IDYi0@_c +L *8<<8K+L+RPR -hll;M.N )(,,w*?  ^#  !	$J KYs   AI4c                    t        | |||      }|D cg c]  }|j                  d      s| }}d|r|d   d   nd t        |      t        |      d|dS c c}w )NrI   z\current frontier opcode overlap between save-selector stream and branch-state event handlersr   rJ   aa  The current save-selector leaf contains low-byte opcode values that match branch-state event/object handler indexes, but this stream is interpreted through save-selector handler table 0x00440720. The matching rows before 0x00542b0c are selectionBuffer setup/writer opcodes, not proof that the event/object branch-state writer handlers at 0x0047f1d8 ran.)scoperJ   overlapCount'overlapBeforeCurrentFrontierReaderCount
conclusionrZ   )rd   r.   len)r!   rU   rV   r0   rZ   r1   before_readers          r   build_summaryrl   g   ss     #|-=?PQD$(SSCGG4Q,RSSMSoKODG,F$GUYD	36}3E>
   Ts
   AAc                   ddddd| d    dd| d    d	| d
    d| d   dddg}| d   D ]{  }|j                  d|d    d|d    d|d    d|d   rdnd d|d   j                  d       d|d   j                  d       d|d    d|d   j                  d       d|d    d        } |j                  d       d!j                  |      S )"Nz+# Save Selector Branch State Opcode Overlap ztLow-byte opcode overlap between the current save-selector leaf stream and event/object branch-state writer handlers.z- current frontier reader: `rJ   `z- overlaps: rg   z- overlaps before reader: rh   ri   zi| word | value | opcode | before reader | save-selector handler | event/object handler | classification |z+| --- | --- | --- | --- | --- | --- | --- |rZ   z| `rG   z` | `r@   r7   z` | rI   yesnoz | `rK   r   z` via `r   rM   rL   rQ   z |
)rT   r.   join)summarylinesr1   s      r   markdownrv   ~   sI   5
~

&w/I'J&K1M
w~./0
$W-V%W$XY

s5E v 
#k"#5Z(9s;?O>PPT9:uE F*+//?@LbHcHgHghtHuGv w,-.gc:O6P6T6TUa6b5ccg#$%R	)	

 
LL99Ur   c                v   g }| d   D ]0  }|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d   rd	nd
 dt        j                  |d   j                  d      xs d       dt        j                  |d   j                  d      xs d       dt        j                  |j                  d      xs d       dt        j                  |d   j                  d      xs d       dt        j                  |d          d       3 dj	                  ddddddddddd d!d"d#d$d%d&t        j                  | j                  d'      xs d       d(d)t        j                  | d*          d+d,d-d.j	                  |       d/d0d1d.g      S )2NrZ   z<tr><td><code>rG   z</code></td><td><code>r@   r7   z</code></td><td>rI   rp   rq   z</td><td><code>rK   r   -z</code><br>via <code>r   rM   rL   rQ   z
</td></tr>rr   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 Opcode Overlap</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>z4  <h1>Save Selector Branch State Opcode Overlap</h1>z$  <p>Current frontier reader: <code>rJ   z</code>.</p>z  <p>ri   z</p>z  <table><thead><tr><th>word</th><th>value</th><th>opcode</th><th>before reader</th><th>save-selector handler</th><th>event/object handler</th><th>classification</th></tr></thead>z	  <tbody>rn   z</tbody></table>z</body>z</html>)rT   htmlescaper.   rs   )rt   rZ   r1   s      r   	html_pager{      s    Dv 
S%567 8S_56 7S%567 8 =>5DI JS)?%@%D%D^%T%[X[\] ^S)?%@%D%D\%R%YVYZ[ \SWW-E%F%M#NO PS)>%?%C%CL%Q%XUXYZ [;;s#3456 7
	

 99"PDhTW)&>
.t{{7;;Ga;b;ifi/j.kkwx
GL12348 	~
BGGDM?"23
/  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok.save_selector_branch_state_opcode_overlap.jsonF   )ensure_asciiindentrr   utf-8encoding)mkdir
write_textjsondumps)rt   out_dirs     r   write_outputsr      sD    MM$M.??KK

7q9D@ L r   c            
     D   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t        dz         | j                  d	t        t        d
z         | j                  dt        t               | j                         }t        |j                  j                         t        j                  |j                  j                  d            t        j                  |j                  j                  d            t        j                  |j                   j                  d                  }t#        ||j$                         t'        d|j$                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--leaf-streamszsave_selector_leaf_streams.jsonz
--dispatchz(save_selector_branch_state_dispatch.jsonz--selection-writersz$save_selector_selection_writers.jsonz	--out-dirr   r   z3wrote save selector branch state opcode overlap -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsrl   r!   
read_bytesr   loadsrU   	read_textr`   r0   r   r   print)parserargsrt   s      r   mainr      sO   $$9F
dD=4HI
(tSCd=de
4?i9ij
-D#HnBno
$<D

4$$...@A

4==**G*<=

4))33W3EF	G '4<<(	?O@  @A  B  Cr   __main__)r   r   returnr   )r   z
str | Noner   
int | None)r!   bytesr"   
list[dict]r#   r   r   dict)r0   r   r   r   )
r!   r   rU   r   rV   r   r0   r   r   r   )
r!   r   rU   r   rV   r   r0   r   r   r   )rt   r   r   r   )rt   r   r   r   r   None)r   r   ) r   
__future__r   r   ry   r   structpathlibr   probe_exe_scene_tablesr   r   summarize_script_handler_tabler   r   r	   __file__resolver}   r   r   r   r   r&   r3   rd   rl   rv   r{   r   r   __name__r   r   r   <module>r      s    T "      > Z Z H~''*
Ul>34	44 4 	4
 4n	  	
 
.6(V 25 C$ zF r   