File: BlobBuilderExtensions.cs
Web Access
Project: src\src\runtime\src\tools\ilasm\src\ILAssembler\ILAssembler.csproj (ILAssembler)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;

namespace ILAssembler
{
    internal static class BlobBuilderExtensions
    {
        public static BlobBuilder SerializeSequence<T>(this ImmutableArray<T> sequence)
        {
            BlobBuilder builder = new BlobBuilder();
            builder.WriteSerializedSequence(sequence);
            return builder;
        }

        public static void WriteSerializedSequence<T>(this BlobBuilder writer, ImmutableArray<T> sequence)
        {
            foreach (T value in sequence)
            {
                WriteSerializedValue(writer, value);
            }
        }

        public static void WriteSerializedValue<T>(this BlobBuilder writer, T value)
        {
            if (typeof(T) == typeof(bool))
            {
                writer.WriteBoolean((bool)(object)value!);
            }
            else if (typeof(T) == typeof(int))
            {
                writer.WriteInt32((int)(object)value!);
            }
            else if (typeof(T) == typeof(byte))
            {
                writer.WriteByte((byte)(object)value!);
            }
            else if (typeof(T) == typeof(char))
            {
                writer.WriteUInt16((char)(object)value!);
            }
            else if (typeof(T) == typeof(double))
            {
                writer.WriteDouble((double)(object)value!);
            }
            else if (typeof(T) == typeof(short))
            {
                writer.WriteInt16((short)(object)value!);
            }
            else if (typeof(T) == typeof(long))
            {
                writer.WriteInt64((long)(object)value!);
            }
            else if (typeof(T) == typeof(sbyte))
            {
                writer.WriteSByte((sbyte)(object)value!);
            }
            else if (typeof(T) == typeof(float))
            {
                writer.WriteSingle((float)(object)value!);
            }
            else if (typeof(T) == typeof(ushort))
            {
                writer.WriteUInt16((ushort)(object)value!);
            }
            else if (typeof(T) == typeof(uint))
            {
                writer.WriteUInt32((uint)(object)value!);
            }
            else if (typeof(T) == typeof(ulong))
            {
                writer.WriteUInt64((ulong)(object)value!);
            }
            else if (typeof(T) == typeof(string))
            {
                writer.WriteSerializedString((string?)(object?)value);
            }
        }

        public static void WriteTypeEntity(this BlobBuilder builder, EntityRegistry.TypeEntity entity)
        {
            if (entity is EntityRegistry.FakeTypeEntity fakeEntity)
            {
                builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(fakeEntity.TypeSignatureHandle));
            }
            else
            {
                builder.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(entity.Handle));
            }
        }
    }
}