1 {-# LANGUAGE OverloadedStrings #-}
7 import Control.Monad.State
11 import Mate.BasicBlocks
18 import qualified Data.ByteString.Lazy as B
20 printG' :: Ord k => G k -> [k]
21 printG' g = evalState (foldGM ((: []), (++)) (\node -> let (Just v) = value node in v) [] g) S.empty
23 value (Node val _ _) = Just val
24 value (Leaf val ) = Just val
28 main = do con@(Just (ins,cls)) <- getMethodIO "../tests/AbsurdlyHuge.class" "absurdlyHuge"
30 let method = "absurdlyHuge"
31 let msig = methodSignature $ (classMethods cls) !! 1
32 --B.putStrLn (method `B.append` ": " `B.append` (encode msig))
33 let result = testCFG $ lookupMethod method cls
36 let tagged = getInstructions ins
37 let backRefs = splitBlocksBackRef tagged
38 let splitted = splitBlocks backRefs tagged
39 let transitions = getTransitions splitted
40 let nodes = getNodes splitted
45 let (Just finalCyclicStructure) = indirectCFGToG splitted
47 print $ printG' finalCyclicStructure
48 forM_ [0..100] (\x -> do perform)