From 261183f2b832a792cbee2cd0b9c0b33e0cfee3ea Mon Sep 17 00:00:00 2001 From: Atsushi Eno Date: Wed, 21 Sep 2016 19:35:45 +0900 Subject: [PATCH] [api-xml-adjuster] reduce extraneous override marking. It was running override marking step on the same object as many times as it is inherited (say, java.lang.Object was inspected for N times by N types in a library...). There isn't a huge amount of perf. improvements, but as far as I tried with api-[10..24].xml.in generation locally, the results were like: old: real 0m55.898s user 0m55.508s sys 0m0.336s new: real 0m53.326s user 0m52.552s sys 0m0.692s --- .../JavaApiOverrideMarkerExtensions.cs | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiOverrideMarkerExtensions.cs b/src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiOverrideMarkerExtensions.cs index 1d15e551d..b89c5ddd6 100644 --- a/src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiOverrideMarkerExtensions.cs +++ b/src/Xamarin.Android.Tools.ApiXmlAdjuster/JavaApiOverrideMarkerExtensions.cs @@ -6,36 +6,30 @@ namespace Xamarin.Android.Tools.ApiXmlAdjuster { public static class JavaApiOverrideMarkerExtensions { - + public static void MarkOverrides (this JavaApi api) + { + api.MarkOverrides (new HashSet ()); + } + + public static void MarkOverrides (this JavaApi api, HashSet doneList) { foreach (var kls in api.Packages.SelectMany (p => p.Types).OfType ()) - kls.MarkOverrides (); + kls.MarkOverrides (doneList); } - static void MarkOverrides (this JavaClass cls) + static void MarkOverrides (this JavaClass cls, HashSet doneList) { + if (doneList.Contains (cls)) + return; + doneList.Add (cls); + var baseClass = cls.ResolvedExtends == null ? null :cls.ResolvedExtends.ReferencedType as JavaClass; if (baseClass != null) - baseClass.MarkOverrides (); + baseClass.MarkOverrides (doneList); foreach (var method in cls.Members.OfType ()) cls.MarkBaseMethod (method); -/* -foreach (var m in cls.Members.OfType ().Where (_ => _.BaseMethod != null)) { - var b = m.BaseMethod.Method; - if (m.ExtendedJniSignature != b.ExtendedJniSignature) - Console.WriteLine ("Method {0}.{1}#{2}({3}) | {8}\n overrides {4}.{5}#{6}({7}) | {9}", - m.Parent.Parent.Name, m.Parent.Name, m.Name, string.Join (", ", m.Parameters.Select (p => p.Type)), - b.Parent.Parent.Name, b.Parent.Name, b.Name, string.Join (", ", b.Parameters.Select (p => p.Type)), - m.ExtendedJniSignature, b.ExtendedJniSignature); -} -foreach (var m in cls.Members.OfType ()) - foreach (var para in m.Parameters.Where (p => p.InstantiatedGenericArgumentName != null)) - Console.WriteLine ("Method {0}.{1}#{2}({3}) has generics-instantiated parameter {4} ({5} -> {6})", - m.Parent.Parent.Name, m.Parent.Name, m.Name, string.Join (", ", m.Parameters.Select (p => p.Type)), - para.Name, para.InstantiatedGenericArgumentName, para.Type); -*/ } static void MarkBaseMethod (this JavaClass cls, JavaMethod method)