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)); }
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)); }