diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs index 43d51c9..0173768 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/NameMakers/NameMakerBase.cs @@ -59,7 +59,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers public bool IsNamePreserved(VirtualMethodGroup virtualMethodGroup, string name) { - return virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(name)); + return virtualMethodGroup.GetNameConflictTypeScopes().Any(m => GetNameScope(m).IsNamePreserved(name)); } private string GetDefaultNewName(object scope, string originName) @@ -93,15 +93,15 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers while (true) { string newName = scope.GetNewName(originalName, false); - if (virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(newName))) + if (virtualMethodGroup.GetNameConflictTypeScopes().Any(s => GetNameScope(s).IsNamePreserved(newName))) { continue; } else { - foreach (var method in virtualMethodGroup.methods) + foreach (var s in virtualMethodGroup.GetNameDeclaringTypeScopes()) { - GetNameScope(method.DeclaringType).AddPreservedName(newName); + GetNameScope(s).AddPreservedName(newName); } return newName; } diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs index c555523..1670912 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs @@ -12,6 +12,36 @@ namespace Obfuz.ObfusPasses.SymbolObfus public class VirtualMethodGroup { public List methods; + + private HashSet _nameScopes; + + public HashSet GetNameConflictTypeScopes() + { + if (_nameScopes != null) + { + return _nameScopes; + } + + _nameScopes = new HashSet(); + foreach (var method in methods) + { + TypeDef cur = method.DeclaringType; + while (cur != null) + { + _nameScopes.Add(cur); + cur = MetaUtil.GetBaseTypeDef(cur); + } + } + return _nameScopes; + } + + public IEnumerable GetNameDeclaringTypeScopes() + { + foreach (var method in methods) + { + yield return method.DeclaringType; + } + } } public class VirtualMethodGroupCalculator