// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using Internal.TypeSystem; namespace ILCompiler.DependencyAnalysis.ReadyToRun { public class ImportSectionsTableNode : ArrayOfEmbeddedDataNode<ImportSectionNode>, ISignatureEmitter { private readonly NodeFactory _r2rFactory; private bool _materializedSignature; public ImportSectionsTableNode(NodeFactory r2rFactory) : base("ImportSectionsTable", new EmbeddedObjectNodeComparer(CompilerComparer.Instance)) { _r2rFactory = r2rFactory; _r2rFactory.ManifestMetadataTable.RegisterEmitter(this); } public void MaterializeSignature() { if (!_materializedSignature) { foreach (ImportSectionNode importSection in NodesList) { importSection.MaterializeSignature(_r2rFactory); } _materializedSignature = true; } } protected override void GetElementDataForNodes(ref ObjectDataBuilder builder, NodeFactory factory, bool relocsOnly) { builder.RequireInitialPointerAlignment(); int index = 0; foreach (ImportSectionNode node in NodesList) { if (!relocsOnly) { node.InitializeOffsetFromBeginningOfArray(builder.CountBytes); node.InitializeIndexFromBeginningOfArray(index++); } node.EncodeData(ref builder, factory, relocsOnly); if (node is ISymbolDefinitionNode symbolDef) { builder.AddSymbol(symbolDef); } } } protected internal override int Phase => (int)ObjectNodePhase.Ordered; public override int ClassCode => (int)ObjectNodeOrder.ImportSectionsTableNode; } } |