/** * Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; namespace MemoryProfiler2 { /// Encapsulates script callstack information. public class FScriptCallStack { /// All frames which belongs to this script callstack. public FScriptCallStackFrame[] Frames; /// Serializing constructor. /// Stream to serialize data from public FScriptCallStack( BinaryReader BinaryStream ) { Frames = new FScriptCallStackFrame[ BinaryStream.ReadInt32() ]; for( int FrameIndex = 0; FrameIndex < Frames.Length; FrameIndex++ ) { Frames[ FrameIndex ] = new FScriptCallStackFrame( BinaryStream ); } } /// Converts this script callstack to its equivalent string representation. public override string ToString() { StringBuilder Result = new StringBuilder(); foreach( FScriptCallStackFrame Frame in Frames ) { Result.AppendLine( Frame.ToString() ); } return Result.ToString(); } } /// Encapsulates one frame in a script callstack. public struct FScriptCallStackFrame { /// Package name index. public int PackageNameIndex; /// Class name index. public int ClassNameIndex; /// Function name represented as an index in the array of unique names. public int FunctionNameIndex; /// Callstack adres index to the name of script function. public int CallStackAddressIndex; /// Serializing constructor. /// Stream to serialize data from public FScriptCallStackFrame( BinaryReader BinaryStream ) { int ClassCompactedName = BinaryStream.ReadInt32(); int FunctionCompactedName = BinaryStream.ReadInt32(); int PackageCompactedName = BinaryStream.ReadInt32(); ClassNameIndex = ClassCompactedName & 0x00FFFFFF; FunctionNameIndex = FunctionCompactedName & 0x00FFFFFF; PackageNameIndex = PackageCompactedName & 0x00FFFFFF; CallStackAddressIndex = -1; int NameIndex = FStreamInfo.GlobalInstance.GetNameIndex( ToString(), true ); if( !FStreamInfo.GlobalInstance.ScriptCallstackMapping.TryGetValue( NameIndex, out CallStackAddressIndex ) ) { CallStackAddressIndex = FStreamInfo.GlobalInstance.CallStackAddressArray.Count; FStreamInfo.GlobalInstance.CallStackAddressArray.Add( new FCallStackAddress( NameIndex ) ); FStreamInfo.GlobalInstance.ScriptCallstackMapping.Add( NameIndex, CallStackAddressIndex ); } } /// Converts this script callstack frame to its equivalent string representation. public override string ToString() { string PackageName = FStreamInfo.GlobalInstance.ScriptNameArray[ PackageNameIndex ]; string ClassName = FStreamInfo.GlobalInstance.ScriptNameArray[ ClassNameIndex ]; string FunctionName = FStreamInfo.GlobalInstance.ScriptNameArray[ FunctionNameIndex ]; return "[Script] " + PackageName + "." + ClassName + ":" + FunctionName; } } /// Encapsulates a script-object type. An object that has been allocated inside script code. public class FScriptObjectType { /// Callstack adres index to the name of allocating function. public int CallStackAddressIndex; /// Constructor. public FScriptObjectType( string InTypeName ) { CallStackAddressIndex = FStreamInfo.GlobalInstance.CallStackAddressArray.Count; FStreamInfo.GlobalInstance.CallStackAddressArray.Add( new FCallStackAddress( FStreamInfo.GlobalInstance.GetNameIndex( "[" + InTypeName + "] UObject::StaticAllocateObject", true ) ) ); } } }