Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / mscorlib / system / reflection / mdconstant.cs
1 // ==++==
2 // 
3 //   Copyright(c) Microsoft Corporation.  All rights reserved.
4 // 
5 // ==--==
6 // <OWNER>Microsoft</OWNER>
7 // 
8
9 namespace System.Reflection
10 {
11     using System;
12
13     internal static class MdConstant
14     {
15         [System.Security.SecurityCritical]  // auto-generated
16         public static unsafe Object GetValue(MetadataImport scope, int token, RuntimeTypeHandle fieldTypeHandle, bool raw)
17         {
18             CorElementType corElementType = 0;
19             long buffer = 0;
20             int length;
21             String stringVal;
22
23             stringVal = scope.GetDefaultValue(token, out buffer, out length, out corElementType);
24
25             RuntimeType fieldType = fieldTypeHandle.GetRuntimeType();
26
27             if (fieldType.IsEnum && raw == false)
28             {
29                 long defaultValue = 0;
30
31                 switch (corElementType)
32                 {
33                     #region Switch
34
35                     case CorElementType.Void:
36                         return DBNull.Value;
37
38                     case CorElementType.Char:
39                         defaultValue = *(char*)&buffer;
40                         break;
41
42                     case CorElementType.I1:
43                         defaultValue = *(sbyte*)&buffer;
44                         break;
45
46                     case CorElementType.U1:
47                         defaultValue = *(byte*)&buffer;
48                         break;
49
50                     case CorElementType.I2:
51                         defaultValue = *(short*)&buffer;
52                         break;
53
54                     case CorElementType.U2:
55                         defaultValue = *(ushort*)&buffer;
56                         break;
57
58                     case CorElementType.I4:
59                         defaultValue = *(int*)&buffer;
60                         break;
61
62                     case CorElementType.U4:
63                         defaultValue = *(uint*)&buffer;
64                         break;
65
66                     case CorElementType.I8:
67                         defaultValue = buffer;
68                         break;
69
70                     case CorElementType.U8:
71                         defaultValue = buffer;
72                         break;
73                 
74                     default:
75                         throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
76                     #endregion
77                 }
78
79                 return RuntimeType.CreateEnum(fieldType, defaultValue);                       
80             }
81             else if (fieldType == typeof(DateTime))
82             {
83                 long defaultValue = 0;
84
85                 switch (corElementType)
86                 {
87                     #region Switch
88
89                     case CorElementType.Void:
90                         return DBNull.Value;
91                         
92                     case CorElementType.I8:
93                         defaultValue = buffer;
94                         break;
95
96                     case CorElementType.U8:
97                         defaultValue = buffer;
98                         break;
99                 
100                     default:
101                         throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
102                     #endregion  
103                 }
104
105                 return new DateTime(defaultValue);
106             }
107             else
108             {
109                 switch (corElementType)
110                 {
111                     #region Switch
112
113                     case CorElementType.Void:
114                         return DBNull.Value;
115
116                     case CorElementType.Char:
117                         return *(char*)&buffer;
118
119                     case CorElementType.I1:
120                         return *(sbyte*)&buffer;
121
122                     case CorElementType.U1:
123                         return *(byte*)&buffer;
124
125                     case CorElementType.I2:
126                         return *(short*)&buffer;
127
128                     case CorElementType.U2:
129                         return *(ushort*)&buffer;
130
131                     case CorElementType.I4:
132                         return *(int*)&buffer;
133
134                     case CorElementType.U4:
135                         return *(uint*)&buffer;
136
137                     case CorElementType.I8:
138                         return buffer;
139
140                     case CorElementType.U8:
141                         return (ulong)buffer;
142                 
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);
148
149                     case CorElementType.R4 :
150                         return *(float*)&buffer;
151
152                     case CorElementType.R8:
153                         return *(double*)&buffer;
154
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;
159
160                     case CorElementType.Class:
161                         return null;
162                     
163                     default:
164                         throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
165                     #endregion
166                 }
167             }
168         } 
169     }
170
171 }