From b2d7637438fd646282f31fc26cafcd02a0b89fe2 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 24 May 2025 00:01:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20VirtualMethodGroupCalculat?= =?UTF-8?q?or=E6=B2=A1=E6=9C=89=E8=80=83=E8=99=91=E5=88=B0=E6=9F=90?= =?UTF-8?q?=E4=B8=AA=E7=B1=BB=E6=9C=AC=E8=BA=AB=E6=B2=A1=E6=9C=89=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=AE=83=E7=9A=84=E6=8E=A5=E5=8F=A3=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E6=9F=90=E4=B8=AA=E5=87=BD=E6=95=B0=E4=BD=86=E5=AE=83=E7=9A=84?= =?UTF-8?q?=E7=88=B6=E7=B1=BB=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=AE=83=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=B1=BB=E7=9A=84=E8=AF=A5=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E6=97=B6=E6=B2=A1=E6=9C=89=E5=B0=86=E6=8E=A5=E5=8F=A3=E7=9A=84?= =?UTF-8?q?=E8=AF=A5=E5=87=BD=E6=95=B0=E5=92=8C=E7=88=B6=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E8=AF=A5=E8=99=9A=E5=87=BD=E6=95=B0=E8=AE=A1=E7=AE=97=E4=B8=BA?= =?UTF-8?q?=E4=B8=80=E4=B8=AAGroup=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VirtualMethodGroupCalculator.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs index 03cb1b3..c555523 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/VirtualMethodGroupCalculator.cs @@ -61,6 +61,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus var typeMethods = new TypeFlatMethods(); + var interfaceMethods = new List(); if (typeDef.BaseType != null) { TypeDef baseTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(typeDef.BaseType); @@ -70,10 +71,30 @@ namespace Obfuz.ObfusPasses.SymbolObfus { TypeDef intfTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(intfType.Interface); CalculateType(intfTypeDef); - typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods); + //typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods); + interfaceMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods); } } - foreach (var method in typeDef.Methods) + foreach (MethodDef method in interfaceMethods) + { + if (typeMethods.TryFindMatchVirtualMethod(method, out var matchMethodDef)) + { + // merge group + var group = _methodGroups[matchMethodDef]; + var matchGroup = _methodGroups[method]; + if (group != matchGroup) + { + foreach (var m in matchGroup.methods) + { + group.methods.Add(m); + _methodGroups[m] = group; + } + } + } + } + + typeMethods.flatMethods.AddRange(interfaceMethods); + foreach (MethodDef method in typeDef.Methods) { if (!method.IsVirtual) {