コード例 #1
0
        public override ISet <string> GetKill(BasicBlock block)
        {
            //Kill = Def
            DefUseBlockCalculator DefUseCalc = new DefUseBlockCalculator();

            return(DefUseCalc.GetDefUseSetsByBlock(block).Item1);
        }
コード例 #2
0
        public override ISet <string> GetGen(BasicBlock block)
        {
            //Gen == Use
            DefUseBlockCalculator DefUseCalc = new DefUseBlockCalculator();

            return(DefUseCalc.GetDefUseSetsByBlock(block).Item2);
        }
コード例 #3
0
        public void TestDefUse()
        {
            string programText = @"
                                a = 4;
                                b = 4;
                                c = a + b;
                                if 1 
                                    a = 3;
                                else
                                    b = 2;
                                print(c);
                                ";

            SyntaxNode      root             = ParserWrap.Parse(programText);
            var             threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
            BasicBlocksList basicBlocks      = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);

            DefUseBlockCalculator defUse = new DefUseBlockCalculator();

            var defUseList = new List <KeyValuePair <int, Tuple <ISet <string>, ISet <string> > > >();

            foreach (var block in basicBlocks)
            {
                defUseList.Add(new KeyValuePair <int, Tuple <ISet <string>, ISet <string> > >(block.BlockId, defUse.GetDefUseSetsByBlock(block)));
            }

            Assert.IsTrue(defUseList[0].Value.Item1
                          .SetEquals(
                              new HashSet <string>(new string[]
            {
                "a",
                "t0",
                "b",
                "c"
            })));
            Assert.IsTrue(defUseList[0].Value.Item2.Count == 0);

            Assert.IsTrue(defUseList[1].Value.Item1
                          .SetEquals(
                              new HashSet <string>(new string[]
            {
                "a"
            })));
            Assert.IsTrue(defUseList[1].Value.Item2.Count == 0);

            Assert.IsTrue(defUseList[2].Value.Item1
                          .SetEquals(
                              new HashSet <string>(new string[]
            {
                "b"
            })));
            Assert.IsTrue(defUseList[2].Value.Item2.Count == 0);

            Assert.IsTrue(defUseList[3].Value.Item2
                          .SetEquals(
                              new HashSet <string>(new string[]
            {
                "c"
            })));
            Assert.IsTrue(defUseList[3].Value.Item1.Count == 0);
        }