@@ -126,7 +126,7 @@ void RecursiveDump(TypeTreeNode node, ref long offset, int level)
126
126
}
127
127
}
128
128
129
- void DumpArray ( TypeTreeNode node , ref long offset , int level , bool isManagedReferenceRegistry = false )
129
+ void DumpArray ( TypeTreeNode node , ref long offset , int level )
130
130
{
131
131
// First child contains array size.
132
132
var sizeNode = node . Children [ 0 ] ;
@@ -178,16 +178,11 @@ void DumpArray(TypeTreeNode node, ref long offset, int level, bool isManagedRefe
178
178
}
179
179
else
180
180
{
181
+ ++ level ;
182
+
181
183
for ( int i = 0 ; i < arraySize ; ++ i )
182
184
{
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 ) ;
191
186
}
192
187
}
193
188
}
@@ -199,56 +194,78 @@ void DumpManagedReferenceRegistry(TypeTreeNode node, ref long offset, int level)
199
194
throw new Exception ( "Invalid ManagedReferenceRegistry" ) ;
200
195
201
196
// First child is version number.
197
+ var version = m_Reader . ReadInt32 ( offset ) ;
202
198
RecursiveDump ( node . Children [ 0 ] , ref offset , level ) ;
203
-
204
- var refIdsVectorNode = node . Children [ 1 ] ;
205
199
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 ;
217
202
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 ;
225
212
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 ] ;
236
220
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" ) ;
242
223
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
+ {
246
256
if ( refTypeNode . Children . Count < 3 )
247
257
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 ;
248
265
249
266
var refTypeOffset = offset ;
250
267
var stringSize = m_Reader . ReadInt32 ( offset ) ;
251
- var clasName = m_Reader . ReadString ( offset + 4 , stringSize ) ;
268
+ var className = m_Reader . ReadString ( offset + 4 , stringSize ) ;
252
269
offset += stringSize + 4 ;
253
270
offset = ( offset + 3 ) & ~ ( 3 ) ;
254
271
@@ -262,13 +279,12 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
262
279
offset += stringSize + 4 ;
263
280
offset = ( offset + 3 ) & ~ ( 3 ) ;
264
281
282
+ if ( className == "Terminus" && namespaceName == "UnityEngine.DMAT" && assemblyName == "FAKE_ASM" )
283
+ return false ;
284
+
265
285
// Not the most efficient way, but it simplifies the code.
266
- RecursiveDump ( refTypeNode , ref refTypeOffset , level + 1 ) ;
286
+ RecursiveDump ( refTypeNode , ref refTypeOffset , level ) ;
267
287
268
- // Third child is the referenced type data.
269
- var referencedTypeDataNode = node . Children [ 2 ] ;
270
- level += 1 ;
271
-
272
288
m_StringBuilder . Append ( ' ' , level * 2 ) ;
273
289
m_StringBuilder . Append ( referencedTypeDataNode . Name ) ;
274
290
m_StringBuilder . Append ( ' ' ) ;
@@ -278,13 +294,15 @@ void DumpManagedReferenceData(TypeTreeNode node, ref long offset, int level)
278
294
m_Writer . WriteLine ( m_StringBuilder ) ;
279
295
m_StringBuilder . Clear ( ) ;
280
296
281
- var refTypeRoot = m_SerializedFile . GetRefTypeTypeTreeRoot ( clasName , namespaceName , assemblyName ) ;
282
-
297
+ var refTypeRoot = m_SerializedFile . GetRefTypeTypeTreeRoot ( className , namespaceName , assemblyName ) ;
298
+
283
299
// Dump the ReferencedObject using its own TypeTree, but skip the root.
284
300
foreach ( var child in refTypeRoot . Children )
285
301
{
286
302
RecursiveDump ( child , ref offset , level + 1 ) ;
287
303
}
304
+
305
+ return true ;
288
306
}
289
307
290
308
void OutputSerializedFile ( string path )
0 commit comments