System.RuntimeCustomAttributeData.ResolveArrayValue C# (CSharp) Method

ResolveArrayValue() private method

private ResolveArrayValue ( MetadataCAArgumentStruct argument, Type type ) : object
argument Mosa.Runtime.MetadataCAArgumentStruct
type Type
return object
        private object ResolveArrayValue(MetadataCAArgumentStruct* argument, Type type)
        {
            TypeCode typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
            var valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);
            var size = valuePtr[0];
            valuePtr++;

            switch (typeCode)
            {
                // 1 byte
                case TypeCode.Boolean:
                    {
                        bool[] array = new bool[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((bool*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.U1:
                    {
                        byte[] array = new byte[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((byte*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.I1:
                    {
                        sbyte[] array = new sbyte[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((sbyte*)valuePtr)[i];
                        return array;
                    }

                // 2 bytes
                case TypeCode.Char:
                    {
                        char[] array = new char[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((char*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.U2:
                    {
                        ushort[] array = new ushort[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((ushort*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.I2:
                    {
                        short[] array = new short[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((short*)valuePtr)[i];
                        return array;
                    }

                // 4 bytes
                case TypeCode.U4:
                    {
                        uint[] array = new uint[size];
                        for (int i = 0; i < size; i++)
                            array[i] = valuePtr[i];
                        return array;
                    }

                case TypeCode.I4:
                    {
                        int[] array = new int[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((int*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.R4:
                    {
                        float[] array = new float[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((float*)valuePtr)[i];
                        return array;
                    }

                // 8 bytes
                case TypeCode.U8:
                    {
                        ulong[] array = new ulong[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((ulong*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.I8:
                    {
                        long[] array = new long[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((long*)valuePtr)[i];
                        return array;
                    }

                case TypeCode.R8:
                    {
                        double[] array = new double[size];
                        for (int i = 0; i < size; i++)
                            array[i] = ((double*)valuePtr)[i];
                        return array;
                    }

                default:

                    // TODO: Enums
                    // What kind of array is this!?
                    throw new NotSupportedException();
            }
        }