예제 #1
0
        // Emit the load of a constant field. We can't emit a ldsfld/ldfld of a constant so we have to get its value
        // and then emit a ldc.
        private static void EmitLiteral(FieldInfo fi, FleeILGenerator ilg, IServiceProvider services)
        {
            object         value = fi.GetValue(null);
            Type           t     = value.GetType();
            TypeCode       code  = Type.GetTypeCode(t);
            LiteralElement elem  = default(LiteralElement);

            switch (code)
            {
            case TypeCode.Char:
            case TypeCode.Byte:
            case TypeCode.SByte:
            case TypeCode.Int16:
            case TypeCode.UInt16:
            case TypeCode.Int32:
                elem = new Int32LiteralElement(System.Convert.ToInt32(value));
                break;

            case TypeCode.UInt32:
                elem = new UInt32LiteralElement((UInt32)value);
                break;

            case TypeCode.Int64:
                elem = new Int64LiteralElement((Int64)value);
                break;

            case TypeCode.UInt64:
                elem = new UInt64LiteralElement((UInt64)value);
                break;

            case TypeCode.Double:
                elem = new DoubleLiteralElement((double)value);
                break;

            case TypeCode.Single:
                elem = new SingleLiteralElement((float)value);
                break;

            case TypeCode.Boolean:
                elem = new BooleanLiteralElement((bool)value);
                break;

            case TypeCode.String:
                elem = new StringLiteralElement((string)value);
                break;

            default:
                elem = null;
                Debug.Fail("Unsupported constant type");
                break;
            }

            elem.Emit(ilg, services);
        }
예제 #2
0
        public static SingleLiteralElement Parse(string image, IServiceProvider services)
        {
            ExpressionParserOptions options = services.GetService(typeof(ExpressionParserOptions)) as ExpressionParserOptions;
            SingleLiteralElement    element = new SingleLiteralElement();

            try
            {
                float value = options.ParseSingle(image);
                return(new SingleLiteralElement(value));
            }
            catch (OverflowException)
            {
                element.OnParseOverflow(image);
                return(null);
            }
        }
        public override Node ExitReal(Token node)
        {
            LiteralElement element = default(LiteralElement);
            string         image   = node.Image;

            if (image.EndsWith("f", StringComparison.OrdinalIgnoreCase) == true)
            {
                image   = image.Remove(image.Length - 1);
                element = SingleLiteralElement.Parse(image, MyServices);
            }
            else
            {
                element = DoubleLiteralElement.Parse(image, MyServices);
            }

            node.AddValue(element);
            return(node);
        }