Пример #1
0
        private CILExpression CreateDtorCall(CIntermediateLang cil)
        {
            var rewrite = new List <CILNode>();
            var dtorTy  = Expression.TryInferType(cil);
            var dtor    = string.Format("{0}_{1}_{0}p", dtorTy.Name, "Dtor");
            var dtorSym = LllCompiler.SymTable.LookupSymbol(dtor);
            var dtorExt = dtorSym?.Extra as AstExtend;

            if (dtorExt != null && !dtorExt.CanOverride)
            {
                var callDtor = new AstCall(SourceInfo, new AstIdent(SourceInfo, dtor), new List <AstExpression> {
                    Expression
                });
                rewrite.Add(callDtor.ToCILExpression(cil));
            }
            var callFree = new AstCall(SourceInfo, new AstIdent(SourceInfo, "free"), new List <AstExpression> {
                Expression
            });

            rewrite.Add(callFree.ToCILExpression(cil));
            return(new CILRewriteExpression(SourceInfo, rewrite));
        }
Пример #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));
        }