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); }
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); } }
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"); } }
public override void Emit(YaleIlGenerator ilGenerator, ExpressionContext context) { LeftChild.Emit(ilGenerator, context); EmitShiftCount(ilGenerator, context); EmitShift(ilGenerator); }
private void EmitRegular(YaleIlGenerator ilg, ExpressionContext context) { LeftChild.Emit(ilg, context); RightChild.Emit(ilg, context); EmitCompareOperation(ilg, operation); }