diff options
Diffstat (limited to 'src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs')
-rw-r--r-- | src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs | 52 |
1 files changed, 9 insertions, 43 deletions
diff --git a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs index 9f6735b88..bee2f4de6 100644 --- a/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs +++ b/src/ILCompiler.Compiler/src/Compiler/DependencyAnalysis/DefaultConstructorMapNode.cs @@ -15,43 +15,6 @@ using ILCompiler.DependencyAnalysisFramework; namespace ILCompiler.DependencyAnalysis { /// <summary> - /// Dependency analysis node used to keep track of types needing an entry in the default - /// constructor map hashtable - /// </summary> - internal sealed class DefaultConstructorFromLazyNode : DependencyNodeCore<NodeFactory> - { - public TypeDesc TypeNeedingDefaultCtor { get; } - - public DefaultConstructorFromLazyNode(TypeDesc type) - { - Debug.Assert(!type.IsRuntimeDeterminedSubtype); - Debug.Assert(type == type.ConvertToCanonForm(CanonicalFormKind.Specific)); - Debug.Assert(type.GetDefaultConstructor() != null && !type.IsValueType); - - TypeNeedingDefaultCtor = type; - } - - public override bool HasDynamicDependencies => false; - public override bool HasConditionalStaticDependencies => false; - public override bool InterestingForDynamicDependencyAnalysis => false; - public override bool StaticDependenciesAreComputed => true; - protected override string GetName(NodeFactory factory) => "__DefaultConstructorFromLazyNode_" + factory.NameMangler.GetMangledTypeName(TypeNeedingDefaultCtor); - public override IEnumerable<CombinedDependencyListEntry> GetConditionalStaticDependencies(NodeFactory context) => null; - public override IEnumerable<CombinedDependencyListEntry> SearchDynamicDependencies(List<DependencyNodeCore<NodeFactory>> markedNodes, int firstNode, NodeFactory factory) => null; - - public override IEnumerable<DependencyListEntry> GetStaticDependencies(NodeFactory context) - { - yield return new DependencyListEntry( - context.MaximallyConstructableType(TypeNeedingDefaultCtor), - "DefaultConstructorNode type"); - - yield return new DependencyListEntry( - context.MethodEntrypoint(TypeNeedingDefaultCtor.GetDefaultConstructor(), TypeNeedingDefaultCtor.IsValueType), - "DefaultConstructorNode"); - } - } - - /// <summary> /// DefaultConstructorMap blob, containing information on default constructor entrypoints of all types used /// by lazy generic instantiations. /// </summary> @@ -80,7 +43,7 @@ namespace ILCompiler.DependencyAnalysis public override bool StaticDependenciesAreComputed => true; protected internal override int Phase => (int)ObjectNodePhase.Ordered; - protected internal override int ClassCode => (int)ObjectNodeOrder.DefaultConstructorMapNode; + public override int ClassCode => (int)ObjectNodeOrder.DefaultConstructorMapNode; protected override string GetName(NodeFactory factory) => this.GetMangledName(factory.NameMangler); @@ -96,19 +59,22 @@ namespace ILCompiler.DependencyAnalysis Section defaultConstructorHashtableSection = writer.NewSection(); defaultConstructorHashtableSection.Place(defaultConstructorHashtable); - foreach (var ctorNeeded in factory.MetadataManager.GetDefaultConstructorsNeeded()) + foreach (var type in factory.MetadataManager.GetTypesWithConstructedEETypes()) { - MethodDesc defaultCtor = ctorNeeded.TypeNeedingDefaultCtor.GetDefaultConstructor(); - Debug.Assert(defaultCtor != null); + MethodDesc defaultCtor = type.GetDefaultConstructor(); + if (defaultCtor == null) + continue; + + defaultCtor = defaultCtor.GetCanonMethodTarget(CanonicalFormKind.Specific); - ISymbolNode typeNode = factory.NecessaryTypeSymbol(ctorNeeded.TypeNeedingDefaultCtor); + ISymbolNode typeNode = factory.NecessaryTypeSymbol(type); ISymbolNode defaultCtorNode = factory.MethodEntrypoint(defaultCtor, false); Vertex vertex = writer.GetTuple( writer.GetUnsignedConstant(_externalReferences.GetIndex(typeNode)), writer.GetUnsignedConstant(_externalReferences.GetIndex(defaultCtorNode))); - int hashCode = ctorNeeded.TypeNeedingDefaultCtor.GetHashCode(); + int hashCode = type.GetHashCode(); defaultConstructorHashtable.Append((uint)hashCode, defaultConstructorHashtableSection.Place(vertex)); } |