
    UHj)                       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Zddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZmZ ddlmZ  e	e      j                         j,                  d   Zedz  Zd	Zd
ZdddddddddddddZg dZd%dZd&dZd'dZd(dZ d)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)0zKGroup direct primaryBranchState writers used before save-selector branches.    )annotationsN)Path)read_sectionsva_to_offset)build_summary   outipY i`  comparisonTable4d2488objectCandidateTable4577a6objectCandidateTable45779apartyCandidateLow4576ecpartyCandidateHigh4576edpartyCandidateTable4576f8runtimeObjectBase59db30runtimeListState59e2a8runtimeFlag59e33eruntimeFlag59e344runtimeFlag59e345runtimeFlag59e34d)i$M iwE iwE ivE ivE ivE i0Y iY i>Y iDY iEY iMY ))iA i-A zobject/stat comparison groupzqEvaluates indexed runtime objects and writes state 0/1/2 according to object presence and stat/level comparisons.)iA iA zparty/object condition groupzjUses party/object candidate tables and writes state 0/1/2 from the current runtime party/object condition.)iA i1A zsix-slot object condition groupzSLoops over a short candidate table and writes state 0/1 for available object slots.)i6A iWA z#list selection initialization groupzbSeeds one selected slot with state 1 and clears following slots to 0 for a runtime list selection.c                    d| dS )N0x08x )values    I/home/exedev/hwanse/tools/summarize_save_selector_branch_state_writers.pyhex32r   @   s    c{    c                   g }t        d|      }t        t        |       dz
  |      }t        ||dz         D ]V  }t	        j
                  d| |      d   }t        j                  |      }|s5|j                  d|dt        |      |d       X t               }	g }
|D ]3  }|d   |d	   f}||	v r|	j                  |       |
j                  |       5 |
S )
Nr      r   z<Ir   06x)fileOffsetHexvalueHexnamer"   r#   )maxminlenrangestructunpack_fromKNOWN_GLOBALSgetappendr   setadd)exestart_offset
end_offsetrefsstartendoffr   r#   seenuniquerefkeys                r   read_dword_refsr:   D   s    D< E
c#hlJ
'CUC!G$ ""4c215  'KK#%c#Y!%L 	 5DF :F,$;c Mr   c                F    t         D ]  \  }}}}| |k\  s||k  s||fc S  y)N)z direct branch-state writer groupzEDirect writes to primaryBranchState detected near this address range.)CLUSTER_NOTES)r3   r4   
note_startnote_endlabelnotes         r   cluster_labelrA   \   s8    -: )
HeTJ3(?$; wr   c                    t        | d       }g }|D ]Y  }t        |d   d      }|r|t        |d   d   d   d      z
  t        kD  r|j                  |g       F|d   j                  |       [ |S )Nc                     t        | d   d      S )NrefVaHex   )int)rows    r   <lambda>z!cluster_writers.<locals>.<lambda>d   s    c#j/2.F r   )r9   rD   rE   )sortedrF   CLUSTER_GAPr,   )writersorderedclustersrG   vas        r   cluster_writersrP   c   s~    W"FGG!#H %Z"%2HRL$4Z$@" EESOOSE"RL$% Or   c                   t        |       }|xs t        |       }|j                  dg       D ci c]  }|j                  d      | }}|j                  d      xs i }|j                  dg       D cg c]  }|j                  d      dk(  r| }}g }t        t	        |      d      D ]  \  }	}
|
D cg c]  }t        |d	   d
       }}t        |      }t        |      }t        ||dz
        }t        ||dz         }g }||t        | ||      }i }|
D ]/  }|j                  d      xs d}|j                  |d      dz   ||<   1 t        ||      \  }}|j                  |	||t        |       dt        |       t        |
      |||
D cg c])  }|d	   |j                  d      |j                  d      d+ c}d        dt        t              dt        |      t        |      dd|dS c c}w c c}w c c}w c c}w )Ntablesr#   primaryBranchStater2   kindindexedWriteImmediater   )r3   rD   rE      writeValueHex-r   z..)vaHexrW   rT   )indexr?   r@   rangeHexwriterCountwriteValueCountssourceGlobalsrL   zVdirect writers of save-selector primaryBranchState inherited by current selector roots   )	baseVaHexslotsdirectWriterCountclusterCountag  The current save-selector root does not locally fill the branch-state table before the frontier. The direct primaryBranchState writers are earlier runtime object/party/list evaluation routines, so primaryBranchState is inherited from earlier runtime state. The next playable-progress step is to identify which writer cluster executes before selector root 2:0.)scoperS   
conclusionrN   )r   build_branch_state_summaryr+   	enumeraterP   rF   r%   r$   r   r:   rA   r,   r   r&   PRIMARY_BRANCH_STATE)r/   branch_statesectionstablerR   primaryr8   direct_writersrN   rZ   rowsrG   vasr3   r4   r0   r1   source_globalsvaluesr   r?   r@   s                         r   r   r   o   sF   S!HB#=c#BL4@4D4DXr4RS5eii&SFSjj-.4"G{{62.776?55 	N  H !@J t378Cs3z?B'88C#h#Hedl;!(C$J7
#
(>,S,
KN!# 	5CGGO,3E"JJua014F5M	5 $E3/t <.5:,7t9 &+   	 !_%(WW_%=GGFO
 	@ j34!$^!4M	
u
  M T 9*s   G43G95G>.Hc                h    dj                  d t        | j                               D              xs dS )N, c              3  0   K   | ]  \  }}| d |   yw):Nr   ).0r9   r   s      r   	<genexpr>z format_counts.<locals>.<genexpr>   s     O*#uuAeW%Os   rX   )joinrJ   items)countss    r   format_countsr{      s(    99Ov||~8NOOVSVVr   c                :    dj                  d | D              xs dS )Nrs   c              3  8   K   | ]  }|d     d|d    d  yw)r#    `r"   `Nr   )rv   items     r   rw   z!format_globals.<locals>.<genexpr>   s'     QV~RZ(8'9;Qs   rX   )rx   )globals_s    r   format_globalsr      s    99QQQXUXXr   c                &   ddddd| d   d    dd| d   d	    d
| d   d    d| d   dddg}| d   D ]D  }|j                  d|d    d|d    dt        |d          dt        |d          d|d    d       F |j                  g d       | d   D ]m  }|j                  d|d    d|d    ddddg       |d   D ]0  }|j                  d |d!    d"|j	                  d#      xs d$ d%       2 |j                  d       o d&j                  |      S )'Nz$# Save Selector Branch State Writers zUDirect writers for `primaryBranchState` used by save-selector opcode `0x11` branches.z
- table: `rS   r`   r   z- direct writer refs: rb   z- writer clusters: rc   re   z4| cluster | range | writes | source globals | note |z| --- | --- | --- | --- | --- |rN   z| r?   z | `r[   z` | r]   z | r^   r@   z |)r   z## Writer Referencesr   z### r~   z| writer | value |z| --- | --- |rL   z| `rY   z` | `rW   rX   z` |
)r,   r{   r   extendr+   rx   )summarylinesclusterwriters       r   markdownr      s   .
_

W12;?@B
 )=!>?R!S TU
g&:;NKLM

>)E :& 
!"$wz':&;4W%789:#nWUdMe>f=ggjvr#	

 
LL12:& 	77#$Bwz':&;1= 	
 	 i( 	^FLL3vg/uVZZ5P5WTW4XX[\]	^R	 99Ur   c                   g }| d   D ]  }|j                  dt        j                  |d          dt        j                  |d          dt        j                  t        |d                dt	        |d	          dt        j                  |d
          d        g }| d   D ]  }g }|d   D ]V  }|j                  dt        j                  |d          dt        j                  |j                  d      xs d       d       X |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,d-t        j                  | d.          d/d0d1dj                  |       ddj                  |      d2d3dg      S )4NrN   z<tr><td>r?   z</td><td><code>r[   z</code></td><td>r]   z	</td><td>r^   r@   z
</td></tr>rL   z<tr><td><code>rY   z</code></td><td><code>rW   rX   z</code></td></tr>z<h2>z <code>zO</code></h2><table><thead><tr><th>writer</th><th>value</th></tr></thead><tbody>r   z</tbody></table>r   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">z3  <title>Save Selector Branch State Writers</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 Writers</h1>z  <p>Table: <code>rS   r`   z</code>.</p>z  <p>re   z</p>zr  <table><thead><tr><th>cluster</th><th>range</th><th>writes</th><th>source globals</th><th>note</th></tr></thead>z	  <tbody>z</body>z</html>)r,   htmlescaper{   r   r+   rx   )r   rn   r   ref_sectionswriter_rowsr   s         r   	html_pager      sA   D:& 	
;;ww/01 2WZ%89: ;;;}W5G-HIJK L!'/":;< =;;wv/0 1	
	
 L:& 
i( 	F![[9: ;![[O)D)KLM N	 	4;;ww/01WZEX9Y8Z [ggk*++;=	

 99"P=hTW)&7
T[[1E)F{)STUUab
GL12348|
BGGDM?"23		,
1  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok'save_selector_branch_state_writers.jsonF   )ensure_asciiindentr   zutf-8)encoding)mkdir
write_textjsondumps)r   out_dirs     r   write_outputsr     sD    MM$M.88DD

7q9D@ E r   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 writers -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r/   
read_bytesr   r   print)parserargsr   s      r   mainr     s    $$9F
dD=4HI
$<DDHH//12G'4<<(	8Hq9q8r
str   __main__)r   rF   returnstr)r/   bytesr0   rF   r1   rF   r   
list[dict])r3   rF   r4   rF   r   ztuple[str, str])rL   r   r   zlist[list[dict]])N)r/   r   ri   zdict | Noner   dict)rz   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )(r   
__future__r   r   r   r   r(   syspathlibr   pathinsertr   __file__resolveparentprobe_exe_scene_tablesr   r   $summarize_save_selector_branch_stater   rf   r   r   r   rh   rK   r*   r<   r   r:   rA   rP   r{   r   r   r   r   r   __name__r   r   r   <module>r      s	   Q "     
  3tH~--/667 8 > \ H~''*
Ul! ',,)*+)(####80w	8vWY F4n 25 u zF r   