diff --git a/Editor/AOT/Analyzer.cs b/Editor/AOT/Analyzer.cs index a30410e..5d9c475 100644 --- a/Editor/AOT/Analyzer.cs +++ b/Editor/AOT/Analyzer.cs @@ -58,15 +58,15 @@ namespace HybridCLR.Editor.AOT return; } gc = gc.ToGenericShare(); - if (_genericTypes.Add(gc) && NeedWalk(gc.Type)) + if (_genericTypes.Add(gc) && NeedWalk(null, gc.Type)) { WalkType(gc); } } - private bool NeedWalk(TypeDef type) + private bool NeedWalk(MethodDef callFrom, TypeDef type) { - return _hotUpdateAssemblyFiles.Contains(type.Module.Name); + return _hotUpdateAssemblyFiles.Contains(type.Module.Name) || callFrom == null || callFrom.HasGenericParameters; } private bool IsAotType(TypeDef type) @@ -85,7 +85,7 @@ namespace HybridCLR.Editor.AOT { return; } - if (_genericMethods.Add(method) && NeedWalk(method.Method.DeclaringType)) + if (NeedWalk(methodDef, method.Method.DeclaringType) && _genericMethods.Add(method)) { _newMethods.Add(method); } @@ -101,7 +101,7 @@ namespace HybridCLR.Editor.AOT { return; } - if (_genericMethods.Add(method) && NeedWalk(method.Method.DeclaringType)) + if (NeedWalk(null, method.Method.DeclaringType) && _genericMethods.Add(method)) { _newMethods.Add(method); } @@ -157,9 +157,9 @@ namespace HybridCLR.Editor.AOT for (uint rid = 1, n = ass.Metadata.TablesStream.TypeSpecTable.Rows; rid <= n; rid++) { var ts = ass.ResolveTypeSpec(rid); - if (!ts.ContainsGenericParameter) + var cs = GenericClass.ResolveClass(ts, null)?.ToGenericShare(); + if (cs != null) { - var cs = GenericClass.ResolveClass(ts, null)?.ToGenericShare(); TryAddAndWalkGenericType(cs); } } @@ -167,10 +167,6 @@ namespace HybridCLR.Editor.AOT for (uint rid = 1, n = ass.Metadata.TablesStream.MethodSpecTable.Rows; rid <= n; rid++) { var ms = ass.ResolveMethodSpec(rid); - if (ms.DeclaringType.ContainsGenericParameter || ms.GenericInstMethodSig.ContainsGenericParameter) - { - continue; - } var gm = GenericMethod.ResolveMethod(ms, null)?.ToGenericShare(); TryAddMethodNotWalkType(gm); }