예제 #1
0
        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);
        }
예제 #2
0
        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);
        }