| File: Compiler\CompilerTypeSystemContext.GeneratedAssembly.cs | Web Access |
| Project: src\runtime\src\coreclr\tools\aot\ILCompiler.Compiler\ILCompiler.Compiler.csproj (ILCompiler.Compiler) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; using System.Reflection.Metadata; using Internal; using Internal.Text; using Internal.TypeSystem; using TypeHashingAlgorithms = Internal.NativeFormat.TypeHashingAlgorithms; using Interlocked = System.Threading.Interlocked; using Debug = System.Diagnostics.Debug; namespace ILCompiler { public partial class CompilerTypeSystemContext { private ModuleDesc _generatedAssembly; public ModuleDesc GeneratedAssembly { get { if (_generatedAssembly == null) { Interlocked.CompareExchange(ref _generatedAssembly, new CompilerGeneratedAssembly(this), null); } return _generatedAssembly; } } private sealed class CompilerGeneratedAssembly : ModuleDesc, IAssemblyDesc { private MetadataType _globalModuleType; public override IAssemblyDesc Assembly => this; public Utf8Span Name => "System.Private.CompilerGenerated"u8; public CompilerGeneratedAssembly(TypeSystemContext context) : base(context, null) { _globalModuleType = new CompilerGeneratedType(this); } public override IEnumerable<MetadataType> GetAllTypes() { return Array.Empty<MetadataType>(); } public override MetadataType GetGlobalModuleType() { return _globalModuleType; } public AssemblyNameInfo GetName() { return new AssemblyNameInfo("System.Private.CompilerGenerated"); } public override object GetType(Utf8Span nameSpace, Utf8Span name, NotFoundBehavior notFoundBehavior) { Debug.Fail("Resolving a TypeRef in the compiler generated assembly?"); throw new NotImplementedException(); } } /// <summary> /// A pseudo-type that owns helper methods generated by the compiler. /// This type should never be allocated (we should never see an MethodTable for it). /// </summary> internal sealed partial class CompilerGeneratedType : MetadataType { private int _hashcode; public CompilerGeneratedType(ModuleDesc module) { Module = module; } public override TypeSystemContext Context { get { return Module.Context; } } public override Utf8Span Name { get { return "<Module>"u8; } } public override string DiagnosticName { get { return "<Module>"; } } public override Utf8Span Namespace { get { return "Internal.CompilerGenerated"u8; } } public override string DiagnosticNamespace { get { return "Internal.CompilerGenerated"; } } public override int GetHashCode() { if (_hashcode != 0) return _hashcode; return InitializeHashCode(); } private int InitializeHashCode() { return _hashcode = VersionResilientHashCode.NameHashCode(Namespace, Name); } public override bool IsCanonicalSubtype(CanonicalFormKind policy) { Debug.Assert(!HasInstantiation, "Why is this generic?"); return false; } protected override TypeFlags ComputeTypeFlags(TypeFlags mask) { return TypeFlags.Class | TypeFlags.HasGenericVarianceComputed | TypeFlags.HasStaticConstructorComputed | TypeFlags.HasFinalizerComputed | TypeFlags.AttributeCacheComputed; } public override ClassLayoutMetadata GetClassLayout() { return default; } public override bool HasCustomAttribute(string attributeNamespace, string attributeName) { return false; } public override IEnumerable<MetadataType> GetNestedTypes() { return Array.Empty<MetadataType>(); } public override MetadataType GetNestedType(Utf8Span name) { return null; } protected override MethodImplRecord[] ComputeVirtualMethodImplsForType() { return Array.Empty<MethodImplRecord>(); } public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(Utf8Span name) { return Array.Empty<MethodImplRecord>(); } public override ModuleDesc Module { get; } public override PInvokeStringFormat PInvokeStringFormat { get { return PInvokeStringFormat.AutoClass; } } public override bool IsExplicitLayout { get { return false; } } public override bool IsSequentialLayout { get { return false; } } public override bool IsExtendedLayout { get { return false; } } public override bool IsAutoLayout { get { return true; } } public override bool IsBeforeFieldInit { get { return false; } } public override MetadataType BaseType { get { // Since this type should never be allocated and only serves the purpose of grouping things, // it can act like a <Module> type and have no base type. return null; } } public override bool IsSealed { get { return true; } } public override bool IsAbstract { get { return false; } } public override MetadataType ContainingType { get { return null; } } public override DefType[] ExplicitlyImplementedInterfaces { get { return Array.Empty<DefType>(); } } } } }