Cosmos/source/Compiler/Indy.IL2CPU.Assembler/Label.cs
2009-05-30 12:59:33 +00:00

117 lines
2.9 KiB
C#

using System;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
namespace Indy.IL2CPU.Assembler {
public class Label: Instruction {
public static string GetFullName(MethodBase aMethod) {
return MethodInfoLabelGenerator.GenerateLabelName(aMethod);
}
public static string FilterStringForIncorrectChars(string aName) {
return String.Intern(DataMember.FilterStringForIncorrectChars(aName.Replace(".", "__DOT__")));
}
public Label(MethodBase aMethod)
: this(MethodInfoLabelGenerator.GenerateLabelName(aMethod))
{
}
public Label(string aName)
{
mName = aName;
if (!aName.StartsWith("."))
{
LastFullLabel = aName;
QualifiedName = aName;
}
else
{
QualifiedName = LastFullLabel + aName;
}
}
public static string GetLabel(object aObject)
{
Label xLabel = aObject as Label;
if (xLabel == null)
return "";
return xLabel.Name;
}
public static string LastFullLabel
{
get;
set;
}
public string QualifiedName
{
get;
private set;
}
public bool IsGlobal
{
get;
set;
}
public string Name
{
get { return mName; }
}
private string mName;
public override string ToString()
{
if (IsGlobal)
{
return "global " + Name + "\r\n" + Name + ":";
}
else
{
return Name + ":";
}
}
public static string GenerateLabelName(MethodBase aMethod) {
string xResult = DataMember.FilterStringForIncorrectChars(GetFullName(aMethod));
//if (xResult.Length > 245) {
using (var xHash = MD5.Create()) {
xResult = xHash.ComputeHash(Encoding.Default.GetBytes(xResult)).Aggregate("_",
(r,
x) => r + x.ToString("X2"));
}
//}
return String.Intern(xResult);
}
public override bool IsComplete(Assembler aAssembler)
{
return true;
}
public override void UpdateAddress(Assembler aAssembler, ref ulong aAddress)
{
base.UpdateAddress(aAssembler, ref aAddress);
}
public override void WriteData(Assembler aAssembler, System.IO.Stream aOutput)
{
}
}
}