private void InitializeInverseGenericParamOwnerRidList() { if (gpRidToOwnerRid != null) { return; } var gpTable = tablesStream.GenericParamTable; var newGpRidToOwnerRid = new uint[gpTable.Rows]; // Find all owners by reading the GenericParam.Owner column var ownerCol = gpTable.TableInfo.Columns[2]; var ownersDict = new ThreadSafe.Dictionary <uint, bool>(); #if THREAD_SAFE tablesStream.theLock.EnterWriteLock(); try { #endif for (uint rid = 1; rid <= gpTable.Rows; rid++) { uint owner; if (!tablesStream.ReadColumn_NoLock(gpTable, rid, ownerCol, out owner)) { continue; } ownersDict[owner] = true; } #if THREAD_SAFE } finally { tablesStream.theLock.ExitWriteLock(); } #endif // Now that we have the owners, find all the generic params they own. An obfuscated // module could have 2+ owners pointing to the same generic param row. var owners = new ThreadSafe.List <uint>(ownersDict.Keys); owners.Sort(); for (var i = 0; i < owners.Count; i++) { uint ownerToken; if (!CodedToken.TypeOrMethodDef.Decode(owners[i], out ownerToken)) { continue; } var ridList = GetGenericParamRidList(MDToken.ToTable(ownerToken), MDToken.ToRID(ownerToken)); for (uint j = 0; j < ridList.Length; j++) { var ridIndex = ridList[j] - 1; if (newGpRidToOwnerRid[ridIndex] != 0) { continue; } newGpRidToOwnerRid[ridIndex] = owners[i]; } } Interlocked.CompareExchange(ref gpRidToOwnerRid, newGpRidToOwnerRid, null); }
private void InitializeInverseGenericParamConstraintOwnerRidList() { if (gpcRidToOwnerRid != null) { return; } var gpcTable = tablesStream.GenericParamConstraintTable; var newGpcRidToOwnerRid = new uint[gpcTable.Rows]; var ownerCol = gpcTable.TableInfo.Columns[0]; var ownersDict = new ThreadSafe.Dictionary <uint, bool>(); #if THREAD_SAFE tablesStream.theLock.EnterWriteLock(); try { #endif for (uint rid = 1; rid <= gpcTable.Rows; rid++) { uint owner; if (!tablesStream.ReadColumn_NoLock(gpcTable, rid, ownerCol, out owner)) { continue; } ownersDict[owner] = true; } #if THREAD_SAFE } finally { tablesStream.theLock.ExitWriteLock(); } #endif var owners = new ThreadSafe.List <uint>(ownersDict.Keys); owners.Sort(); for (var i = 0; i < owners.Count; i++) { var ownerToken = owners[i]; var ridList = GetGenericParamConstraintRidList(ownerToken); for (uint j = 0; j < ridList.Length; j++) { var ridIndex = ridList[j] - 1; if (newGpcRidToOwnerRid[ridIndex] != 0) { continue; } newGpcRidToOwnerRid[ridIndex] = ownerToken; } } Interlocked.CompareExchange(ref gpcRidToOwnerRid, newGpcRidToOwnerRid, null); }