|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Internal.Text;
using Internal.TypeSystem;
using Internal.TypeSystem.Ecma;
using Internal.ReadyToRunConstants;
namespace ILCompiler.DependencyAnalysis.ReadyToRun
{
public class NewObjectFixupSignature : Signature
{
private readonly TypeDesc _typeDesc;
public NewObjectFixupSignature(TypeDesc typeDesc)
{
_typeDesc = typeDesc;
// Ensure types in signature are loadable and resolvable, otherwise we'll fail later while emitting the signature
((CompilerTypeSystemContext)typeDesc.Context).EnsureLoadableType(typeDesc);
}
public override int ClassCode => 551247760;
public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
{
ObjectDataSignatureBuilder dataBuilder = new ObjectDataSignatureBuilder(factory, relocsOnly);
if (!relocsOnly)
{
dataBuilder.AddSymbol(this);
IEcmaModule targetModule = factory.SignatureContext.GetTargetModule(_typeDesc);
SignatureContext innerContext = dataBuilder.EmitFixup(factory, ReadyToRunFixupKind.NewObject, targetModule, factory.SignatureContext);
dataBuilder.EmitTypeSignature(_typeDesc, innerContext);
}
return dataBuilder.ToObjectData();
}
public override void AppendMangledName(NameMangler nameMangler, Utf8StringBuilder sb)
{
sb.Append(nameMangler.CompilationUnitPrefix);
sb.Append($@"NewObjectSignature: ");
sb.Append(nameMangler.GetMangledTypeName(_typeDesc));
}
public override int CompareToImpl(ISortableNode other, CompilerComparer comparer)
{
NewObjectFixupSignature otherNode = (NewObjectFixupSignature)other;
return comparer.Compare(_typeDesc, otherNode._typeDesc);
}
}
}
|