예제 #1
0
        private static string GetCompareOperatorName(LogicalCompareOperation op)
        {
            switch (op)
            {
            case LogicalCompareOperation.Equal:
                return("Equality");

            case LogicalCompareOperation.NotEqual:
                return("Inequality");

            case LogicalCompareOperation.GreaterThan:
                return("GreaterThan");

            case LogicalCompareOperation.LessThan:
                return("LessThan");

            case LogicalCompareOperation.GreaterThanOrEqual:
                return("GreaterThanOrEqual");

            case LogicalCompareOperation.LessThanOrEqual:
                return("LessThanOrEqual");

            default:
                Debug.Assert(false, "unknown compare type");
                return(null);
            }
        }
예제 #2
0
        private static void EmitStringEquality(FleeILGenerator ilg, LogicalCompareOperation op, IServiceProvider services)
        {
            // Get the StringComparison from the options
            ExpressionOptions   options = (ExpressionOptions)services.GetService(typeof(ExpressionOptions));
            Int32LiteralElement ic      = new Int32LiteralElement((int)options.StringComparison);

            ic.Emit(ilg, services);

            // and emit the method call
            System.Reflection.MethodInfo mi = typeof(string).GetMethod("Equals", new Type[] { typeof(string), typeof(string), typeof(StringComparison) }, null);
            ilg.Emit(OpCodes.Call, mi);

            if (op == LogicalCompareOperation.NotEqual)
            {
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
            }
        }
예제 #3
0
        private static void EmitStringEquality(YaleIlGenerator ilg, LogicalCompareOperation op, ExpressionContext context)
        {
            // Get the StringComparison from the options
            var options             = context.BuilderOptions;
            var int32LiteralElement = new Int32LiteralElement((int)options.StringComparison);

            int32LiteralElement.Emit(ilg, context);

            // and emit the method call
            var methodInfo = typeof(string).GetMethod("Equals", new[] { typeof(string), typeof(string), typeof(StringComparison) }, null);

            ilg.Emit(OpCodes.Call, methodInfo);

            if (op == LogicalCompareOperation.NotEqual)
            {
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
            }
        }
예제 #4
0
        /// <summary>
        /// Emit the actual compare
        /// </summary>
        /// <param name="ilg"></param>
        /// <param name="op"></param>
        private void EmitCompareOperation(FleeILGenerator ilg, LogicalCompareOperation op)
        {
            OpCode ltOpcode = this.GetCompareGTLTOpcode(false);
            OpCode gtOpcode = this.GetCompareGTLTOpcode(true);

            switch (op)
            {
            case LogicalCompareOperation.Equal:
                ilg.Emit(OpCodes.Ceq);
                break;

            case LogicalCompareOperation.LessThan:
                ilg.Emit(ltOpcode);
                break;

            case LogicalCompareOperation.GreaterThan:
                ilg.Emit(gtOpcode);
                break;

            case LogicalCompareOperation.NotEqual:
                ilg.Emit(OpCodes.Ceq);
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
                break;

            case LogicalCompareOperation.LessThanOrEqual:
                ilg.Emit(gtOpcode);
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
                break;

            case LogicalCompareOperation.GreaterThanOrEqual:
                ilg.Emit(ltOpcode);
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
                break;

            default:
                Debug.Fail("Unknown op type");
                break;
            }
        }
예제 #5
0
        private static void EmitStringEquality(FleeIlGenerator ilg, LogicalCompareOperation op, IServiceProvider services)
        {
            var options = (ExpressionOptions)services.GetService(typeof(ExpressionOptions));
            var ic      = new Int32LiteralElement((int)options.StringComparison);

            ic.Emit(ilg, services);
            var mi = typeof(string).GetMethod("Equals", BindingFlags.Static | BindingFlags.Public, null, new[]
            {
                typeof(string),
                typeof(string),
                typeof(StringComparison)
            }, null);

            ilg.Emit(OpCodes.Call, mi);
            var flag = op == LogicalCompareOperation.NotEqual;

            if (flag)
            {
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
            }
        }
예제 #6
0
        private static string GetCompareOperatorName(LogicalCompareOperation op)
        {
            string getCompareOperatorName = null;

            switch (op)
            {
            case LogicalCompareOperation.LessThan:
                getCompareOperatorName = "LessThan";
                break;

            case LogicalCompareOperation.GreaterThan:
                getCompareOperatorName = "GreaterThan";
                break;

            case LogicalCompareOperation.Equal:
                getCompareOperatorName = "Equality";
                break;

            case LogicalCompareOperation.NotEqual:
                getCompareOperatorName = "Inequality";
                break;

            case LogicalCompareOperation.LessThanOrEqual:
                getCompareOperatorName = "LessThanOrEqual";
                break;

            case LogicalCompareOperation.GreaterThanOrEqual:
                getCompareOperatorName = "GreaterThanOrEqual";
                break;

            default:
                Debug.Assert(false, "unknown compare type");
                break;
            }
            return(getCompareOperatorName);
        }
예제 #7
0
 protected override void GetOperation(object operation)
 {
     _myOperation = (LogicalCompareOperation)operation;
 }
예제 #8
0
 public void Initialize(ExpressionElement leftChild, ExpressionElement rightChild, LogicalCompareOperation op)
 {
     MyLeftChild  = leftChild;
     MyRightChild = rightChild;
     _myOperation = op;
 }
예제 #9
0
 private static bool IsOpTypeEqualOrNotEqual(LogicalCompareOperation op)
 {
     return(op == LogicalCompareOperation.Equal | op == LogicalCompareOperation.NotEqual);
 }
예제 #10
0
 protected override void GetOperation(object operation)
 {
     MyOperation = (LogicalCompareOperation)operation;
 }
예제 #11
0
 public void Initialize(ExpressionElement leftChild, ExpressionElement rightChild, LogicalCompareOperation op)
 {
     MyLeftChild = leftChild;
     MyRightChild = rightChild;
     MyOperation = op;
 }
예제 #12
0
        // Emit the actual compare
        private void EmitCompareOperation(FleeILGenerator ilg, LogicalCompareOperation op)
        {
            var ltOpcode = this.GetCompareGTLTOpcode(false);
            var gtOpcode = this.GetCompareGTLTOpcode(true);

            switch (op) {
                case LogicalCompareOperation.Equal:
                    ilg.Emit(OpCodes.Ceq);
                    break;
                case LogicalCompareOperation.LessThan:
                    ilg.Emit(ltOpcode);
                    break;
                case LogicalCompareOperation.GreaterThan:
                    ilg.Emit(gtOpcode);
                    break;
                case LogicalCompareOperation.NotEqual:
                    ilg.Emit(OpCodes.Ceq);
                    ilg.Emit(OpCodes.Ldc_I4_0);
                    ilg.Emit(OpCodes.Ceq);
                    break;
                case LogicalCompareOperation.LessThanOrEqual:
                    ilg.Emit(gtOpcode);
                    ilg.Emit(OpCodes.Ldc_I4_0);
                    ilg.Emit(OpCodes.Ceq);
                    break;
                case LogicalCompareOperation.GreaterThanOrEqual:
                    ilg.Emit(ltOpcode);
                    ilg.Emit(OpCodes.Ldc_I4_0);
                    ilg.Emit(OpCodes.Ceq);
                    break;
                default:
                    Debug.Fail("Unknown op type");
                    break;
            }
        }
예제 #13
0
 private static bool IsOpTypeEqualOrNotEqual(LogicalCompareOperation op)
 {
     return op == LogicalCompareOperation.Equal | op == LogicalCompareOperation.NotEqual;
 }
예제 #14
0
 private static string GetCompareOperatorName(LogicalCompareOperation op)
 {
     switch (op) {
         case LogicalCompareOperation.Equal:
             return "Equality";
         case LogicalCompareOperation.NotEqual:
             return "Inequality";
         case LogicalCompareOperation.GreaterThan:
             return "GreaterThan";
         case LogicalCompareOperation.LessThan:
             return "LessThan";
         case LogicalCompareOperation.GreaterThanOrEqual:
             return "GreaterThanOrEqual";
         case LogicalCompareOperation.LessThanOrEqual:
             return "LessThanOrEqual";
         default:
             Debug.Assert(false, "unknown compare type");
             return null;
     }
 }
예제 #15
0
        private static void EmitStringEquality(FleeILGenerator ilg, LogicalCompareOperation op, IServiceProvider services)
        {
            // Get the StringComparison from the options
            var options = (ExpressionOptions)services.GetService(typeof(ExpressionOptions));
            var ic = new Int32LiteralElement((int)options.StringComparison);

            ic.Emit(ilg, services);

            // and emit the method call
            var mi = typeof(string).GetMethod("Equals", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, new Type[] {
                typeof(string),
                typeof(string),
                typeof(StringComparison)
            }, null);
            ilg.Emit(OpCodes.Call, mi);

            if (op == LogicalCompareOperation.NotEqual) {
                ilg.Emit(OpCodes.Ldc_I4_0);
                ilg.Emit(OpCodes.Ceq);
            }
        }
예제 #16
0
 public void Initialize(BaseExpressionElement leftChild, BaseExpressionElement rightChild, LogicalCompareOperation operation)
 {
     this.operation = operation;
     LeftChild      = leftChild;
     RightChild     = (Int32LiteralElement)rightChild;
 }