Beispiel #1
0
        public override string TryInferType(CIntermediateLang cil)
        {
            switch (Op)
            {
            case OpType.Add:
            case OpType.Sub:
            case OpType.Mul:
            case OpType.Div:
                return(CTypes.BestNumberType(Lhs.TryInferType(cil), Rhs.TryInferType(cil)));

            case OpType.Mod:
            case OpType.And:
            case OpType.Or:
            case OpType.Xor:
            case OpType.LShift:
            case OpType.RShift:
                return(CTypes.LargerIntegerType(Lhs.TryInferType(cil), Rhs.TryInferType(cil)));

            case OpType.Equals:
            case OpType.NotEquals:
            case OpType.LessThan:
            case OpType.LessThanEquals:
            case OpType.GreaterThan:
            case OpType.GreaterThanEquals:
                return("int");
            }
            throw new NotImplementedException("TODO: Exception for type inference failing.");
        }
Beispiel #2
0
        public override LllType TryInferType(CIntermediateLang cil)
        {
            var lhsTy = Lhs.TryInferType(cil);
            var rhsTy = Rhs.TryInferType(cil);

            if (lhsTy is LllIntegerType && rhsTy is LllIntegerType)
            {
                if (Rhs is AstNumber)
                {
                    return(lhsTy);
                }
                if (Lhs is AstNumber)
                {
                    return(rhsTy);
                }
            }
            if (lhsTy.Equals(rhsTy))
            {
                return(lhsTy);
            }
            if (rhsTy.TryCast(lhsTy))
            {
                return(lhsTy);
            }
            if (lhsTy.TryCast(rhsTy))
            {
                return(rhsTy);
            }
            // 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.TryInferType(cil));
        }
Beispiel #3
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));
        }