private static BaseAssemblerElement DoResolve(Cosmos.Assembler.Assembler aAssembler, string aName) { if (!mThreadId.HasValue) { mThreadId = Thread.CurrentThread.ManagedThreadId; } else { if (mThreadId.Value != Thread.CurrentThread.ManagedThreadId) { throw new Exception("Called from multiple threads"); } } mCacheLocker.EnterReadLock(); try { if (mCache != null) { BaseAssemblerElement xTempResult; if (mCache.TryGetValue(aName, out xTempResult)) { return xTempResult; } } } finally { mCacheLocker.ExitReadLock(); } mCacheLocker.EnterWriteLock(); try { if (mCache == null) { mCache = new Dictionary<string, BaseAssemblerElement>(StringComparer.InvariantCultureIgnoreCase); int xMax = aAssembler.AllAssemblerElementCount; for (int i = 0; i < xMax; i++) { var xInstruction = aAssembler.GetAssemblerElement(i); var xLabel = xInstruction as Label; if (xLabel != null) { mCache.Add(xLabel.QualifiedName, xLabel); } var xDataMember = xInstruction as DataMember; if (xDataMember != null) { if (mCache.ContainsKey(xDataMember.Name)) { Console.Write(""); } mCache.Add(xDataMember.Name, xDataMember); } } } BaseAssemblerElement xTempResult; if (mCache.TryGetValue(aName, out xTempResult)) { return xTempResult; } throw new Exception("Cannot resolve ElementReference to '" + aName + "'!"); //foreach(var xInstruction in aAssembler.Instructions ) { // var xLabel = xInstruction as Label; // if(xLabel!=null) { // if(aName.Equals(xLabel.Name, StringComparison.InvariantCultureIgnoreCase)) { // xTempResult = xLabel; // break; // } // } //} //if (xTempResult == null) { // foreach (var xDataMember in aAssembler.DataMembers) { // if (aName.Equals(xDataMember.Name, StringComparison.InvariantCultureIgnoreCase)) { // xTempResult = xDataMember; // break; // } // } //} } finally { mCacheLocker.ExitWriteLock(); } }