示例#1
0
 private static void LoadDouble(this ILGenerator ilGenerator, double value)
 {
     Assumes.NotNull(ilGenerator);
     ilGenerator.Emit(OpCodes.Ldc_R8, value);
 }
示例#2
0
        /// Generates the code that loads the supplied value on the stack
        /// This is not as simple as it seems, as different instructions need to be generated depending
        /// on its type.
        /// We support:
        /// 1. All primitive types
        /// 2. Strings
        /// 3. Enums
        /// 4. typeofs
        /// 5. nulls
        /// 6. Enumerables
        /// 7. Delegates on static functions or any of the above
        /// Everything else cannot be represented as literals
        /// <param name="ilGenerator"></param>
        /// <param name="item"></param>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public static void LoadValue(this ILGenerator ilGenerator, object value)
        {
            Assumes.NotNull(ilGenerator);

            //
            // Get nulls out of the way - they are basically typeless, so we just load null
            //
            if (value == null)
            {
                ilGenerator.LoadNull();
                return;
            }

            //
            // Prepare for literal loading - decide whether we should box, and handle enums properly
            //
            Type   valueType = value.GetType();
            object rawValue  = value;

            if (valueType.IsEnum)
            {
                // enums are special - we need to load the underlying constant on the stack
                rawValue  = Convert.ChangeType(value, Enum.GetUnderlyingType(valueType), null);
                valueType = rawValue.GetType();
            }

            //
            // Generate IL depending on the valueType - this is messier than it should ever be, but sadly necessary
            //
            if (valueType == GenerationServices.StringType)
            {
                // we need to check for strings before enumerables, because strings are IEnumerable<char>
                ilGenerator.LoadString((string)rawValue);
            }
            else if (GenerationServices.TypeType.IsAssignableFrom(valueType))
            {
                ilGenerator.LoadTypeOf((Type)rawValue);
            }
            else if (GenerationServices.IEnumerableType.IsAssignableFrom(valueType))
            {
                // NOTE : strings and dictionaries are also enumerables, but we have already handled those
                ilGenerator.LoadEnumerable((IEnumerable)rawValue);
            }
            else if (
                (valueType == GenerationServices.CharType) ||
                (valueType == GenerationServices.BooleanType) ||
                (valueType == GenerationServices.ByteType) ||
                (valueType == GenerationServices.SByteType) ||
                (valueType == GenerationServices.Int16Type) ||
                (valueType == GenerationServices.UInt16Type) ||
                (valueType == GenerationServices.Int32Type)
                )
            {
                // NOTE : Everything that is 32 bit or less uses ldc.i4. We need to pass int32, even if the actual types is shorter - this is IL memory model
                // direct casting to (int) won't work, because the value is boxed, thus we need to use Convert.
                // Sadly, this will not work for all cases - namely large uint32 - because they can't semantically fit into 32 signed bits
                // We have a special case for that next
                ilGenerator.LoadInt((int)Convert.ChangeType(rawValue, typeof(int), CultureInfo.InvariantCulture));
            }
            else if (valueType == GenerationServices.UInt32Type)
            {
                // NOTE : This one is a bit tricky. Ldc.I4 takes an Int32 as an argument, although it really treats it as a 32bit number
                // That said, some UInt32 values are larger that Int32.MaxValue, so the Convert call above will fail, which is why
                // we need to treat this case individually and cast to uint, and then - unchecked - to int.
                ilGenerator.LoadInt(unchecked ((int)((uint)rawValue)));
            }
            else if (valueType == GenerationServices.Int64Type)
            {
                ilGenerator.LoadLong((long)rawValue);
            }
            else if (valueType == GenerationServices.UInt64Type)
            {
                // NOTE : This one is a bit tricky. Ldc.I8 takes an Int64 as an argument, although it really treats it as a 64bit number
                // That said, some UInt64 values are larger that Int64.MaxValue, so the direct case we use above (or Convert, for that matter)will fail, which is why
                // we need to treat this case individually and cast to ulong, and then - unchecked - to long.
                ilGenerator.LoadLong(unchecked ((long)((ulong)rawValue)));
            }
            else if (valueType == GenerationServices.SingleType)
            {
                ilGenerator.LoadFloat((float)rawValue);
            }
            else if (valueType == GenerationServices.DoubleType)
            {
                ilGenerator.LoadDouble((double)rawValue);
            }
            else
            {
                throw new InvalidOperationException(
                          string.Format(CultureInfo.CurrentCulture, Strings.InvalidMetadataValue, value.GetType().FullName));
            }
        }
示例#3
0
 private static void LoadLong(this ILGenerator ilGenerator, long value)
 {
     Assumes.NotNull(ilGenerator);
     ilGenerator.Emit(OpCodes.Ldc_I8, value);
 }
示例#4
0
 private static void LoadFloat(this ILGenerator ilGenerator, float value)
 {
     Assumes.NotNull(ilGenerator);
     ilGenerator.Emit(OpCodes.Ldc_R4, value);
 }
示例#5
0
 private static void LoadInt(this ILGenerator ilGenerator, int value)
 {
     Assumes.NotNull(ilGenerator);
     ilGenerator.Emit(OpCodes.Ldc_I4, value);
 }
示例#6
0
 public void NotNullOfT1T2T3_ValueAsValue1ArgumentAndValue2ArgumentAndValue3Argument_ShouldNotThrow()
 {
     Assumes.NotNull <string, string, string>("Value", "Value", "Value");
 }
示例#7
0
 public void NotNullOfT_ValueAsValueArgument_ShouldNotThrow()
 {
     Assumes.NotNull <string>("Value");
 }
示例#8
0
 internal static void NotNullOrEmpty <T>(T[] values)
 {
     Assumes.NotNull(values);
     Assumes.IsTrue(values.Length > 0);
 }
示例#9
0
        public static string GetDisplayName(Type declaringType, string name)
        {
            Assumes.NotNull(declaringType);

            return(declaringType.GetDisplayName() + "." + name);
        }