File: Compiler\DependencyAnalysis\FrozenRuntimeTypeNode.cs
Web Access
Project: src\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 Internal.IL;
using Internal.Text;
using Internal.TypeSystem;

using Debug = System.Diagnostics.Debug;

namespace ILCompiler.DependencyAnalysis
{
    public sealed class FrozenRuntimeTypeNode : FrozenObjectNode
    {
        private readonly TypeDesc _type;
        private readonly bool _withMetadata;

        public FrozenRuntimeTypeNode(TypeDesc type, bool withMetadata)
        {
            Debug.Assert(!type.IsCanonicalSubtype(CanonicalFormKind.Any));
            _type = type;
            _withMetadata = withMetadata;
        }

        public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
        {
            sb.Append(nameMangler.CompilationUnitPrefix).Append("__RuntimeType_"u8).Append(nameMangler.GetMangledTypeName(_type));
        }

        protected override int ContentSize => ObjectType.InstanceByteCount.AsInt;

        public override void EncodeContents(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly)
        {
            IEETypeNode typeSymbol = _withMetadata
                ? factory.MetadataTypeSymbol(_type)
                : factory.NecessaryTypeSymbol(_type);

            dataBuilder.EmitPointerReloc(factory.ConstructedTypeSymbol(ObjectType));
            dataBuilder.EmitPointerReloc(typeSymbol); // RuntimeType::_pUnderlyingEEType
            dataBuilder.EmitZeroPointer(); // RuntimeType::_runtimeTypeInfoHandle
        }

        protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler);

        public override int ClassCode => 726422757;

        public override int CompareToImpl(ISortableNode other, CompilerComparer comparer)
        {
            return comparer.Compare(_type, ((FrozenRuntimeTypeNode)other)._type);
        }

        public override int? ArrayLength => null;

        public override bool IsKnownImmutable => false;

        public override DefType ObjectType => _type.Context.SystemModule.GetKnownType("System"u8, "RuntimeType"u8);
    }
}