1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using Internal.TypeSystem; 6 7 namespace ILCompiler 8 { 9 public abstract class LazyGenericsPolicy 10 { UsesLazyGenerics(MethodDesc method)11 public abstract bool UsesLazyGenerics(MethodDesc method); UsesLazyGenerics(TypeDesc type)12 public abstract bool UsesLazyGenerics(TypeDesc type); UsesLazyGenerics(MetadataType type)13 public abstract bool UsesLazyGenerics(MetadataType type); 14 } 15 16 public sealed class AttributeDrivenLazyGenericsPolicy : LazyGenericsPolicy 17 { UsesLazyGenerics(MethodDesc method)18 public sealed override bool UsesLazyGenerics(MethodDesc method) 19 { 20 if (UsesLazyGenerics(method.OwningType)) 21 return true; 22 23 if (method.HasInstantiation) 24 return method.IsVirtual || method.HasCustomAttribute("System.Runtime.CompilerServices", "ForceLazyDictionaryAttribute"); 25 26 return false; 27 } 28 UsesLazyGenerics(TypeDesc type)29 public sealed override bool UsesLazyGenerics(TypeDesc type) 30 { 31 if (type is MetadataType) 32 return UsesLazyGenerics(type as MetadataType); 33 else 34 return false; 35 } 36 UsesLazyGenerics(MetadataType type)37 public sealed override bool UsesLazyGenerics(MetadataType type) 38 { 39 return type.HasCustomAttribute("System.Runtime.CompilerServices", "ForceLazyDictionaryAttribute"); 40 } 41 } 42 43 public sealed class LazyGenericsDisabledPolicy : LazyGenericsPolicy 44 { 45 public sealed override bool UsesLazyGenerics(MethodDesc method) => false; 46 public sealed override bool UsesLazyGenerics(TypeDesc type) => false; 47 public sealed override bool UsesLazyGenerics(MetadataType type) => false; 48 } 49 } 50