File: Compiler\DependencyAnalysis\DehydratableObjectNode.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.

namespace ILCompiler.DependencyAnalysis
{
    public abstract class DehydratableObjectNode : ObjectNode
    {
        public sealed override ObjectNodeSection GetSection(NodeFactory factory)
        {
            ObjectNodeSection desiredSection = GetDehydratedSection(factory);

            return factory.MetadataManager.IsDataDehydrated
                && desiredSection.Type != SectionType.Uninitialized
                ? ObjectNodeSection.HydrationTargetSection : desiredSection;
        }

        public sealed override ObjectData GetData(NodeFactory factory, bool relocsOnly = false)
        {
            ObjectData result = GetDehydratableData(factory, relocsOnly);

            // If we're not actually generating data yet, don't dehydrate
            bool skipDehydrating = relocsOnly;

            // If dehydration is not active, don't dehydrate
            skipDehydrating |= !factory.MetadataManager.IsDataDehydrated;

            // If the data would be placed into an uninitialized section, that's better
            // than dehydrating a bunch of zeros.
            skipDehydrating |= GetDehydratedSection(factory).Type == SectionType.Uninitialized;

            if (skipDehydrating)
                return result;

            // Otherwise return the dehydrated data
            return factory.MetadataManager.PrepareForDehydration(this, result);
        }

        protected abstract ObjectNodeSection GetDehydratedSection(NodeFactory factory);
        protected abstract ObjectData GetDehydratableData(NodeFactory factory, bool relocsOnly = false);
    }
}