private CILExpression ToCILCondition(CIntermediateLang cil) { var condOp = (Op == TokenType.LogicAnd) ? CILCondition.CondType.And : CILCondition.CondType.Or; return(new CILCondition( SourceInfo, Lhs.ToCILExpression(cil), condOp, Rhs.ToCILExpression(cil))); }
public override CILExpression ToCILExpression(CIntermediateLang cil) { if (IsConditionalOp()) { return(ToCILCondition(cil)); } var lhsTy = Lhs.TryInferType(cil); var lhs = lhsTy.IsAReference ? new CILDereference(Lhs.SourceInfo, Lhs.ToCILExpression(cil)) : Lhs.ToCILExpression(cil); var rhsTy = Rhs.TryInferType(cil); var rhs = rhsTy.IsAReference ? new CILDereference(Rhs.SourceInfo, Rhs.ToCILExpression(cil)) : Rhs.ToCILExpression(cil); // primitives, just use the builtin operators if (lhsTy.IsPrimitive && rhsTy.IsPrimitive) { return(new CILBinaryOp( SourceInfo, lhs, _binOpInfo[Op].CILOpType, rhs)); } // not primitive, make a call to lhs.__op__(rhs); var opAlias = _binOpInfo[Op].CallAlias; var member = new AstMemberAccess(SourceInfo, Lhs, opAlias); var opCall = new AstCall(SourceInfo, member, new List <AstExpression> { Rhs }); return(opCall.ToCILExpression(cil)); }