Пример #1
0
        public override void Emit(YaleIlGenerator ilGenerator, ExpressionContext context)
        {
            var resultType = ResultType;

            LeftChild.Emit(ilGenerator, context);
            ImplicitConverter.EmitImplicitConvert(LeftChild.ResultType, resultType, ilGenerator);
            RightChild.Emit(ilGenerator, context);
            ImplicitConverter.EmitImplicitConvert(RightChild.ResultType, resultType, ilGenerator);
            ilGenerator.Emit(OpCodes.Xor);
        }
Пример #2
0
        public override void Emit(YaleIlGenerator ilGenerator, ExpressionContext context)
        {
            var resultType = ResultType;

            if (ReferenceEquals(resultType, typeof(bool)))
            {
                DoEmitLogical(ilGenerator, context);
            }
            else
            {
                LeftChild.Emit(ilGenerator, context);
                ImplicitConverter.EmitImplicitConvert(LeftChild.ResultType, resultType, ilGenerator);
                RightChild.Emit(ilGenerator, context);
                ImplicitConverter.EmitImplicitConvert(RightChild.ResultType, resultType, ilGenerator);
                EmitBitwiseOperation(ilGenerator, myOperation);
            }
        }
Пример #3
0
        public override void Emit(YaleIlGenerator ilGenerator, ExpressionContext context)
        {
            var binaryResultType   = ImplicitConverter.GetBinaryResultType(LeftChild.ResultType, RightChild.ResultType);
            var overloadedOperator = GetOverloadedCompareOperator();

            if (AreBothChildrenOfType(typeof(string)))
            {
                // String equality
                LeftChild.Emit(ilGenerator, context);
                RightChild.Emit(ilGenerator, context);
                EmitStringEquality(ilGenerator, operation, context);
            }
            else if (overloadedOperator != null)
            {
                EmitOverloadedOperatorCall(overloadedOperator, ilGenerator, context);
            }
            else if (binaryResultType != null)
            {
                // Emit a compare of numeric operands
                EmitChildWithConvert(LeftChild, binaryResultType, ilGenerator, context);
                EmitChildWithConvert(RightChild, binaryResultType, ilGenerator, context);
                EmitCompareOperation(ilGenerator, operation);
            }
            else if (AreBothChildrenOfType(typeof(bool)))
            {
                // Boolean equality
                EmitRegular(ilGenerator, context);
            }
            else if (AreBothChildrenReferenceTypes())
            {
                // Reference equality
                EmitRegular(ilGenerator, context);
            }
            else if (LeftChild.ResultType.IsEnum & RightChild.ResultType.IsEnum)
            {
                EmitRegular(ilGenerator, context);
            }
            else
            {
                Debug.Fail("unknown operand types");
            }
        }
Пример #4
0
 public override void Emit(YaleIlGenerator ilGenerator, ExpressionContext context)
 {
     LeftChild.Emit(ilGenerator, context);
     EmitShiftCount(ilGenerator, context);
     EmitShift(ilGenerator);
 }
Пример #5
0
 private void EmitRegular(YaleIlGenerator ilg, ExpressionContext context)
 {
     LeftChild.Emit(ilg, context);
     RightChild.Emit(ilg, context);
     EmitCompareOperation(ilg, operation);
 }