Example #1
0
        private BoogieAssumeCmd GenerateDynamicTypeAssumes(ContractDefinition contract)
        {
            BoogieExpr assumeLhs = new BoogieMapSelect(new BoogieIdentifierExpr("DType"), new BoogieIdentifierExpr("this"));

            List <ContractDefinition> subtypes = new List <ContractDefinition>(context.GetSubTypesOfContract(contract));

            Debug.Assert(subtypes.Count > 0);

            BoogieExpr assumeExpr0 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs,
                                                               new BoogieIdentifierExpr(subtypes[0].Name));
            var assumeExpr = assumeExpr0;

            for (int i = 1; i < subtypes.Count; ++i)
            {
                BoogieExpr rhs = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs,
                                                           new BoogieIdentifierExpr(subtypes[i].Name));
                assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, assumeExpr, rhs);
            }

            if (context.TranslateFlags.OmitAssumeFalseForDynDispatch)
            {
                return(new BoogieAssumeCmd(new BoogieLiteralExpr(true))); //assumeExpr0);
            }
            return(new BoogieAssumeCmd(assumeExpr));
        }
Example #2
0
        private BoogieAssumeCmd GenerateDynamicTypeAssumes(ContractDefinition contract)
        {
            BoogieExpr assumeLhs = new BoogieMapSelect(new BoogieIdentifierExpr("DType"), new BoogieIdentifierExpr("this"));

            List <ContractDefinition> subtypes = new List <ContractDefinition>(context.GetSubTypesOfContract(contract));

            Debug.Assert(subtypes.Count > 0);

            BoogieExpr assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs,
                                                              new BoogieIdentifierExpr(subtypes[0].Name));

            for (int i = 1; i < subtypes.Count; ++i)
            {
                BoogieExpr rhs = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs,
                                                           new BoogieIdentifierExpr(subtypes[i].Name));
                assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, assumeExpr, rhs);
            }

            return(new BoogieAssumeCmd(assumeExpr));
        }