From febb8c9fd8c1c221a5539a766e7c8be31d0e1727 Mon Sep 17 00:00:00 2001 From: walon Date: Thu, 29 May 2025 09:20:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=A1=E7=AE=97=E8=99=9A?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=90=8D=E5=86=B2=E7=AA=81=E5=9F=9F=E6=97=B6?= =?UTF-8?q?=E5=8F=AA=E8=80=83=E8=99=91=E5=88=B0=E8=99=9A=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=89=80=E5=AE=9A=E4=B9=89=E7=9A=84=E7=B1=BB=EF=BC=8C=E8=80=8C?= =?UTF-8?q?=E6=9C=AA=E8=80=83=E8=99=91=E5=88=B0=E5=9C=A8=E6=95=B4=E4=B8=AA?= =?UTF-8?q?=E7=B1=BB=E7=BB=A7=E6=89=BF=E6=A0=91=E5=86=85=E4=B8=8D=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SymbolObfus/NameMakers/NameMakerBase.cs | 8 ++--- .../VirtualMethodGroupCalculator.cs | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) 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