/**
* Copyright 1998-2014 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 ) ) );
}
}
}