summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/Reflection/MdConstant.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/Reflection/MdConstant.cs')
-rw-r--r--src/mscorlib/src/System/Reflection/MdConstant.cs168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Reflection/MdConstant.cs b/src/mscorlib/src/System/Reflection/MdConstant.cs
new file mode 100644
index 0000000000..e406678a58
--- /dev/null
+++ b/src/mscorlib/src/System/Reflection/MdConstant.cs
@@ -0,0 +1,168 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+//
+
+namespace System.Reflection
+{
+ using System;
+
+ internal static class MdConstant
+ {
+ [System.Security.SecurityCritical] // auto-generated
+ public static unsafe Object GetValue(MetadataImport scope, int token, RuntimeTypeHandle fieldTypeHandle, bool raw)
+ {
+ CorElementType corElementType = 0;
+ long buffer = 0;
+ int length;
+ String stringVal;
+
+ stringVal = scope.GetDefaultValue(token, out buffer, out length, out corElementType);
+
+ RuntimeType fieldType = fieldTypeHandle.GetRuntimeType();
+
+ if (fieldType.IsEnum && raw == false)
+ {
+ long defaultValue = 0;
+
+ switch (corElementType)
+ {
+ #region Switch
+
+ case CorElementType.Void:
+ return DBNull.Value;
+
+ case CorElementType.Char:
+ defaultValue = *(char*)&buffer;
+ break;
+
+ case CorElementType.I1:
+ defaultValue = *(sbyte*)&buffer;
+ break;
+
+ case CorElementType.U1:
+ defaultValue = *(byte*)&buffer;
+ break;
+
+ case CorElementType.I2:
+ defaultValue = *(short*)&buffer;
+ break;
+
+ case CorElementType.U2:
+ defaultValue = *(ushort*)&buffer;
+ break;
+
+ case CorElementType.I4:
+ defaultValue = *(int*)&buffer;
+ break;
+
+ case CorElementType.U4:
+ defaultValue = *(uint*)&buffer;
+ break;
+
+ case CorElementType.I8:
+ defaultValue = buffer;
+ break;
+
+ case CorElementType.U8:
+ defaultValue = buffer;
+ break;
+
+ default:
+ throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
+ #endregion
+ }
+
+ return RuntimeType.CreateEnum(fieldType, defaultValue);
+ }
+ else if (fieldType == typeof(DateTime))
+ {
+ long defaultValue = 0;
+
+ switch (corElementType)
+ {
+ #region Switch
+
+ case CorElementType.Void:
+ return DBNull.Value;
+
+ case CorElementType.I8:
+ defaultValue = buffer;
+ break;
+
+ case CorElementType.U8:
+ defaultValue = buffer;
+ break;
+
+ default:
+ throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
+ #endregion
+ }
+
+ return new DateTime(defaultValue);
+ }
+ else
+ {
+ switch (corElementType)
+ {
+ #region Switch
+
+ case CorElementType.Void:
+ return DBNull.Value;
+
+ case CorElementType.Char:
+ return *(char*)&buffer;
+
+ case CorElementType.I1:
+ return *(sbyte*)&buffer;
+
+ case CorElementType.U1:
+ return *(byte*)&buffer;
+
+ case CorElementType.I2:
+ return *(short*)&buffer;
+
+ case CorElementType.U2:
+ return *(ushort*)&buffer;
+
+ case CorElementType.I4:
+ return *(int*)&buffer;
+
+ case CorElementType.U4:
+ return *(uint*)&buffer;
+
+ case CorElementType.I8:
+ return buffer;
+
+ case CorElementType.U8:
+ return (ulong)buffer;
+
+ case CorElementType.Boolean :
+ // The boolean value returned from the metadata engine is stored as a
+ // BOOL, which actually maps to an int. We need to read it out as an int
+ // to avoid problems on big-endian machines.
+ return (*(int*)&buffer != 0);
+
+ case CorElementType.R4 :
+ return *(float*)&buffer;
+
+ case CorElementType.R8:
+ return *(double*)&buffer;
+
+ case CorElementType.String:
+ // A string constant can be empty but never null.
+ // A nullref constant can only be type CorElementType.Class.
+ return stringVal == null ? String.Empty : stringVal;
+
+ case CorElementType.Class:
+ return null;
+
+ default:
+ throw new FormatException(Environment.GetResourceString("Arg_BadLiteralFormat"));
+ #endregion
+ }
+ }
+ }
+ }
+
+} \ No newline at end of file