File: System\EETypePtr.cs
Web Access
Project: src\src\runtime\src\coreclr\nativeaot\System.Private.CoreLib\src\System.Private.CoreLib.csproj (System.Private.CoreLib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

/*============================================================
**
**
**
** Purpose: Pointer Type to a MethodTable in the runtime.
**
**
===========================================================*/

using System.Diagnostics;
using System.Runtime.InteropServices;

using CorElementType = System.Reflection.CorElementType;
using EETypeElementType = Internal.Runtime.EETypeElementType;
using MethodTable = Internal.Runtime.MethodTable;

namespace System
{
    [StructLayout(LayoutKind.Sequential)]
    internal unsafe struct EETypePtr
    {
        private MethodTable* _value;

        internal EETypePtr(MethodTable* value)
        {
            _value = value;
        }

        internal CorElementType CorElementType
        {
            get
            {
                ReadOnlySpan<byte> map =
                [
                    default,
                    (byte)CorElementType.ELEMENT_TYPE_VOID,      // EETypeElementType.Void
                    (byte)CorElementType.ELEMENT_TYPE_BOOLEAN,   // EETypeElementType.Boolean
                    (byte)CorElementType.ELEMENT_TYPE_CHAR,      // EETypeElementType.Char
                    (byte)CorElementType.ELEMENT_TYPE_I1,        // EETypeElementType.SByte
                    (byte)CorElementType.ELEMENT_TYPE_U1,        // EETypeElementType.Byte
                    (byte)CorElementType.ELEMENT_TYPE_I2,        // EETypeElementType.Int16
                    (byte)CorElementType.ELEMENT_TYPE_U2,        // EETypeElementType.UInt16
                    (byte)CorElementType.ELEMENT_TYPE_I4,        // EETypeElementType.Int32
                    (byte)CorElementType.ELEMENT_TYPE_U4,        // EETypeElementType.UInt32
                    (byte)CorElementType.ELEMENT_TYPE_I8,        // EETypeElementType.Int64
                    (byte)CorElementType.ELEMENT_TYPE_U8,        // EETypeElementType.UInt64
                    (byte)CorElementType.ELEMENT_TYPE_I,         // EETypeElementType.IntPtr
                    (byte)CorElementType.ELEMENT_TYPE_U,         // EETypeElementType.UIntPtr
                    (byte)CorElementType.ELEMENT_TYPE_R4,        // EETypeElementType.Single
                    (byte)CorElementType.ELEMENT_TYPE_R8,        // EETypeElementType.Double

                    (byte)CorElementType.ELEMENT_TYPE_VALUETYPE, // EETypeElementType.ValueType
                    (byte)CorElementType.ELEMENT_TYPE_VALUETYPE,
                    (byte)CorElementType.ELEMENT_TYPE_VALUETYPE, // EETypeElementType.Nullable
                    (byte)CorElementType.ELEMENT_TYPE_VALUETYPE,
                    (byte)CorElementType.ELEMENT_TYPE_CLASS,     // EETypeElementType.Class
                    (byte)CorElementType.ELEMENT_TYPE_CLASS,     // EETypeElementType.Interface
                    (byte)CorElementType.ELEMENT_TYPE_CLASS,     // EETypeElementType.SystemArray
                    (byte)CorElementType.ELEMENT_TYPE_ARRAY,     // EETypeElementType.Array
                    (byte)CorElementType.ELEMENT_TYPE_SZARRAY,   // EETypeElementType.SzArray
                    (byte)CorElementType.ELEMENT_TYPE_BYREF,     // EETypeElementType.ByRef
                    (byte)CorElementType.ELEMENT_TYPE_PTR,       // EETypeElementType.Pointer
                    (byte)CorElementType.ELEMENT_TYPE_FNPTR,     // EETypeElementType.FunctionPointer
                    default, // Pad the map to 32 elements to enable range check elimination
                    default,
                    default,
                    default
                ];

                // Verify last element of the map
                Debug.Assert((byte)CorElementType.ELEMENT_TYPE_FNPTR == map[(int)EETypeElementType.FunctionPointer]);

                return (CorElementType)map[(int)ElementType];
            }
        }

        private EETypeElementType ElementType
        {
            get
            {
                return _value->ElementType;
            }
        }
    }
}