diff options
Diffstat (limited to 'src/mscorlib/src/System/Variant.cs')
-rw-r--r-- | src/mscorlib/src/System/Variant.cs | 395 |
1 files changed, 211 insertions, 184 deletions
diff --git a/src/mscorlib/src/System/Variant.cs b/src/mscorlib/src/System/Variant.cs index 509650b8fc..cae5bdade4 100644 --- a/src/mscorlib/src/System/Variant.cs +++ b/src/mscorlib/src/System/Variant.cs @@ -10,22 +10,23 @@ ** ** ===========================================================*/ -namespace System { - - using System; - using System.Reflection; - using System.Threading; - using System.Runtime.InteropServices; - using System.Globalization; - using System.Runtime.CompilerServices; - using System.Runtime.Versioning; - using System.Diagnostics; - using System.Diagnostics.Contracts; +using System; +using System.Reflection; +using System.Threading; +using System.Runtime.InteropServices; +using System.Globalization; +using System.Runtime.CompilerServices; +using System.Runtime.Versioning; +using System.Diagnostics; +using System.Diagnostics.Contracts; + +namespace System +{ [Serializable] [StructLayout(LayoutKind.Sequential)] - internal struct Variant { - + internal struct Variant + { //Do Not change the order of these fields. //They are mapped to the native VariantData * data structure. private Object m_objref; @@ -45,48 +46,48 @@ namespace System { // If you update this, update the corresponding stuff in OAVariantLib.cs, // COMOAVariant.cpp (2 tables, forwards and reverse), and perhaps OleVariant.h /////////////////////////////////////////////////////////////////////// - internal const int CV_EMPTY=0x0; - internal const int CV_VOID=0x1; - internal const int CV_BOOLEAN=0x2; - internal const int CV_CHAR=0x3; - internal const int CV_I1=0x4; - internal const int CV_U1=0x5; - internal const int CV_I2=0x6; - internal const int CV_U2=0x7; - internal const int CV_I4=0x8; - internal const int CV_U4=0x9; - internal const int CV_I8=0xa; - internal const int CV_U8=0xb; - internal const int CV_R4=0xc; - internal const int CV_R8=0xd; - internal const int CV_STRING=0xe; - internal const int CV_PTR=0xf; + internal const int CV_EMPTY = 0x0; + internal const int CV_VOID = 0x1; + internal const int CV_BOOLEAN = 0x2; + internal const int CV_CHAR = 0x3; + internal const int CV_I1 = 0x4; + internal const int CV_U1 = 0x5; + internal const int CV_I2 = 0x6; + internal const int CV_U2 = 0x7; + internal const int CV_I4 = 0x8; + internal const int CV_U4 = 0x9; + internal const int CV_I8 = 0xa; + internal const int CV_U8 = 0xb; + internal const int CV_R4 = 0xc; + internal const int CV_R8 = 0xd; + internal const int CV_STRING = 0xe; + internal const int CV_PTR = 0xf; internal const int CV_DATETIME = 0x10; internal const int CV_TIMESPAN = 0x11; - internal const int CV_OBJECT=0x12; + internal const int CV_OBJECT = 0x12; internal const int CV_DECIMAL = 0x13; - internal const int CV_ENUM=0x15; - internal const int CV_MISSING=0x16; - internal const int CV_NULL=0x17; - internal const int CV_LAST=0x18; + internal const int CV_ENUM = 0x15; + internal const int CV_MISSING = 0x16; + internal const int CV_NULL = 0x17; + internal const int CV_LAST = 0x18; - internal const int TypeCodeBitMask=0xffff; - internal const int VTBitMask=unchecked((int)0xff000000); - internal const int VTBitShift=24; - internal const int ArrayBitMask =0x10000; + internal const int TypeCodeBitMask = 0xffff; + internal const int VTBitMask = unchecked((int)0xff000000); + internal const int VTBitShift = 24; + internal const int ArrayBitMask = 0x10000; // Enum enum and Mask - internal const int EnumI1 =0x100000; - internal const int EnumU1 =0x200000; - internal const int EnumI2 =0x300000; - internal const int EnumU2 =0x400000; - internal const int EnumI4 =0x500000; - internal const int EnumU4 =0x600000; - internal const int EnumI8 =0x700000; - internal const int EnumU8 =0x800000; - internal const int EnumMask =0xF00000; - - internal static readonly Type [] ClassTypes = { + internal const int EnumI1 = 0x100000; + internal const int EnumU1 = 0x200000; + internal const int EnumI2 = 0x300000; + internal const int EnumU2 = 0x400000; + internal const int EnumI4 = 0x500000; + internal const int EnumU4 = 0x600000; + internal const int EnumI8 = 0x700000; + internal const int EnumU8 = 0x800000; + internal const int EnumMask = 0xF00000; + + internal static readonly Type[] ClassTypes = { typeof(System.Empty), typeof(void), typeof(Boolean), @@ -122,11 +123,11 @@ namespace System { [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern double GetR8FromVar(); [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern float GetR4FromVar(); + internal extern float GetR4FromVar(); [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern void SetFieldsR4(float val); + internal extern void SetFieldsR4(float val); [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal extern void SetFieldsR8(double val); + internal extern void SetFieldsR8(double val); [MethodImplAttribute(MethodImplOptions.InternalCall)] internal extern void SetFieldsObject(Object val); @@ -135,159 +136,181 @@ namespace System { // Ends up only taking about 1/8 the time of the ECALL version. internal long GetI8FromVar() { - return ((long)m_data2<<32 | ((long)m_data1 & 0xFFFFFFFFL)); + return ((long)m_data2 << 32 | ((long)m_data1 & 0xFFFFFFFFL)); } // // Constructors // - internal Variant(int flags, Object or, int data1, int data2) { + internal Variant(int flags, Object or, int data1, int data2) + { m_flags = flags; - m_objref=or; - m_data1=data1; - m_data2=data2; + m_objref = or; + m_data1 = data1; + m_data2 = data2; } - public Variant(bool val) { - m_objref= null; + public Variant(bool val) + { + m_objref = null; m_flags = CV_BOOLEAN; - m_data1 = (val)?Boolean.True:Boolean.False; + m_data1 = (val) ? Boolean.True : Boolean.False; m_data2 = 0; } - public Variant(sbyte val) { - m_objref=null; - m_flags=CV_I1; - m_data1=(int)val; - m_data2=(int)(((long)val)>>32); + public Variant(sbyte val) + { + m_objref = null; + m_flags = CV_I1; + m_data1 = (int)val; + m_data2 = (int)(((long)val) >> 32); } - public Variant(byte val) { - m_objref=null; - m_flags=CV_U1; - m_data1=(int)val; - m_data2=0; + public Variant(byte val) + { + m_objref = null; + m_flags = CV_U1; + m_data1 = (int)val; + m_data2 = 0; } - public Variant(short val) { - m_objref=null; - m_flags=CV_I2; - m_data1=(int)val; - m_data2=(int)(((long)val)>>32); + public Variant(short val) + { + m_objref = null; + m_flags = CV_I2; + m_data1 = (int)val; + m_data2 = (int)(((long)val) >> 32); } - public Variant(ushort val) { - m_objref=null; - m_flags=CV_U2; - m_data1=(int)val; - m_data2=0; + public Variant(ushort val) + { + m_objref = null; + m_flags = CV_U2; + m_data1 = (int)val; + m_data2 = 0; } - public Variant(char val) { - m_objref=null; - m_flags=CV_CHAR; - m_data1=(int)val; - m_data2=0; + public Variant(char val) + { + m_objref = null; + m_flags = CV_CHAR; + m_data1 = (int)val; + m_data2 = 0; } - public Variant(int val) { - m_objref=null; - m_flags=CV_I4; - m_data1=val; - m_data2=val >> 31; + public Variant(int val) + { + m_objref = null; + m_flags = CV_I4; + m_data1 = val; + m_data2 = val >> 31; } - public Variant(uint val) { - m_objref=null; - m_flags=CV_U4; - m_data1=(int)val; - m_data2=0; + public Variant(uint val) + { + m_objref = null; + m_flags = CV_U4; + m_data1 = (int)val; + m_data2 = 0; } - public Variant(long val) { - m_objref=null; - m_flags=CV_I8; + public Variant(long val) + { + m_objref = null; + m_flags = CV_I8; m_data1 = (int)val; m_data2 = (int)(val >> 32); } - public Variant(ulong val) { - m_objref=null; - m_flags=CV_U8; + public Variant(ulong val) + { + m_objref = null; + m_flags = CV_U8; m_data1 = (int)val; m_data2 = (int)(val >> 32); } - public Variant(float val) { - m_objref=null; - m_flags=CV_R4; - m_data1=0; - m_data2=0; + public Variant(float val) + { + m_objref = null; + m_flags = CV_R4; + m_data1 = 0; + m_data2 = 0; SetFieldsR4(val); } - public Variant(double val) { - m_objref=null; - m_flags=CV_R8; - m_data1=0; - m_data2=0; + public Variant(double val) + { + m_objref = null; + m_flags = CV_R8; + m_data1 = 0; + m_data2 = 0; SetFieldsR8(val); } - public Variant(DateTime val) { - m_objref=null; - m_flags=CV_DATETIME; + public Variant(DateTime val) + { + m_objref = null; + m_flags = CV_DATETIME; ulong ticks = (ulong)val.Ticks; m_data1 = (int)ticks; - m_data2 = (int)(ticks>>32); + m_data2 = (int)(ticks >> 32); } - public Variant(Decimal val) { + public Variant(Decimal val) + { m_objref = (Object)val; m_flags = CV_DECIMAL; - m_data1=0; - m_data2=0; + m_data1 = 0; + m_data2 = 0; } - public Variant(Object obj) { - m_data1=0; - m_data2=0; + public Variant(Object obj) + { + m_data1 = 0; + m_data2 = 0; VarEnum vt = VarEnum.VT_EMPTY; - if (obj is DateTime) { - m_objref=null; - m_flags=CV_DATETIME; + if (obj is DateTime) + { + m_objref = null; + m_flags = CV_DATETIME; ulong ticks = (ulong)((DateTime)obj).Ticks; m_data1 = (int)ticks; - m_data2 = (int)(ticks>>32); + m_data2 = (int)(ticks >> 32); return; } - if (obj is String) { - m_flags=CV_STRING; - m_objref=obj; + if (obj is String) + { + m_flags = CV_STRING; + m_objref = obj; return; } - if (obj == null) { + if (obj == null) + { this = Empty; return; } - if (obj == System.DBNull.Value) { + if (obj == System.DBNull.Value) + { this = DBNull; return; } - if (obj == Type.Missing) { + if (obj == Type.Missing) + { this = Missing; return; } - if (obj is Array) { - m_flags=CV_OBJECT | ArrayBitMask; - m_objref=obj; + if (obj is Array) + { + m_flags = CV_OBJECT | ArrayBitMask; + m_objref = obj; return; } @@ -336,55 +359,59 @@ namespace System { //This is a family-only accessor for the CVType. //This is never to be exposed externally. - internal int CVType { - get { - return (m_flags&TypeCodeBitMask); + internal int CVType + { + get + { + return (m_flags & TypeCodeBitMask); } } - public Object ToObject() { - switch (CVType) { - case CV_EMPTY: - return null; - case CV_BOOLEAN: - return (Object)(m_data1!=0); - case CV_I1: - return (Object)((sbyte)m_data1); - case CV_U1: - return (Object)((byte)m_data1); - case CV_CHAR: - return (Object)((char)m_data1); - case CV_I2: - return (Object)((short)m_data1); - case CV_U2: - return (Object)((ushort)m_data1); - case CV_I4: - return (Object)(m_data1); - case CV_U4: - return (Object)((uint)m_data1); - case CV_I8: - return (Object)(GetI8FromVar()); - case CV_U8: - return (Object)((ulong)GetI8FromVar()); - case CV_R4: - return (Object)(GetR4FromVar()); - case CV_R8: - return (Object)(GetR8FromVar()); - case CV_DATETIME: - return new DateTime(GetI8FromVar()); - case CV_TIMESPAN: - return new TimeSpan(GetI8FromVar()); - case CV_ENUM: - return BoxEnum(); - case CV_MISSING: - return Type.Missing; - case CV_NULL: - return System.DBNull.Value; - case CV_DECIMAL: - case CV_STRING: - case CV_OBJECT: - default: - return m_objref; + public Object ToObject() + { + switch (CVType) + { + case CV_EMPTY: + return null; + case CV_BOOLEAN: + return (Object)(m_data1 != 0); + case CV_I1: + return (Object)((sbyte)m_data1); + case CV_U1: + return (Object)((byte)m_data1); + case CV_CHAR: + return (Object)((char)m_data1); + case CV_I2: + return (Object)((short)m_data1); + case CV_U2: + return (Object)((ushort)m_data1); + case CV_I4: + return (Object)(m_data1); + case CV_U4: + return (Object)((uint)m_data1); + case CV_I8: + return (Object)(GetI8FromVar()); + case CV_U8: + return (Object)((ulong)GetI8FromVar()); + case CV_R4: + return (Object)(GetR4FromVar()); + case CV_R8: + return (Object)(GetR8FromVar()); + case CV_DATETIME: + return new DateTime(GetI8FromVar()); + case CV_TIMESPAN: + return new TimeSpan(GetI8FromVar()); + case CV_ENUM: + return BoxEnum(); + case CV_MISSING: + return Type.Missing; + case CV_NULL: + return System.DBNull.Value; + case CV_DECIMAL: + case CV_STRING: + case CV_OBJECT: + default: + return m_objref; } } @@ -488,7 +515,7 @@ namespace System { break; default: - throw new NotSupportedException(Environment.GetResourceString("NotSupported_UnknownTypeCode", ic.GetTypeCode())); + throw new NotSupportedException(SR.Format(SR.NotSupported_UnknownTypeCode, ic.GetTypeCode())); } } } @@ -534,12 +561,12 @@ namespace System { } else { - throw new InvalidCastException(Environment.GetResourceString("InvalidCast_CannotCoerceByRefVariant")); + throw new InvalidCastException(SR.InvalidCast_CannotCoerceByRefVariant); } break; default: - throw new InvalidCastException(Environment.GetResourceString("InvalidCast_CannotCoerceByRefVariant")); + throw new InvalidCastException(SR.InvalidCast_CannotCoerceByRefVariant); } } else @@ -643,7 +670,7 @@ namespace System { break; default: - throw new InvalidCastException(Environment.GetResourceString("InvalidCast_CannotCoerceByRefVariant")); + throw new InvalidCastException(SR.InvalidCast_CannotCoerceByRefVariant); } } } |