
    UHj6                    T   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ed	z  Zd
Zd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d!dZd!dZefd"dZ d#dZ!e"dk(  r e!        yy)$zGExplain the selected-pointer value captured by runtime_memory_snapshot.    )annotationsN)Path)Any)offset_to_varead_sections   outzHwanse2.exez2:0
0x00540714c                @    | sy 	 t        | d      S # t        $ r Y y w xY w)N   )int
ValueErrorvalues    F/home/exedev/hwanse/tools/summarize_runtime_memory_snapshot_context.pyint_hexr      s+    5"~ s    	c                    | y d| dz  dS )N0xl    08x r   s    r   hex32r      s    }
"3'((    c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r   	load_jsonr#   %   s*    ;;=::dnngn677r   c                   g }t        | t              rB|j                  |        | j                         D ]  }|j	                  t        |              |S t        | t              r!| D ]  }|j	                  t        |              |S )N)
isinstancedictappendvaluesextendwalk_objectslist)r   foundchilds      r   r*   r*   +   s{    E%U\\^ 	.ELLe,-	.
 L 
E4	  	.ELLe,-	.Lr   c                   g }t        j                  d|       D ]k  }t        ||j                               }|||cxk  r|k  sn -|j	                  t        |      |j                  d      d d j                  dd      d       m |S )Ns   [a-z0-9_]{2,12}\.cns\0r   asciireplace)vaHexfilename)refinditerr   startr'   r   groupdecode)exesectionsstart_vaend_varowsmatchvas          r   cns_strings_nearr@   7   s    D7= (EKKM2:h"5v52YAs+227IF
 		 Kr   c                    |j                  dd      \  }}t        |      }t        |      }| D ]/  }|j                  d      |k(  s|j                  d      |k(  s-|c S  y )N:r   r7   slot)splitr   get)	selectorslabel
group_text	slot_textr7   rC   rows          r   find_selector_rowrK   D   sb    !KKQ/J	
OEy>D 777u$D)@J r   c                   g }g }t        |       D ]#  }|j                  d      }t        |t              r~t	        |j                  d            }t	        |j                  d            }|\|_||cxk  r|k  skn n|j                  |       |j                  d      s|j                  |       |j                  d      s|j                  d      st	        |j                  d            }t	        |j                  d            }||||cxk  r|k  sn |j                  |       & g }t               }	|D ]h  }t        |j                  d      xs g       |j                  d      |j                  d      f}
|
|	vsG|j                  |       |	j                  |
       j g }t               }|D ]=  }|j                  d      }
|
s|
|vs|j                  |       |j                  |
       ? ||dS )NselectorRootContextrangeStartHexrangeEndHexr2   labels)contexts
writerRows)	r*   rE   r%   r&   r   r'   settupleadd)selection_writersselected_varQ   writer_rowsrJ   contextr6   endunique_contextsseenkeyunique_writersseen_writerss                r   selector_context_from_writersr`   N   s   HK-. %''/0gt$GKK89E'++m45C S_+9SPS9S(777#&&s+WW_%#''-*@CGGO45E#''-01C S_+9SPS9S9S$% O5D W[[*0b17;;3OQXQ\Q\]jQkld?""7+HHSM	
 N5L "ggg3l*!!#&S!	" $$ r   c                   | j                  d      xs i }t        |j                  d            }t        ||xs d      }|d   }|r|d   ni }	|	j                  d      xs g }
|
r|
d   nd }|rt        ||      nd }|xs ddz
  }|xs ddz   }|rt	        ||||      ng }|j                  d      d	u }|j                  d
      xs g D ci c]  }|j                  d      | }}dD cg c]  }||v r||j                  |      xs i j                  d      |j                  |      xs i j                  d      |j                  |      xs i j                  d      |j                  |      xs i j                  d      |j                  |      xs i j                  d      |j                  |      xs i j                  d      d }}t        d |D              }|r|j                  d      n|	j                  d      }|rE|rCt        |d   t              r0|D cg c]%  }|j                  d      s|j                  d      ' }}|d   D cg c]e  }|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      dg }}i d d!d"| j                  d"      d#| j                  d#      d|j                  d      d$|j                  d$      d%t        d&t        d'|d(|d)|	r%|	j                  d*       d+|	j                  d,       nd d-|	j                  d.      d/|xs g d0|	j                  d1      xs |xs i j                  d2      xs g d3|d4|d5|d6|t        |      d7|d8k(  r|sd9d;S d:d;S c c}w c c}w c c}w c c}w )<NmemoryselectedPointerStaticValueHexr   rQ   rP      i    selectedPointerEqualsCurrentRootTsamplesname)zopcode24-current-object-indexzopcode24-mode2-sourcezopcode24-mode1-sourcezopcode24-runtime-enabled-flagsecondary-branch-statestaticVaHexruntimeVaHexfirstByteHexbytesHexreadOkrole)rg   ri   rj   rk   rl   rm   rn   c              3  l   K   | ],  }|j                  d       dk7  r|j                  d      dk(   . yw)rg   rh   rk   0x00NrE   .0rJ   s     r   	<genexpr>z build_summary.<locals>.<genexpr>   s7      !776?66 	6)!s   24	fieldMapsfieldRecordsmaprR   r2   	opcodeHex	operationmeaningnextDwordHexnextDwordCns)r2   rx   ry   rz   r{   r|   	objectivezLclassify the live selected-pointer value captured by runtime_memory_snapshotsnapshotStatusloadedBaseHexselectedPointerRuntimeValueHexcurrentRouteSelectorcurrentRouteRootHex%selectedPointerEqualsCurrentRouteRootselectedPointerContextSelectorselectedPointerContextRangeHexrN   z..rO    selectedPointerRelativeOffsetHexrelativeOffsetHexselectedPointerContextFieldMapsselectedPointerContextResources	resources	linkedCnsnearbyCnsStringsnearbySelectionWriterRowsopcode24RuntimeSamplesopcode24IdleGlobalBytesAllZeroblockedz8:0a  The live selected-pointer snapshot resolves to selector 8:0 context material, not to the current blocker selector 2:0 root 0x00540714. Nearby static strings include the title/intro resource list. The same idle snapshot can read opcode 0x24 globals and currently sees the runtime enabled flag and mode source bytes as 0x00, but this is still an idle title-context sample rather than route-path watchpoint proof for map1_01a -> map2_02d.zNThe live selected-pointer snapshot is not enough to promote the current route.)contextCountpromotionStatus
conclusion)rE   r   r`   rK   r@   allr%   r&   CURRENT_ROUTE_SELECTORCURRENT_ROUTE_ROOT_HEXlen)snapshotrF   rV   r9   r:   rb   rW   selected_contextrQ   primary_contextrP   selector_labelselector_rownearby_start
nearby_end
nearby_cnscurrent_route_selectedrJ   rf   rg   opcode24_runtime_samplesopcode24_idle_all_zero
field_mapswriter_briefs                           r   build_summaryr   s   sw    \\(#)rF&**%DEFK45FHXWXY
+H%-hqk2O  *0bF"(VAYdNCQ$Y?W[L$1,L"e+JNY!#xzJ_aJ#ZZ(JKtS ::i(.B 	G 
   7? #KK-388G$[[.4"99.I$[[.4"99.I T*0b55jA{{4(.B33H=[[&,"11&9	
   & ! !+! 
 3?!!+.ODWDWXfDgJjZ
1t%D0:McggencggenM
M $L1
  WWW%--wwy)GGN3GGN3	

L 
 c (,,'78  	o6  	(4S)T	 
 	)&**5U*V  	 6  	5  	01G  	).  	) ""?34B7J7J=7Y6Z[$(  	+O,?,?@S,T  	*:+;   	*?+>+>{+K+zP\Pb`bOgOghsOt+zxz! " 	J# $ 	$\% & 	!":' ( 	)*@) * H$ &/EW1   < b=   U 4 N
s    
N4)C!N9N>4N>A*Oc                0   ddd| j                  d       dd| j                  d       dd| j                  d	       dd
| j                  d       dd| j                  d       dd| j                  d       d| j                  d       dd| j                  d      xs ddddg}|j                  d | j                  d      xs g D               |j                  g d       | j                  d      r,|j                  d | j                  d      xs g D               n|j                  d       |j                  dddd| j                  d       dddg       | j                  d      xs g D ]  }|j                  d |j                  d!       d"|j                  d#       d$|j                  d%       d$|j                  d&       d'|j                  d(       d)|j                  d*       d+        |j                  d       d,j                  |      S )-Nz!# Runtime Memory Snapshot Context z- selected pointer: `rc   `z- selected context selector: `r   z- selected context range: `r   z- current route selector: `r   z- current route root: `r   z.- selected pointer equals current route root: r   z- promotion status: `r   r   z## Nearby CNS Stringsc              3  h   K   | ]*  }d |j                  d       d|j                  d        , yw)- `r2   ` r3   Nrq   rr   s     r   rt   zmarkdown.<locals>.<genexpr>   s9       cgggr#''*"5!67s   02r   )r   z## Nearby Selection Writersr   r   c              3     K   | ]s  }d |j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d      xs |j                  d	       
 u y
w)r   r2   r   ry    rx   rz    next=r|   r{   Nrq   rr   s     r   rt   zmarkdown.<locals>.<genexpr>   s~      
  #'''"#2cggk&:%;1SWW[=Q<RRSwwy!"&)@)[CGGND[(\^
s   A9A;z- nonez## Opcode 0x24 Runtime Samplesz'- idle opcode24 global bytes all zero: r   z<| name | static VA | runtime VA | first byte | read | role |z%| --- | --- | --- | --- | --- | --- |r   z| rg   z | `ri   z` | `rj   rk   z` | rm   z | rn   z |
)rE   r)   r'   join)summarylinesrJ   s      r   markdownr      s9   +

,K LMQO
(5U)V(WWXY
%gkk2R&S%TTUV
%gkk2H&I%J!L
!'++.C"D!EQG
8El9m8no
,= >?qA
L!'R

E  
LL ;;128b  
LL89{{./ 
 {{#>?E2
 	
 	X	LL
(

1'++>^2_1`a
F/  {{34: 
!cggm&<%=U377>CZB[ \'(SWWX->,?s3776?BSSUW	


 
LL99Ur   c                    dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              xs d}dj                  d | j                  d	      xs g D              }dj                  d
ddddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   ddt        j                  t	        | j                  d                   dddt        j                  t	        | j                  d      xs d             ddd| ddd| dd d!t        j                  t	        | j                  d"                   dd#|d$g      S )%Nr   c              3     K   | ]c  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   d e yw)
<li><code>r2   </code> r3   </li>NhtmlescapestrrE   rr   s     r   rt   zhtml_page.<locals>.<genexpr>  s\       T[[SWWW%5!678SQTQXQXYcQdMeAf@gglms   A)A+r   c              3    K   | ]  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d      xs |j                  d	                   d
  yw)r   r2   r   ry   r   rx   rz   r   r|   r{   r   Nr   rr   s     r   rt   zhtml_page.<locals>.<genexpr>  s       	S!1234H;;s377;/01
2!DKKCGGKDX@Y4Z3[[\;;s3779-./
0;;s377>2Mcggn6MNO
P	s   DD
r   z<li>none</li>r   c              3  N  K   | ]  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   d	t        j                  t        |j                  d
                   d  yw)z<tr><td>rg   z</td><td><code>ri   z</code></td><td><code>rj   rk   z</code></td><td>rm   z	</td><td>rn   z
</td></tr>Nr   rr   s     r   rt   zhtml_page.<locals>.<genexpr>  s      
 	{{3swwv/01 2[[SWW]%;!<=> ?[[SWW^%<!=>? @[[SWW^%<!=>? @{{3swwx0123 4{{3swwv/01 2	
s   D#D%r   zS<!doctype html><meta charset="utf-8"><title>Runtime Memory Snapshot Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1000px;margin:24px auto}code{color:#9bd4ff}</style>z(<h1>Runtime Memory Snapshot Context</h1>z<ul>z<li>selected pointer: <code>rc   z</code></li>z%<li>selected context selector: <code>r   z<li>current route root: <code>r   z0<li>selected pointer equals current route root: r   r   z<li>promotion status: <code>r   z</ul>z<p>r   z</p>z<h2>Nearby CNS Strings</h2>z!<h2>Nearby Selection Writers</h2>z$<h2>Opcode 0x24 Runtime Samples</h2>z(<p>idle opcode24 global bytes all zero: r   z<table><thead><tr><th>name</th><th>static VA</th><th>runtime VA</th><th>first byte</th><th>read</th><th>role</th></tr></thead><tbody>z</tbody></table>)r   rE   r   r   r   )r   	cns_itemswriter_itemsopcode_rowss       r   	html_pager     s
    ;;128b I 77  ;;:;Ar   
  )) 
 ;;78>B
 
K 99_ 	P2
&t{{3w{{Cb7c3d'e&ffrs
/CLl@m<n0o/pp|}
(SEZ9[5\)](^^jk
:4;;s7;;W~K  HA  <B  ;C  CH  	I
&t{{3w{{CT7U3V'W&XXde
dkk#gkk,7=2>?@E%
yk+
|nE".
24;;s7;;OoCp?q3r2sswx 	P)  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok$runtime_memory_snapshot_context.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)r   out_dirs     r   write_outputsr   4  sD    MM$M.55AA

7q9D@ B r   c                    t        j                  t              } | j                  dt        t
               | j                         }t        |j                  dz  i       }t        |j                  dz  g       }t        |j                  dz  i       }t        j                         }t        |      }t        |||||      }t        ||j                         t        d|j                  dz          y )	N)descriptionz	--out-dir)typedefaultzruntime_memory_snapshot.jsonzsave_scene_selectors.jsonz$save_selector_selection_writers.jsonz)wrote runtime memory snapshot context -> r   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsr#   r   EXE
read_bytesr   r   r   print)parserargsr   rF   rV   r9   r:   r   s           r   mainr   <  s    $$9F
$<D(FFKH$,,)DDbII!$,,1W"WY[\
..
CS!HHi1BCRG'4<<(	5dllEk6k5l
mnr   __main__)r   
str | Nonereturn
int | None)r   r   r   r   )r!   r   r"   r   r   r   )r   r   r   
list[dict])
r9   bytesr:   r   r;   r   r<   r   r   r   )rF   r   rG   r   r   zdict | None)rV   r&   rW   r   r   r&   )r   r&   rF   r   rV   r&   r9   r   r:   r   r   r&   )r   r&   r   r   )r   r&   r   r   r   None)r   r   )#r   
__future__r   r   r   r   r4   pathlibr   typingr   probe_exe_scene_tablesr   r   __file__resolver   ROOTr   r   r   r   r   r   r#   r*   r@   rK   r`   r   r   r   r   r   __name__r   r   r   <module>r      s    M "    	   > H~''*
Ul
] % )8	
"J]]] ] 
	]
 ] 
]@-`.b 25 o zF r   