@@ -126,7 +126,7 @@ void RecursiveDump(TypeTreeNode node, ref long offset, int level)
126126 }
127127 }
128128
129- void DumpArray ( TypeTreeNode node , ref long offset , int level , bool isManagedReferenceRegistry = false )
129+ void DumpArray ( TypeTreeNode node , ref long offset , int level )
130130 {
131131 // First child contains array size.
132132 var sizeNode = node . Children [ 0 ] ;
@@ -178,16 +178,11 @@ void DumpArray(TypeTreeNode node, ref long offset, int level, bool isManagedRefe
178178 }
179179 else
180180 {
181+ ++ level ;
182+
181183 for ( int i = 0 ; i < arraySize ; ++ i )
182184 {
183- if ( ! isManagedReferenceRegistry )
184- {
185- RecursiveDump ( dataNode , ref offset , level + 1 ) ;
186- }
187- else
188- {
189- DumpManagedReferenceData ( dataNode , ref offset , level + 1 ) ;
190- }
185+ RecursiveDump ( dataNode , ref offset , level ) ;
191186 }
192187 }
193188 }
@@ -199,56 +194,78 @@ void DumpManagedReferenceRegistry(TypeTreeNode node, ref long offset, int level)
199194 throw new Exception ( "Invalid ManagedReferenceRegistry" ) ;
200195
201196 // First child is version number.
197+ var version = m_Reader . ReadInt32 ( offset ) ;
202198 RecursiveDump ( node . Children [ 0 ] , ref offset , level ) ;
203-
204- var refIdsVectorNode = node . Children [ 1 ] ;
205199
206- if ( refIdsVectorNode . Children . Count < 1 || refIdsVectorNode . Name != "RefIds" )
207- throw new Exception ( "Invalid ManagedReferenceRegistry RefIds vector" ) ;
208-
209- m_StringBuilder . Append ( ' ' , level * 2 ) ;
210- m_StringBuilder . Append ( refIdsVectorNode . Name ) ;
211- m_StringBuilder . Append ( ' ' ) ;
212- m_StringBuilder . Append ( refIdsVectorNode . Type ) ;
213- m_StringBuilder . Append ( ' ' ) ;
214-
215- m_Writer . WriteLine ( m_StringBuilder ) ;
216- m_StringBuilder . Clear ( ) ;
200+ TypeTreeNode refTypeNode ;
201+ TypeTreeNode refObjData ;
217202
218- var refIdsArrayNode = refIdsVectorNode . Children [ 0 ] ;
219-
220- if ( refIdsArrayNode . Children . Count != 2 || ! refIdsArrayNode . Flags . HasFlag ( TypeTreeFlags . IsArray ) )
221- throw new Exception ( "Invalid ManagedReferenceRegistry RefIds array" ) ;
222-
223- DumpArray ( refIdsArrayNode , ref offset , level + 1 , true ) ;
224- }
203+ if ( version == 1 )
204+ {
205+ // Second child is the ReferencedObject.
206+ var refObjNode = node . Children [ 1 ] ;
207+ // And its children are the referenced type and data nodes.
208+ refTypeNode = refObjNode . Children [ 0 ] ;
209+ refObjData = refObjNode . Children [ 1 ] ;
210+
211+ int i = 0 ;
225212
226- void DumpManagedReferenceData ( TypeTreeNode node , ref long offset , int level )
227- {
228- m_StringBuilder . Append ( ' ' , level * 2 ) ;
229- m_StringBuilder . Append ( node . Name ) ;
230- m_StringBuilder . Append ( ' ' ) ;
231- m_StringBuilder . Append ( node . Type ) ;
232- m_StringBuilder . Append ( ' ' ) ;
233-
234- m_Writer . WriteLine ( m_StringBuilder ) ;
235- m_StringBuilder . Clear ( ) ;
213+ while ( DumpManagedReferenceData ( refTypeNode , refObjData , ref offset , level , i ++ ) )
214+ { }
215+ }
216+ else if ( version == 2 )
217+ {
218+ // Second child is the RefIds vector.
219+ var refIdsVectorNode = node . Children [ 1 ] ;
236220
237- if ( node . Children . Count < 3 )
238- throw new Exception ( "Invalid ReferencedObject" ) ;
239-
240- // First child is rid.
241- RecursiveDump ( node . Children [ 0 ] , ref offset , level + 1 ) ;
221+ if ( refIdsVectorNode . Children . Count < 1 || refIdsVectorNode . Name != "RefIds" )
222+ throw new Exception ( "Invalid ManagedReferenceRegistry RefIds vector" ) ;
242223
243- // Second child is ReferencedManagedType
244- var refTypeNode = node . Children [ 1 ] ;
245-
224+ var refIdsArrayNode = refIdsVectorNode . Children [ 0 ] ;
225+
226+ if ( refIdsArrayNode . Children . Count != 2 || ! refIdsArrayNode . Flags . HasFlag ( TypeTreeFlags . IsArray ) )
227+ throw new Exception ( "Invalid ManagedReferenceRegistry RefIds array" ) ;
228+
229+ // First child is the array size.
230+ int arraySize = m_Reader . ReadInt32 ( offset ) ;
231+ offset += 4 ;
232+
233+ // Second child is the ReferencedObject.
234+ var refObjNode = refIdsArrayNode . Children [ 1 ] ;
235+
236+ for ( int i = 0 ; i < arraySize ; ++ i )
237+ {
238+ // First child is the rid.
239+ long rid = m_Reader . ReadInt64 ( offset ) ;
240+ offset += 8 ;
241+
242+ // And the next children are the referenced type and data nodes.
243+ refTypeNode = refObjNode . Children [ 1 ] ;
244+ refObjData = refObjNode . Children [ 2 ] ;
245+ DumpManagedReferenceData ( refTypeNode , refObjData , ref offset , level , rid ) ;
246+ }
247+ }
248+ else
249+ {
250+ throw new Exception ( "Unsupported ManagedReferenceRegistry version" ) ;
251+ }
252+ }
253+
254+ bool DumpManagedReferenceData ( TypeTreeNode refTypeNode , TypeTreeNode referencedTypeDataNode , ref long offset , int level , long id )
255+ {
246256 if ( refTypeNode . Children . Count < 3 )
247257 throw new Exception ( "Invalid ReferencedManagedType" ) ;
258+
259+ m_StringBuilder . Append ( ' ' , level * 2 ) ;
260+ m_StringBuilder . Append ( $ "rid_") ;
261+ m_StringBuilder . Append ( id ) ;
262+ m_StringBuilder . Append ( " ReferencedObject" ) ;
263+ m_StringBuilder . AppendLine ( ) ;
264+ ++ level ;
248265
249266 var refTypeOffset = offset ;
250267 var stringSize = m_Reader . ReadInt32 ( offset ) ;
251- var clasName = m_Reader . ReadString ( offset + 4 , stringSize ) ;
268+ var className = m_Reader . ReadString ( offset + 4 , stringSize ) ;
252269 offset += stringSize + 4 ;
253270 offset = ( offset + 3 ) & ~ ( 3 ) ;
254271
@@ -262,13 +279,12 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
262279 offset += stringSize + 4 ;
263280 offset = ( offset + 3 ) & ~ ( 3 ) ;
264281
282+ if ( className == "Terminus" && namespaceName == "UnityEngine.DMAT" && assemblyName == "FAKE_ASM" )
283+ return false ;
284+
265285 // Not the most efficient way, but it simplifies the code.
266- RecursiveDump ( refTypeNode , ref refTypeOffset , level + 1 ) ;
286+ RecursiveDump ( refTypeNode , ref refTypeOffset , level ) ;
267287
268- // Third child is the referenced type data.
269- var referencedTypeDataNode = node . Children [ 2 ] ;
270- level += 1 ;
271-
272288 m_StringBuilder . Append ( ' ' , level * 2 ) ;
273289 m_StringBuilder . Append ( referencedTypeDataNode . Name ) ;
274290 m_StringBuilder . Append ( ' ' ) ;
@@ -278,13 +294,15 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
278294 m_Writer . WriteLine ( m_StringBuilder ) ;
279295 m_StringBuilder . Clear ( ) ;
280296
281- var refTypeRoot = m_SerializedFile . GetRefTypeTypeTreeRoot ( clasName , namespaceName , assemblyName ) ;
282-
297+ var refTypeRoot = m_SerializedFile . GetRefTypeTypeTreeRoot ( className , namespaceName , assemblyName ) ;
298+
283299 // Dump the ReferencedObject using its own TypeTree, but skip the root.
284300 foreach ( var child in refTypeRoot . Children )
285301 {
286302 RecursiveDump ( child , ref offset , level + 1 ) ;
287303 }
304+
305+ return true ;
288306 }
289307
290308 void OutputSerializedFile ( string path )
0 commit comments