Exemplo n.º 1
0
        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)));
        }
Exemplo n.º 2
0
        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));
        }