diff --git a/source/Indy.IL2CPU/Assembler/ElementReference.cs b/source/Indy.IL2CPU/Assembler/ElementReference.cs index b9bd70e50..122415f93 100644 --- a/source/Indy.IL2CPU/Assembler/ElementReference.cs +++ b/source/Indy.IL2CPU/Assembler/ElementReference.cs @@ -2,10 +2,10 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; namespace Indy.IL2CPU.Assembler { public class ElementReference { - public ElementReference(string aName, int aOffset) : this(aName) { Offset = aOffset; @@ -24,28 +24,48 @@ namespace Indy.IL2CPU.Assembler { private ulong? mActualAddress; + private static ReaderWriterLockSlim mCacheLocker = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); + private static SortedList mCache = new SortedList(); + + private static BaseAssemblerElement DoResolve(Assembler aAssembler, string aName) { + mCacheLocker.EnterReadLock(); + try { + BaseAssemblerElement xTempResult; + if (mCache.TryGetValue(aName, out xTempResult)) { + return xTempResult; + } + } finally { + mCacheLocker.ExitReadLock(); + } + mCacheLocker.EnterWriteLock(); + try { + BaseAssemblerElement xTempResult; + if (mCache.TryGetValue(aName, out xTempResult)) { + return xTempResult; + } + xTempResult = (from item in aAssembler.Instructions + let xLabel = item as Label + where xLabel != null && xLabel.QualifiedName.Equals(aName, StringComparison.InvariantCultureIgnoreCase) + select item).SingleOrDefault(); + if (xTempResult == null) { + xTempResult = (from item in aAssembler.DataMembers + where item.Name.Equals(aName, StringComparison.InvariantCultureIgnoreCase) + select item).SingleOrDefault(); + } + mCache.Add(aName, xTempResult); + return xTempResult; + } finally { + mCacheLocker.ExitWriteLock(); + } + } + public bool Resolve(Assembler aAssembler, out ulong aAddress) { + // if (mActualAddress != null) { aAddress = mActualAddress.Value; return true; } - var xItems = (from item in aAssembler.Instructions - let xLabel = item as Label - where xLabel != null && xLabel.QualifiedName.Equals(Name, StringComparison.InvariantCultureIgnoreCase) - select item).ToArray(); - if (xItems.Count() > 1) { - Console.Write(""); - } - BaseAssemblerElement xElement = (from item in aAssembler.Instructions - let xLabel = item as Label - where xLabel != null && xLabel.QualifiedName.Equals(Name, StringComparison.InvariantCultureIgnoreCase) - select item).SingleOrDefault(); - if (xElement == null) { - xElement = (from item in aAssembler.DataMembers - where item.Name.Equals(Name, StringComparison.InvariantCultureIgnoreCase) - select item).SingleOrDefault(); - } - + var xElement = DoResolve(aAssembler, Name); if (xElement != null) { if (xElement.ActualAddress.HasValue) { mActualAddress = (ulong)((long)xElement.ActualAddress.Value + Offset);