Updates referencesource to .NET 4.7
[mono-project.git] / mcs / class / referencesource / mscorlib / system / reflection / mdconstant.cs
blob3f69c080c39fd802c87ca2dad35d1ae64be8bcf7
1 // ==++==
2 //
3 // Copyright(c) Microsoft Corporation. All rights reserved.
4 //
5 // ==--==
6 // <OWNER>Microsoft</OWNER>
7 //
9 namespace System.Reflection
11 using System;
13 internal static class MdConstant
15 [System.Security.SecurityCritical] // auto-generated
16 public static unsafe Object GetValue(MetadataImport scope, int token, RuntimeTypeHandle fieldTypeHandle, bool raw)
18 CorElementType corElementType = 0;
19 long buffer = 0;
20 int length;
21 String stringVal;
23 stringVal = scope.GetDefaultValue(token, out buffer, out length, out corElementType);
25 RuntimeType fieldType = fieldTypeHandle.GetRuntimeType();
27 if (fieldType.IsEnum && raw == false)
29 long defaultValue = 0;
31 switch (corElementType)
33 #region Switch
35 case CorElementType.Void:
36 return DBNull.Value;
38 case CorElementType.Char:
39 defaultValue = *(char*)&buffer;
40 break;
42 case CorElementType.I1:
43 defaultValue = *(sbyte*)&buffer;
44 break;
46 case CorElementType.U1:
47 defaultValue = *(byte*)&buffer;
48 break;
50 case CorElementType.I2:
51 defaultValue = *(short*)&buffer;
52 break;
54 case CorElementType.U2:
55 defaultValue = *(ushort*)&buffer;
56 break;
58 case CorElementType.I4:
59 defaultValue = *(int*)&buffer;
60 break;
62 case CorElementType.U4:
63 defaultValue = *(uint*)&buffer;
64 break;
66 case CorElementType.I8:
67 defaultValue = buffer;
68 break;
70 case CorElementType.U8:
71 defaultValue = buffer;
72 break;
74 default:
75 throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
76 #endregion
79 return RuntimeType.CreateEnum(fieldType, defaultValue);
81 else if (fieldType == typeof(DateTime))
83 long defaultValue = 0;
85 switch (corElementType)
87 #region Switch
89 case CorElementType.Void:
90 return DBNull.Value;
92 case CorElementType.I8:
93 defaultValue = buffer;
94 break;
96 case CorElementType.U8:
97 defaultValue = buffer;
98 break;
100 default:
101 throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
102 #endregion
105 return new DateTime(defaultValue);
107 else
109 switch (corElementType)
111 #region Switch
113 case CorElementType.Void:
114 return DBNull.Value;
116 case CorElementType.Char:
117 return *(char*)&buffer;
119 case CorElementType.I1:
120 return *(sbyte*)&buffer;
122 case CorElementType.U1:
123 return *(byte*)&buffer;
125 case CorElementType.I2:
126 return *(short*)&buffer;
128 case CorElementType.U2:
129 return *(ushort*)&buffer;
131 case CorElementType.I4:
132 return *(int*)&buffer;
134 case CorElementType.U4:
135 return *(uint*)&buffer;
137 case CorElementType.I8:
138 return buffer;
140 case CorElementType.U8:
141 return (ulong)buffer;
143 case CorElementType.Boolean :
144 // The boolean value returned from the metadata engine is stored as a
145 // BOOL, which actually maps to an int. We need to read it out as an int
146 // to avoid problems on big-endian machines.
147 return (*(int*)&buffer != 0);
149 case CorElementType.R4 :
150 return *(float*)&buffer;
152 case CorElementType.R8:
153 return *(double*)&buffer;
155 case CorElementType.String:
156 // A string constant can be empty but never null.
157 // A nullref constant can only be type CorElementType.Class.
158 return stringVal == null ? String.Empty : stringVal;
160 case CorElementType.Class:
161 return null;
163 default:
164 throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
165 #endregion